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

Compare commits

...

42 Commits

Author SHA1 Message Date
Rolf Ahrenberg
60386835dd Updated for vdr-1.7.12. 2010-02-01 13:48:28 +02:00
Rolf Ahrenberg
38f4d3d9b8 Added Lithuanian translation (Thanks to Valdemaras Pipiras). 2009-12-14 16:47:16 +02:00
Rolf Ahrenberg
078f0552fc Fixed a typo. 2009-11-25 16:03:41 +02:00
Rolf Ahrenberg
1fd7c90c3b Updated Estonian translation (Thanks to Arthur Konovalov).
Updated version number.
2009-11-23 15:11:37 +02:00
Rolf Ahrenberg
44fa48c59f Added debug() and error() macros. 2009-10-01 12:13:35 +03:00
Rolf Ahrenberg
554dac9674 Increased video buffer size, added buffer timeouts and fixed deleting AC3 buffer data. 2009-09-29 15:31:32 +03:00
Rolf Ahrenberg
8267abcc3b Revert "Changed cRingBufferLinear to cRingBufferFrame."
This reverts commit edb8b4090a.
2009-09-27 16:59:42 +03:00
Rolf Ahrenberg
ea4561a874 Silenced a compilation warning. 2009-09-26 12:15:26 +03:00
Rolf Ahrenberg
56b9b89204 Cleaned up translations and warnings. 2009-09-26 11:54:31 +03:00
Rolf Ahrenberg
3d994be0b7 Cosmetics. 2009-09-25 22:31:12 +03:00
Rolf Ahrenberg
b7d44e730e Added Chinese translation (Thanks to NanFeng). 2009-09-24 17:28:02 +03:00
Rolf Ahrenberg
edb8b4090a Changed cRingBufferLinear to cRingBufferFrame. 2009-09-22 20:37:15 +03:00
Rolf Ahrenberg
21d9c20beb Removed bitstream parsing from Receive() method.
Refactored the error logging from unimplemented ioctl functions.
2009-09-22 08:44:30 +03:00
Rolf Ahrenberg
080f390a75 Remove compilation warnings. 2009-09-16 12:05:15 +03:00
Rolf Ahrenberg
fefb7f0fde Removed error logging from unimplemented ioctl functions. 2009-09-16 09:37:51 +03:00
Rolf Ahrenberg
ba133f15f8 Changed H.264 parser to show display aspect ratio. 2009-09-15 10:57:53 +03:00
Rolf Ahrenberg
4e87693de6 Tweaked symbols. 2009-09-05 01:22:27 +03:00
Rolf Ahrenberg
8ea980a60f Fixed symbols. 2009-09-05 01:05:17 +03:00
Rolf Ahrenberg
5635c2dc52 Fixed debug print output. 2009-09-04 10:47:19 +03:00
Rolf Ahrenberg
7551788969 Changed bitrate to bit/s instead of Mbit/s. 2009-09-04 08:44:33 +03:00
Rolf Ahrenberg
6b6169d5f3 Disabled temporarily SEI in H.264 bitstream parser. 2009-09-03 18:24:51 +03:00
Rolf Ahrenberg
22644e6ae4 Header cleanup. 2009-09-03 18:20:31 +03:00
Rolf Ahrenberg
3fc73af3d5 Added non-strict limits for 1080/720/576/480 format symbols. 2009-09-03 18:15:04 +03:00
Rolf Ahrenberg
c07abc7ed5 Added 1080/720/576/480 symbols into status window. 2009-09-02 15:58:30 +03:00
Rolf Ahrenberg
e57b36a151 Fixed H.264 bitstream parser.
Added a mutex to receiver class.
2009-09-01 15:30:48 +03:00
Rolf Ahrenberg
453ca7a2a5 Fixed H.264 bitstream parsing. 2009-08-31 19:12:15 +03:00
Rolf Ahrenberg
daf823435b Changed to use VDR's core translations. 2009-08-29 21:01:20 +03:00
Rolf Ahrenberg
53b42a2d4a Fixed H.264 parser. 2009-08-28 20:54:34 +03:00
Rolf Ahrenberg
167da08ab3 Silenced compiler warnings. 2009-08-26 22:44:49 +03:00
Rolf Ahrenberg
61ff96556e Fixed bitstream parser for H.264. 2009-08-26 16:24:49 +03:00
Rolf Ahrenberg
a06ae6f6ff Added PES assembler. 2009-08-25 20:22:06 +03:00
Rolf Ahrenberg
2e6a236a56 Removed OSD offset and height options. 2009-07-08 23:14:19 +03:00
Rolf Ahrenberg
6086c135c7 Added missing MINFONTSIZE and MAXFONTSIZE defines. 2009-06-18 23:08:25 +03:00
Rolf Ahrenberg
db9735b80b Cleaned up compilation warnings. 2009-06-18 17:38:27 +03:00
Rolf Ahrenberg
84878bd1b9 Cleaned up compilation warnings. 2009-06-18 17:35:35 +03:00
Rolf Ahrenberg
afd72642e9 Fixed font handling to be thread-safe. 2009-06-18 12:16:11 +03:00
Rolf Ahrenberg
0a162a9a8c Cleaned up compilation warnings. 2009-03-24 12:51:51 +02:00
Rolf Ahrenberg
2e2aacd573 Fixed end of sequence NAL unit. 2009-02-11 14:51:55 +02:00
Rolf Ahrenberg
4e8fdaf99f Fixed closing of frontend file handles. 2009-01-06 23:10:02 +02:00
Rolf Ahrenberg
eb2da4721c Added whitespace cleanups. 2008-12-16 12:51:59 +02:00
Rolf Ahrenberg
5cf9b4af0b Updated for vdr-1.7.2.
Removed the "Show CA system" setup option.
2008-12-16 12:26:46 +02:00
Rolf Ahrenberg
83556bf2d3 Added whitespace cleanups.
Changed info window to use the channel source instead of the frontend type.
2008-12-13 22:25:26 +02:00
39 changed files with 3317 additions and 1613 deletions

91
HISTORY
View File

@@ -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
@@ -317,6 +325,67 @@ VDR Plugin 'femon' Revision History
- 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".
- 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).
- 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.
2009-08-29: Version 1.7.3
- Removed OSD offset and height options.
- Added PES assembler.
- Added bitstream parsers for all codecs.
2009-09-04: Version 1.7.4
- Fixed H.264 bitstream parser.
- Added a mutex to receiver class.
- Added 1080/720/576/480 format symbols into status window.
2009-10-01: Version 1.7.5
- Changed H.264 parser to show display aspect ratio.
- Removed error logging from unimplemented ioctl functions.
- Removed bitstream parsing from Receive() method.
- Added Chinese translation (Thanks to NanFeng).
2010-02-01: Version 1.7.6
- Updated for vdr-1.7.12.
- Updated Estonian translation (Thanks to Arthur Konovalov).
- Added Lithuanian translation (Thanks to Valdemaras Pipiras).

View File

@@ -23,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:

10
README
View File

@@ -26,10 +26,7 @@ transponder and stream information are also available in advanced display modes.
The plugin is based on a neat console frontend status monitor application
called 'femon' by Johannes Stezenbach (see DVB-apps/szap/femon.c for further
information). The bitrate calculation trick originates from the 'dvbstream'
application by Dave Chapman and the stream information routines are taken from
the 'libdvb' library by Metzler Brothers. The H.264 parsing routines are taken
from vdr-xineliboutput plugin by Petri Hintukainen.
information).
Terminology:
@@ -110,9 +107,8 @@ Notes:
specifications those values cannot be calculated into any real units.
- 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
modifying VDR's setup.conf: femon.OSDHeight = 420
small. Please, try to adjust the variable on the OSD setup page before
writing any bug reports.
- 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

31
femon.c
View File

@@ -14,11 +14,11 @@
#include "femonservice.h"
#include "femontools.h"
#if defined(APIVERSNUM) && APIVERSNUM < 10600
#error "VDR-1.6.0 API version or greater is required!"
#if defined(APIVERSNUM) && APIVERSNUM < 10712
#error "VDR-1.7.12 API version or greater is required!"
#endif
static const char VERSION[] = "1.6.4";
static const char VERSION[] = "1.7.6";
static const char DESCRIPTION[] = trNOOP("DVB Signal Information Monitor (OSD)");
static const char MAINMENUENTRY[] = trNOOP("Signal Information");
@@ -50,13 +50,13 @@ cPluginFemon::cPluginFemon()
// Initialize any member variables here.
// DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
// VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
Dprintf("%s()\n", __PRETTY_FUNCTION__);
debug("%s()\n", __PRETTY_FUNCTION__);
}
cPluginFemon::~cPluginFemon()
{
// Clean up after yourself!
Dprintf("%s()\n", __PRETTY_FUNCTION__);
debug("%s()\n", __PRETTY_FUNCTION__);
}
const char *cPluginFemon::CommandLineHelp(void)
@@ -96,7 +96,7 @@ void cPluginFemon::Housekeeping(void)
cOsdObject *cPluginFemon::MainMenuAction(void)
{
// Perform the action when selected from the main VDR menu.
Dprintf("%s()\n", __PRETTY_FUNCTION__);
debug("%s()\n", __PRETTY_FUNCTION__);
if (cReplayControl::NowReplaying() || (Channels.Count() <= 0))
Skins.Message(mtInfo, tr("Femon not available"));
else
@@ -110,11 +110,8 @@ bool cPluginFemon::SetupParse(const char *Name, const char *Value)
if (!strcasecmp(Name, "HideMenu")) femonConfig.hidemenu = 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);
@@ -277,7 +274,7 @@ public:
cMenuFemonSetup::cMenuFemonSetup(void)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
debug("%s()\n", __PRETTY_FUNCTION__);
dispmodes[eFemonModeBasic] = tr("basic");
dispmodes[eFemonModeTransponder] = tr("transponder");
dispmodes[eFemonModeStream] = tr("stream");
@@ -322,15 +319,6 @@ void cMenuFemonSetup::Setup(void)
Add(new cMenuEditBoolItem(tr("Position"), &data.position, trVDR("bottom"), trVDR("top")));
help.Append(tr("Define the position of OSD."));
Add(new cMenuEditIntItem(trVDR("Setup.OSD$Height"), &data.osdheight, 400, 500));
help.Append(tr("Define the height of OSD."));
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."));
@@ -365,16 +353,13 @@ void cMenuFemonSetup::Setup(void)
void cMenuFemonSetup::Store(void)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
debug("%s()\n", __PRETTY_FUNCTION__);
femonConfig = data;
SetupStore("HideMenu", femonConfig.hidemenu);
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);

View File

@@ -10,15 +10,25 @@
#define IS_HEAAC_AUDIO(buf) (((buf)[0] == 0xFF) && (((buf)[1] & 0xF6) == 0xF0))
static unsigned int samplerates[16] =
unsigned int cFemonAAC::s_Samplerates[16] =
{
96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, -1, -1, -1, -1
};
bool getAACAudioInfo(uint8_t *buf, int len, audio_info_t *info)
cFemonAAC::cFemonAAC(cFemonAudioIf *audiohandler)
: m_AudioHandler(audiohandler)
{
// HE-AAC audio detection, search for syncword with layer set to 0
if ((len < 4) || !IS_HEAAC_AUDIO(buf))
}
cFemonAAC::~cFemonAAC()
{
}
bool cFemonAAC::processAudio(const uint8_t *buf, int len)
{
cBitStream bs(buf, len * 8);
if (!m_AudioHandler)
return false;
/* ADTS Fixed Header:
@@ -35,41 +45,59 @@ bool getAACAudioInfo(uint8_t *buf, int len, audio_info_t *info)
* emphasis 2b only if ID == 0 (ie MPEG-4)
*/
int sampling_frequency_index = (buf[2] & 0x03C) >> 2;
int channel_configuration = ((buf[2] & 0x01) << 2) | ((buf[3] & 0xC0) >> 6);
// skip PES header
if (!PesLongEnough(len))
return false;
bs.skipBits(8 * PesPayloadOffset(buf));
info->codec = AUDIO_CODEC_HEAAC;
info->bitrate = AUDIO_BITRATE_RESERVED;
// HE-AAC audio detection
if (bs.getBits(12) != 0xFFF) // syncword
return false;
bs.skipBit(); // id
// layer must be 0
if (bs.getBits(2)) // layer
return false;
bs.skipBit(); // protection_absent
bs.skipBits(2); // profile
int sampling_frequency_index = bs.getBits(4); // sampling_frequency_index
bs.skipBit(); // private pid
int channel_configuration = bs.getBits(3); // channel_configuration
m_AudioHandler->SetAudioCodec(AUDIO_CODEC_HEAAC);
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_RESERVED);
switch (channel_configuration) {
case 0:
info->channelMode = AUDIO_CHANNEL_MODE_STEREO;
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_STEREO);
break;
case 1:
info->channelMode = AUDIO_CHANNEL_MODE_JOINT_STEREO;
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_JOINT_STEREO);
break;
case 2:
info->channelMode = AUDIO_CHANNEL_MODE_DUAL;
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_DUAL);
break;
case 3:
info->channelMode = AUDIO_CHANNEL_MODE_SINGLE;
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_SINGLE);
break;
default:
info->channelMode = AUDIO_CHANNEL_MODE_INVALID;
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_INVALID);
break;
}
switch (sampling_frequency_index) {
case 0xC ... 0xF:
info->samplingFrequency = AUDIO_SAMPLING_FREQUENCY_RESERVED;
m_AudioHandler->SetAudioSamplingFrequency(AUDIO_SAMPLING_FREQUENCY_RESERVED);
break;
default:
info->samplingFrequency = samplerates[sampling_frequency_index];
m_AudioHandler->SetAudioSamplingFrequency(s_Samplerates[sampling_frequency_index]);
break;
}

View File

@@ -10,6 +10,17 @@
#include "femonaudio.h"
bool getAACAudioInfo(uint8_t *buf, int len, audio_info_t *info);
class cFemonAAC {
private:
cFemonAudioIf *m_AudioHandler;
static unsigned int s_Samplerates[16];
public:
cFemonAAC(cFemonAudioIf *audiohandler);
virtual ~cFemonAAC();
bool processAudio(const uint8_t *buf, int len);
};
#endif //__FEMONAAC_H

View File

@@ -9,107 +9,85 @@
#include "femontools.h"
#include "femonac3.h"
#define IS_AC3_DATA(buf) (((buf)[0] == 0x0b) && ((buf)[1] == 0x77))
static unsigned int ac3_bitrates[32] =
unsigned int cFemonAC3::s_Bitrates[32] =
{
32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 576, 640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
static unsigned int ac3_freq[4] =
unsigned int cFemonAC3::s_Frequencies[4] =
{
480, 441, 320, 0
};
//static unsigned int ac3_frames[3][32] =
//{
// {64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 640, 768, 896, 1024, 1152, 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
// {69, 87, 104, 121, 139, 174, 208, 243, 278, 348, 417, 487, 557, 696, 835, 975, 1114, 1253, 1393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
// {96, 120, 144, 168, 192, 240, 288, 336, 384, 480, 576, 672, 768, 960, 1152, 1344, 1536, 1728, 1920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
//};
bool getAC3AudioInfo(uint8_t *buf, int len, ac3_info_t *info)
unsigned int cFemonAC3::s_Frames[3][32] =
{
if (!IS_AC3_DATA(buf) || (len < 8))
{64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 640, 768, 896, 1024, 1152, 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{69, 87, 104, 121, 139, 174, 208, 243, 278, 348, 417, 487, 557, 696, 835, 975, 1114, 1253, 1393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{96, 120, 144, 168, 192, 240, 288, 336, 384, 480, 576, 672, 768, 960, 1152, 1344, 1536, 1728, 1920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
cFemonAC3::cFemonAC3(cFemonAC3If *audiohandler)
: m_AudioHandler(audiohandler)
{
}
cFemonAC3::~cFemonAC3()
{
}
bool cFemonAC3::processAudio(const uint8_t *buf, int len)
{
int fscod, frmsizcod, bsmod, acmod;
int centermixlevel = AUDIO_CENTER_MIX_LEVEL_INVALID;
int surroundmixlevel = AUDIO_SURROUND_MIX_LEVEL_INVALID;
int dolbysurroundmode = AUDIO_DOLBY_SURROUND_MODE_INVALID;
cBitStream bs(buf, len * 8);
if (!m_AudioHandler)
return false;
uint8_t *data = buf + 2;
uint8_t frame = (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];
//if ((frame & 1) && (fr == 1))
// sz++;
//sz <<= 1;
info->samplingFrequency = 100 * ac3_freq[fr];
info->bitstreamMode = (data[3] & 7);
int acm = (data[4] & 0xE0) >> 5;
info->audioCodingMode = acm;
if ((acm & 0x01) && (acm != 0x01)) {
// 3 front channels
info->centerMixLevel = (data[4] & 0x18) >> 3;
if (acm & 0x04) {
// a surround channel exists
info->surroundMixLevel = (data[4] & 0x06) >> 1;
if (acm == 0x02) {
// if in 2/0 mode
info->dolbySurroundMode = ((data[4] & 0x01) << 1) | ((data[5] & 0x80) >> 7);
info->lfe = (data[5] & 0x40) >> 6;
info->dialogLevel = (data[5] & 0x3e) >> 1;
}
else {
info->dolbySurroundMode = AUDIO_DOLBY_SURROUND_MODE_INVALID;
info->lfe = (data[4] & 0x01);
info->dialogLevel = (data[5] & 0xF8) >> 3;
}
}
else {
info->surroundMixLevel = AUDIO_SURROUND_MIX_LEVEL_INVALID;
if (acm == 0x02) {
// if in 2/0 mode
info->dolbySurroundMode = (data[4] & 0x06) >> 1;
info->lfe = (data[4] & 0x01);
info->dialogLevel = (data[5] & 0xF8) >> 3;
}
else {
info->dolbySurroundMode = AUDIO_DOLBY_SURROUND_MODE_INVALID;
info->lfe = (data[4] & 0x04) >> 2;
info->dialogLevel = (data[4] & 0x03) << 3 | ((data[5] & 0xE0) >> 5);
}
}
}
else {
info->centerMixLevel = AUDIO_CENTER_MIX_LEVEL_INVALID;
if (acm & 0x04) {
// a surround channel exists
info->surroundMixLevel = (data[4] & 0x18) >> 3;
if (acm == 0x02) {
// if in 2/0 mode
info->dolbySurroundMode = (data[4] & 0x06) >> 1;
info->lfe = (data[4] & 0x01);
info->dialogLevel = (data[5] & 0xF8) >> 3;
}
else {
info->dolbySurroundMode = AUDIO_DOLBY_SURROUND_MODE_INVALID;
info->lfe = (data[4] & 0x04) >> 2;
info->dialogLevel = (data[4] & 0x03) << 3 | ((data[5] & 0xE0) >> 5);
}
}
else {
info->surroundMixLevel = AUDIO_SURROUND_MIX_LEVEL_INVALID;
if (acm == 0x02) {
// if in 2/0 mode
info->dolbySurroundMode = (data[4] & 0x18) >> 3;
info->lfe = (data[4] & 0x04) >> 2;
info->dialogLevel = (data[4] & 0x03) << 3 | ((data[5] & 0xE0) >> 5);
}
else {
info->dolbySurroundMode = AUDIO_DOLBY_SURROUND_MODE_INVALID;
info->lfe = (data[4] & 0x10) >> 4;
info->dialogLevel = ((data[4] & 0x0F) << 1) | ((data[5] & 0x80) >> 7);
}
}
}
// skip PES header
if (!PesLongEnough(len))
return false;
bs.skipBits(8 * PesPayloadOffset(buf));
// http://rmworkshop.com/dvd_info/related_info/ac3hdr.htm
// AC3 audio detection
if (bs.getU16() != 0x0B77) // syncword
return false;
bs.skipBits(16); // CRC1
fscod = bs.getBits(2); // sampling rate values
frmsizcod = bs.getBits(6); // frame size code
bs.skipBits(5); // bitstream id
bsmod = bs.getBits(3); // bitstream mode
acmod = bs.getBits(3); // audio coding mode
// 3 front channels
if ((acmod & 0x01) && (acmod != 0x01))
centermixlevel = bs.getBits(2);
// if a surround channel exists
if (acmod & 0x04)
surroundmixlevel = bs.getBits(2);
// if in 2/0 mode
if (acmod == 0x02)
dolbysurroundmode = bs.getBits(2);
m_AudioHandler->SetAC3Bitrate(1000 * s_Bitrates[frmsizcod >> 1]);
m_AudioHandler->SetAC3SamplingFrequency(100 * s_Frequencies[fscod]);
m_AudioHandler->SetAC3Bitstream(bsmod);
m_AudioHandler->SetAC3AudioCoding(acmod);
m_AudioHandler->SetAC3CenterMix(centermixlevel);
m_AudioHandler->SetAC3SurroundMix(surroundmixlevel);
m_AudioHandler->SetAC3DolbySurround(dolbysurroundmode);
m_AudioHandler->SetAC3LFE(bs.getBit()); // low frequency effects on
m_AudioHandler->SetAC3Dialog(bs.getBits(5)); // dialog normalization
return true;
}

View File

@@ -10,6 +10,19 @@
#include "femonaudio.h"
bool getAC3AudioInfo(uint8_t *buf, int len, ac3_info_t *info);
class cFemonAC3 {
private:
cFemonAC3If *m_AudioHandler;
static unsigned int s_Bitrates[32];
static unsigned int s_Frequencies[4];
static unsigned int s_Frames[3][32];
public:
cFemonAC3(cFemonAC3If *audiohandler);
virtual ~cFemonAC3();
bool processAudio(const uint8_t *buf, int len);
};
#endif //__FEMONAC3_H

View File

@@ -89,7 +89,7 @@ enum eAudioCodingMode {
typedef struct audio_info {
eAudioCodec codec; // enum
double bitrate; // kbit/s or eAudioBitrate
double bitrate; // bit/s or eAudioBitrate
int samplingFrequency; // Hz or eAudioSamplingFrequency
int channelMode; // eAudioChannelMode
} audio_info_t;
@@ -106,4 +106,44 @@ typedef struct ac3_info {
bool lfe; // boolean
} ac3_info_t;
class cFemonAudioIf {
public:
cFemonAudioIf() {}
virtual ~cFemonAudioIf() {}
// enum
virtual void SetAudioCodec(eAudioCodec codec) = 0;
// kbit/s or eAudioBitrate
virtual void SetAudioBitrate(double bitrate) = 0;
// Hz or eAudioSamplingFrequency
virtual void SetAudioSamplingFrequency(int sampling) = 0;
// eAudioChannelMode
virtual void SetAudioChannel(eAudioChannelMode mode) = 0;
};
class cFemonAC3If {
public:
cFemonAC3If() {}
virtual ~cFemonAC3If() {}
// bit/s or eAudioBitrate
virtual void SetAC3Bitrate(int bitrate) = 0;
// Hz or eAudioSamplingFrequency
virtual void SetAC3SamplingFrequency(int sampling) = 0;
// 0..7 or eAudioBitstreamMode
virtual void SetAC3Bitstream(int mode) = 0;
// 0..7 or eAudioCodingMode
virtual void SetAC3AudioCoding(int mode) = 0;
// eAudioDolbySurroundMode
virtual void SetAC3DolbySurround(int mode) = 0;
// eAudioCenterMixLevel
virtual void SetAC3CenterMix(int level) = 0;
// eAudioSurroundMixLevel
virtual void SetAC3SurroundMix(int level) = 0;
// -dB
virtual void SetAC3Dialog(int level) = 0;
// boolean
virtual void SetAC3LFE(bool onoff) = 0;
};
#endif //__FEMONAUDIO_H

View File

@@ -22,9 +22,6 @@ cFemonConfig::cFemonConfig(void)
updateinterval = 5;
analyzestream = 1;
calcinterval = 20;
showcasystem = 0;
osdheight = 480;
osdoffset = 0;
usesvdrp = 0;
svdrpport = 2001;
strncpy(svdrpip, "0.0.0.0", sizeof(svdrpip));

View File

@@ -33,9 +33,6 @@ public:
int updateinterval;
int analyzestream;
int calcinterval;
int showcasystem;
int osdheight;
int osdoffset;
int usesvdrp;
int svdrpport;
char svdrpip[MaxSvdrpIp + 1]; // must end with additional null

File diff suppressed because it is too large Load Diff

View File

@@ -10,6 +10,55 @@
#include "femonvideo.h"
bool getH264VideoInfo(uint8_t *buf, int len, video_info_t *info);
class cFemonH264 {
private:
enum {
NAL_SEI = 0x06, // Supplemental Enhancement Information
NAL_SPS = 0x07, // Sequence Parameter Set
NAL_AUD = 0x09, // Access Unit Delimiter
NAL_END_SEQ = 0x0A // End of Sequence
};
typedef struct DAR {
eVideoAspectRatio dar;
int ratio;
} t_DAR;
typedef struct SAR {
int w;
int h;
} t_SAR;
cFemonVideoIf *m_VideoHandler;
uint32_t m_Width;
uint32_t m_Height;
eVideoAspectRatio m_AspectRatio;
eVideoFormat m_Format;
double m_FrameRate;
double m_BitRate;
eVideoScan m_Scan;
bool m_CpbDpbDelaysPresentFlag;
bool m_PicStructPresentFlag;
bool m_FrameMbsOnlyFlag;
bool m_MbAdaptiveFrameFieldFlag;
uint32_t m_TimeOffsetLength;
void reset();
const uint8_t *nextStartCode(const uint8_t *start, const uint8_t *end);
int nalUnescape(uint8_t *dst, const uint8_t *src, int len);
int parseSPS(const uint8_t *buf, int len);
int parseSEI(const uint8_t *buf, int len);
static const t_SAR s_SAR[];
static const t_DAR s_DAR[];
static const eVideoFormat s_VideoFormats[];
static const uint8_t s_SeiNumClockTsTable[9];
public:
cFemonH264(cFemonVideoIf *videohandler);
virtual ~cFemonH264();
bool processVideo(const uint8_t *buf, int len);
};
#endif //__FEMONH264_H

View File

@@ -8,10 +8,9 @@
#include "femontools.h"
#include "femonmpeg.h"
#define IS_MPEG_AUDIO(buf) (((buf)[0] == 0xFF) && ((buf)[1] & 0xF0))
#define IS_SEQUENCE_HEADER(buf) (((buf)[0] == 0x00) && ((buf)[1] == 0x00) && ((buf)[2] == 0x01) && ((buf)[3] == 0xB3))
#define IS_EXTENSION_START(buf) (((buf)[0] == 0x00) && ((buf)[1] == 0x00) && ((buf)[2] == 0x01) && ((buf)[3] == 0xB5))
static unsigned int bitrates[2][3][16] =
unsigned int cFemonMPEG::s_Bitrates[2][3][16] =
{
{
{0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, -1}, // MPEG-2 Layer I
@@ -25,160 +24,263 @@ static unsigned int bitrates[2][3][16] =
}
};
static unsigned int samplerates[2][4] =
unsigned int cFemonMPEG::s_Samplerates[2][4] =
{
{22050, 24000, 16000, -1}, // MPEG-2
{44100, 48000, 32000, -1} // MPEG-1
};
static eAudioCodec formats[2][4] =
eAudioCodec cFemonMPEG::s_Formats[2][4] =
{
{AUDIO_CODEC_MPEG2_I, AUDIO_CODEC_MPEG2_II, AUDIO_CODEC_MPEG2_III, AUDIO_CODEC_UNKNOWN}, // MPEG-2
{AUDIO_CODEC_MPEG1_I, AUDIO_CODEC_MPEG1_II, AUDIO_CODEC_MPEG1_III, AUDIO_CODEC_UNKNOWN} // MPEG-1
};
bool getMPEGAudioInfo(uint8_t *buf, int len, audio_info_t *info)
cFemonMPEG::cFemonMPEG(cFemonVideoIf *videohandler, cFemonAudioIf *audiohandler)
: m_VideoHandler(videohandler),
m_AudioHandler(audiohandler)
{
// MPEG audio detection, search for syncword
if ((len < 4) || !IS_MPEG_AUDIO(buf))
}
cFemonMPEG::~cFemonMPEG()
{
}
bool cFemonMPEG::processAudio(const uint8_t *buf, int len)
{
cBitStream bs(buf, len * 8);
if (!m_AudioHandler)
return false;
int mpegIndex = (buf[1] & 0x08) >> 3; // MPEG-2=0, MPEG-1=1
int layerIndex = 3 - ((buf[1] & 0x06) >> 1); // I=11, II=10, III=01
int bitrateIndex = (buf[2] & 0xF0) >> 4;
int frequency = (buf[2] & 0x0C) >> 2;
int channelMode = (buf[3] & 0xC0) >> 6;
// skip PES header
if (!PesLongEnough(len))
return false;
bs.skipBits(8 * PesPayloadOffset(buf));
info->codec = formats[mpegIndex][layerIndex];
// MPEG audio detection
if (bs.getBits(12) != 0xFFF) // syncword
return false;
switch (channelMode) {
int id = bs.getBit(); // id: MPEG-2=0, MPEG-1=1
int layer = 3 - bs.getBits(2); // layer: I=11, II=10, III=01
bs.skipBit(); // protection bit
int bit_rate_index = bs.getBits(4); // bitrate index
int sampling_frequency = bs.getBits(2); // sampling frequency
bs.skipBit(); // padding bit
bs.skipBit(); // private pid
int mode = bs.getBits(2); // mode
m_AudioHandler->SetAudioCodec(s_Formats[id][layer]);
switch (mode) {
case 0:
info->channelMode = AUDIO_CHANNEL_MODE_STEREO;
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_STEREO);
break;
case 1:
info->channelMode = AUDIO_CHANNEL_MODE_JOINT_STEREO;
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_JOINT_STEREO);
break;
case 2:
info->channelMode = AUDIO_CHANNEL_MODE_DUAL;
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_DUAL);
break;
case 3:
info->channelMode = AUDIO_CHANNEL_MODE_SINGLE;
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_SINGLE);
break;
default:
info->channelMode = AUDIO_CHANNEL_MODE_INVALID;
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_INVALID);
break;
}
switch (bitrateIndex) {
switch (bit_rate_index) {
case 0:
info->bitrate = AUDIO_BITRATE_FREE;
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_FREE);
break;
case 0xF:
info->bitrate = AUDIO_BITRATE_RESERVED;
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_RESERVED);
break;
default:
info->bitrate = 1000 * bitrates[mpegIndex][layerIndex][bitrateIndex];
m_AudioHandler->SetAudioBitrate(1000 * s_Bitrates[id][layer][bit_rate_index]);
break;
}
switch (frequency) {
switch (sampling_frequency) {
case 3:
info->samplingFrequency = AUDIO_SAMPLING_FREQUENCY_RESERVED;
m_AudioHandler->SetAudioSamplingFrequency(AUDIO_SAMPLING_FREQUENCY_RESERVED);
break;
default:
info->samplingFrequency = samplerates[mpegIndex][frequency];
m_AudioHandler->SetAudioSamplingFrequency(s_Samplerates[id][sampling_frequency]);
break;
}
return true;
}
bool getMPEGVideoInfo(uint8_t *buf, int len, video_info_t *info)
bool cFemonMPEG::processVideo(const uint8_t *buf, int len)
{
// MPEG-2 video detection, search for sequence header
if ((len < 7) || !IS_SEQUENCE_HEADER(buf))
cBitStream bs(buf, len * 8);
if (!m_VideoHandler)
return false;
// Parse header
uint8_t *data = buf + 4;
info->codec = VIDEO_CODEC_MPEG2;
info->width = ((data[1] & 0xF0) >> 4) | (data[0] << 4);
info->height = ((data[1] & 0x0F) << 8) | (data[2]);
switch ((data[3] & 0xF0) >> 4) {
// skip PES header
if (!PesLongEnough(len))
return false;
bs.skipBits(8 * PesPayloadOffset(buf));
// MPEG-2 video detection, search for start code
if (bs.getU32() != 0x000001B3) // sequence header
return false;
int scan = VIDEO_SCAN_UNKNOWN;
int format = VIDEO_FORMAT_UNKNOWN;
int aspect = VIDEO_ASPECT_RATIO_RESERVED;
int horizontal_size = bs.getBits(12); // horizontal size value
int vertical_size = bs.getBits(12); // vertical size value
switch (bs.getBits(4)) { // aspect ratio information
case 1:
info->aspectRatio = VIDEO_ASPECT_RATIO_1_1;
break;
aspect = VIDEO_ASPECT_RATIO_1_1;
break;
case 2:
info->aspectRatio = VIDEO_ASPECT_RATIO_4_3;
break;
aspect = VIDEO_ASPECT_RATIO_4_3;
break;
case 3:
info->aspectRatio = VIDEO_ASPECT_RATIO_16_9;
break;
aspect = VIDEO_ASPECT_RATIO_16_9;
break;
case 4:
info->aspectRatio = VIDEO_ASPECT_RATIO_2_21_1;
break;
aspect = VIDEO_ASPECT_RATIO_2_21_1;
break;
case 5 ... 15:
default:
info->aspectRatio = VIDEO_ASPECT_RATIO_RESERVED;
break;
aspect = VIDEO_ASPECT_RATIO_RESERVED;
break;
}
// Video scan should be read from progressive_sequence field in sequence extension
switch (data[3] & 0x0F) {
double frame_rate = 0;
switch (bs.getBits(4)) { // frame rate code
case 1:
info->frameRate = 24000 / 1001.0;
info->scan = VIDEO_SCAN_PROGRESSIVE;
info->format = VIDEO_FORMAT_UNKNOWN;
break;
frame_rate = 24000 / 1001.0;
format = VIDEO_FORMAT_UNKNOWN;
break;
case 2:
info->frameRate = 24.0;
info->scan = VIDEO_SCAN_PROGRESSIVE;
info->format = VIDEO_FORMAT_UNKNOWN;
break;
frame_rate = 24.0;
format = VIDEO_FORMAT_UNKNOWN;
break;
case 3:
info->frameRate = 25.0;
info->scan = VIDEO_SCAN_UNKNOWN; // interlaced or progressive
info->format = VIDEO_FORMAT_PAL;
break;
frame_rate = 25.0;
format = VIDEO_FORMAT_PAL;
break;
case 4:
info->frameRate = 30000 / 1001.0;
info->scan = VIDEO_SCAN_UNKNOWN; // interlaced or progressive
info->format = VIDEO_FORMAT_NTSC;
break;
frame_rate = 30000 / 1001.0;
format = VIDEO_FORMAT_NTSC;
break;
case 5:
info->frameRate = 30.0;
info->scan = VIDEO_SCAN_UNKNOWN; // interlaced or progressive
info->format = VIDEO_FORMAT_NTSC;
break;
frame_rate = 30.0;
format = VIDEO_FORMAT_NTSC;
break;
case 6:
info->frameRate = 50.0;
info->scan = VIDEO_SCAN_PROGRESSIVE;
info->format = VIDEO_FORMAT_PAL;
break;
frame_rate = 50.0;
format = VIDEO_FORMAT_PAL;
break;
case 7:
info->frameRate = 60.0;
info->scan = VIDEO_SCAN_PROGRESSIVE;
info->format = VIDEO_FORMAT_NTSC;
break;
frame_rate = 60.0;
format = VIDEO_FORMAT_NTSC;
break;
case 8:
info->frameRate = 60000 / 1001.0;
info->scan = VIDEO_SCAN_PROGRESSIVE;
info->format = VIDEO_FORMAT_NTSC;
break;
frame_rate = 60000 / 1001.0;
format = VIDEO_FORMAT_NTSC;
break;
case 9 ... 15:
default:
info->frameRate = 0;
info->scan = VIDEO_SCAN_UNKNOWN;
info->format = VIDEO_FORMAT_UNKNOWN;
break;
frame_rate = 0;
format = VIDEO_FORMAT_UNKNOWN;
break;
}
info->bitrate = 400.0 * (((data[4] << 10) & 0x0003FC00UL) | ((data[5] << 2) & 0x000003FCUL) | (((data[6] & 0xC0) >> 6) & 0x00000003UL));
int bit_rate = bs.getBits(18); // bit rate value
bs.skipBit(); // marker bit
bs.skipBits(10); // vbv buffer size value
bs.skipBit(); // constrained parameters value
if (bs.getBit()) // load intra quantizer matrix
bs.skipBits(8 * 64); // intra quantizer matrix
if (bs.getBit()) // load non-intra quantizer matrix
bs.skipBits(8 * 64); // non-intra quantizer matrix
if (bs.getU32() != 0x000001B5) { // extension start
bs.skipBits(4); // extension start code identifier
bs.skipBits(8); // profile and level indicator
scan = bs.getBit() ? VIDEO_SCAN_PROGRESSIVE :
VIDEO_SCAN_INTERLACED; // progressive sequence
bs.skipBits(2); // chroma format
horizontal_size |= (bs.getBits(2) << 12); // horizontal size extension
vertical_size |= (bs.getBits(2) << 12); // vertical size extension
bit_rate |= (bs.getBits(12) << 18); // bit rate extension
bs.skipBit(); // marker bit
bs.skipBits(8); // vpv buffer size extension
bs.skipBit(); // low delay
bs.skipBits(2); // frame rate extension n
bs.skipBits(5); // frame rate extension d
if ((bs.getU32() != 0x000001B5) && // extension start code
(bs.getBits(4) == 0x0010)) { // sequence display extension id
switch (bs.getBits(3)) { // video format
case 0x000:
format = VIDEO_FORMAT_COMPONENT;
break;
case 0x001:
format = VIDEO_FORMAT_PAL;
break;
case 0x010:
format = VIDEO_FORMAT_NTSC;
break;
case 0x011:
format = VIDEO_FORMAT_SECAM;
break;
case 0x100:
format = VIDEO_FORMAT_MAC;
break;
case 0x101:
format = VIDEO_FORMAT_UNKNOWN;
break;
case 0x110:
case 0x111:
format = VIDEO_FORMAT_RESERVED;
break;
default:
format = VIDEO_FORMAT_INVALID;
break;
}
}
}
m_VideoHandler->SetVideoCodec(VIDEO_CODEC_MPEG2);
m_VideoHandler->SetVideoSize(horizontal_size, vertical_size);
m_VideoHandler->SetVideoBitrate(400.0 * (double)(bit_rate));
m_VideoHandler->SetVideoFramerate(frame_rate);
m_VideoHandler->SetVideoScan(eVideoScan(scan));
m_VideoHandler->SetVideoAspectRatio(eVideoAspectRatio(aspect));
m_VideoHandler->SetVideoFormat(eVideoFormat(format));
return true;
}

View File

@@ -8,10 +8,24 @@
#ifndef __FEMONMPEG_H
#define __FEMONMPEG_H
#include "femonaudio.h"
#include "femonvideo.h"
#include "femonaudio.h"
bool getMPEGAudioInfo(uint8_t *buf, int len, audio_info_t *info);
bool getMPEGVideoInfo(uint8_t *buf, int len, video_info_t *info);
class cFemonMPEG {
private:
cFemonVideoIf *m_VideoHandler;
cFemonAudioIf *m_AudioHandler;
static unsigned int s_Bitrates[2][3][16];
static unsigned int s_Samplerates[2][4];
static eAudioCodec s_Formats[2][4];
public:
cFemonMPEG(cFemonVideoIf *videohandler, cFemonAudioIf *audiohandler);
virtual ~cFemonMPEG();
bool processVideo(const uint8_t *buf, int len);
bool processAudio(const uint8_t *buf, int len);
};
#endif //__FEMONMPEG_H

View File

@@ -5,7 +5,12 @@
*
*/
#ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#endif
#include <ctype.h>
#include <math.h>
#include "femoncfg.h"
#include "femonreceiver.h"
#include "femontools.h"
@@ -15,19 +20,28 @@
#define CHANNELINPUT_TIMEOUT 1000
#define SVDRPPLUGIN "svdrpservice"
#define OSDHEIGHT femonConfig.osdheight // in pixels
#define OSDWIDTH 600 // in pixels
#define OSDWIDTH m_OsdWidth // in pixels
#define OSDHEIGHT m_OsdHeight // in pixels
#define OSDROWHEIGHT m_Font->Height() // in pixels
#define OSDINFOHEIGHT (OSDROWHEIGHT * 13) // in pixels (13 rows)
#define OSDSTATUSHEIGHT (OSDROWHEIGHT * 6) // in pixels (6 rows)
#define OSDSPACING 5
#define OSDROUNDING 10
#define IS_OSDROUNDING (femonConfig.skin == eFemonSkinElchi)
#define IS_OSDRESOLUTION(r1, r2) (abs(r1 - r2) < 20)
#define OSDINFOWIN_Y(offset) (femonConfig.position ? (OSDHEIGHT - OSDINFOHEIGHT + offset) : offset)
#define OSDINFOWIN_X(col) ((col == 4) ? 455 : (col == 3) ? 305 : (col == 2) ? 155 : 15)
#define OSDINFOWIN_X(col) ((col == 4) ? int(round(OSDWIDTH * 0.76)) : \
(col == 3) ? int(round(OSDWIDTH * 0.51)) : \
(col == 2) ? int(round(OSDWIDTH * 0.26)) : \
int(round(OSDWIDTH * 0.025)))
#define OSDSTATUSWIN_Y(offset) (femonConfig.position ? offset : (OSDHEIGHT - OSDSTATUSHEIGHT + offset))
#define OSDSTATUSWIN_X(col) ((col == 7) ? 475 : (col == 6) ? 410 : (col == 5) ? 275 : (col == 4) ? 220 : (col == 3) ? 125 : (col == 2) ? 70 : 15)
#define OSDSTATUSWIN_X(col) ((col == 7) ? int(round(OSDWIDTH * 0.79)) : \
(col == 6) ? int(round(OSDWIDTH * 0.68)) : \
(col == 5) ? int(round(OSDWIDTH * 0.46)) : \
(col == 4) ? int(round(OSDWIDTH * 0.37)) : \
(col == 3) ? int(round(OSDWIDTH * 0.21)) : \
(col == 2) ? int(round(OSDWIDTH * 0.12)) : \
int(round(OSDWIDTH * 0.025)))
#define OSDSTATUSWIN_XSYMBOL(c,w) (c * ((OSDWIDTH - (5 * w)) / 6) + ((c - 1) * w))
#define OSDBARWIDTH(x) (OSDWIDTH * x / 100)
@@ -53,12 +67,12 @@
#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); \
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); \
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); \
int barvalue = OSDBARWIDTH(value); \
m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset) + 3, min(OSDBARWIDTH(femonConfig.redlimit), barvalue), OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT - 3, femonTheme[femonConfig.theme].clrRed); \
if (barvalue > OSDBARWIDTH(femonConfig.redlimit)) \
m_Osd->DrawRectangle(OSDBARWIDTH(femonConfig.redlimit), OSDSTATUSWIN_Y(offset) + 3, min((OSDWIDTH * femonConfig.greenlimit / 100), barvalue), OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT - 3, femonTheme[femonConfig.theme].clrYellow); \
if (barvalue > OSDBARWIDTH(femonConfig.greenlimit)) \
m_Osd->DrawRectangle(OSDBARWIDTH(femonConfig.greenlimit), OSDSTATUSWIN_Y(offset) + 3, barvalue, OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT - 3, femonTheme[femonConfig.theme].clrGreen); \
}
#define OSDDRAWSTATUSTITLEBAR(title) \
@@ -116,12 +130,28 @@
#define OSDCLEARINFO() \
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)
debug("%s()\n", __PRETTY_FUNCTION__);
if ((pInstance == NULL) && create)
{
pInstance = new cFemonOsd();
}
@@ -140,31 +170,46 @@ cFemonOsd::cFemonOsd()
m_Number(0),
m_OldNumber(0),
m_SNR(0),
m_SNRValid(false),
m_Signal(0),
m_SignalValid(false),
m_BER(0),
m_BERValid(false),
m_UNC(0),
m_UNCValid(false),
m_FrontendStatusValid(false),
m_DisplayMode(femonConfig.displaymode),
m_OsdWidth(cOsd::OsdWidth()),
m_OsdHeight(cOsd::OsdHeight()),
m_InputTime(0),
m_Sleep(),
m_Mutex()
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
int tmp;
debug("%s()\n", __PRETTY_FUNCTION__);
memset(&m_FrontendStatus, 0, sizeof(m_FrontendStatus));
memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo));
m_SvdrpConnection.handle = -1;
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;
error("cFemonOsd::cFemonOsd() cannot create required font.");
}
tmp = 5 * bmSymbol[SYMBOL_LOCK].Width() + 6 * OSDSPACING;
if (OSDWIDTH < tmp) {
error("cFemonOsd::cFemonOsd() OSD width (%d) smaller than required (%d).", OSDWIDTH, tmp);
OSDWIDTH = tmp;
}
tmp = OSDINFOHEIGHT + OSDROWHEIGHT + OSDSTATUSHEIGHT;
if (OSDHEIGHT < tmp) {
error("cFemonOsd::cFemonOsd() OSD height (%d) smaller than required (%d).", OSDHEIGHT, tmp);
OSDHEIGHT = tmp;
}
else
m_Font = cFont::GetFont(fontSml);
if (OSDHEIGHT < (OSDINFOHEIGHT + OSDROWHEIGHT + OSDSTATUSHEIGHT))
OSDHEIGHT = (OSDINFOHEIGHT + OSDROWHEIGHT + OSDSTATUSHEIGHT);
}
cFemonOsd::~cFemonOsd(void)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
debug("%s()\n", __PRETTY_FUNCTION__);
m_Sleep.Signal();
if (Running())
Cancel(3);
@@ -179,6 +224,12 @@ cFemonOsd::~cFemonOsd(void)
}
if (m_Osd)
DELETENULL(m_Osd);
if (m_Font)
DELETENULL(m_Font);
if (m_Frontend >= 0) {
close(m_Frontend);
m_Frontend = -1;
}
pInstance = NULL;
}
@@ -186,8 +237,6 @@ void cFemonOsd::DrawStatusWindow(void)
{
cMutexLock lock(&m_Mutex);
cBitmap *bm = NULL;
int snr = m_SNR / 655;
int signal = m_Signal / 655;
int offset = 0;
int x = OSDWIDTH - OSDROUNDING;
int y = 0;
@@ -208,6 +257,7 @@ void cFemonOsd::DrawStatusWindow(void)
case 5: bm = &bmSymbol[SYMBOL_FIVE]; break;
case 6: bm = &bmSymbol[SYMBOL_SIX]; break;
case 7: bm = &bmSymbol[SYMBOL_SEVEN]; break;
case 8: bm = &bmSymbol[SYMBOL_EIGHT]; break;
default: bm = &bmSymbol[SYMBOL_ZERO]; break;
}
OSDDRAWSTATUSBM(OSDSPACING);
@@ -222,6 +272,7 @@ void cFemonOsd::DrawStatusWindow(void)
case 5: bm = &bmSymbol[SYMBOL_FIVE]; break;
case 6: bm = &bmSymbol[SYMBOL_SIX]; break;
case 7: bm = &bmSymbol[SYMBOL_SEVEN]; break;
case 8: bm = &bmSymbol[SYMBOL_EIGHT]; break;
default: bm = &bmSymbol[SYMBOL_ZERO]; break;
}
OSDDRAWSTATUSBM(OSDSPACING);
@@ -239,6 +290,17 @@ void cFemonOsd::DrawStatusWindow(void)
OSDDRAWSTATUSBM(OSDSPACING);
}
if (m_Receiver) {
if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 1080))
bm = &bmSymbol[SYMBOL_FORMAT_1080];
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 720))
bm = &bmSymbol[SYMBOL_FORMAT_720];
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 576))
bm = &bmSymbol[SYMBOL_FORMAT_576];
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 480))
bm = &bmSymbol[SYMBOL_FORMAT_480];
else
bm = NULL;
OSDDRAWSTATUSBM(OSDSPACING);
switch (m_Receiver->VideoCodec()) {
case VIDEO_CODEC_MPEG2: bm = &bmSymbol[SYMBOL_MPEG2]; break;
case VIDEO_CODEC_H264: bm = &bmSymbol[SYMBOL_H264]; break;
@@ -265,24 +327,30 @@ void cFemonOsd::DrawStatusWindow(void)
OSDDRAWSTATUSBM(OSDSPACING);
}
offset += OSDROWHEIGHT;
OSDDRAWSTATUSBAR(signal);
if (m_SignalValid)
OSDDRAWSTATUSBAR(m_Signal / 655);
offset += OSDROWHEIGHT;
OSDDRAWSTATUSBAR(snr);
if (m_SNRValid)
OSDDRAWSTATUSBAR(m_SNR / 655);
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)));
OSDDRAWSTATUSVALUES("STR:", m_SignalValid ? *cString::sprintf("%04x", m_Signal) : "", m_SignalValid ? *cString::sprintf("(%2d%%)", m_Signal / 655) : "",
"BER:", m_BERValid ? *cString::sprintf("%08x", m_BER) : "", *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),
OSDDRAWSTATUSVALUES("SNR:", m_SNRValid ? *cString::sprintf("%04x", m_SNR) : "", m_SNRValid ? *cString::sprintf("(%2d%%)", m_SNR / 655) : "",
"UNC:", m_UNCValid ? *cString::sprintf("%08x", m_UNC) : "",
*cString::sprintf("%s:", (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) ? tr("AC-3") : tr("Audio")),
*getBitrateKbits(m_Receiver ? ((m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) ? m_Receiver->AC3Bitrate() : m_Receiver->AudioBitrate()) : (m_SvdrpFrontend >= 0 ? m_SvdrpAudioBitrate : -1.0)));
offset += OSDROWHEIGHT;
x = bmSymbol[SYMBOL_LOCK].Width();
y = (OSDROWHEIGHT - bmSymbol[SYMBOL_LOCK].Height()) / 2;
OSDDRAWSTATUSFRONTEND(1, bmSymbol[SYMBOL_LOCK], FE_HAS_LOCK);
OSDDRAWSTATUSFRONTEND(2, bmSymbol[SYMBOL_SIGNAL], FE_HAS_SIGNAL);
OSDDRAWSTATUSFRONTEND(3, bmSymbol[SYMBOL_CARRIER], FE_HAS_CARRIER);
OSDDRAWSTATUSFRONTEND(4, bmSymbol[SYMBOL_VITERBI], FE_HAS_VITERBI);
OSDDRAWSTATUSFRONTEND(5, bmSymbol[SYMBOL_SYNC], FE_HAS_SYNC);
if (m_FrontendStatusValid) {
OSDDRAWSTATUSFRONTEND(1, bmSymbol[SYMBOL_LOCK], FE_HAS_LOCK);
OSDDRAWSTATUSFRONTEND(2, bmSymbol[SYMBOL_SIGNAL], FE_HAS_SIGNAL);
OSDDRAWSTATUSFRONTEND(3, bmSymbol[SYMBOL_CARRIER], FE_HAS_CARRIER);
OSDDRAWSTATUSFRONTEND(4, bmSymbol[SYMBOL_VITERBI], FE_HAS_VITERBI);
OSDDRAWSTATUSFRONTEND(5, bmSymbol[SYMBOL_SYNC], FE_HAS_SYNC);
}
OSDDRAWSTATUSBOTTOMBAR();
m_Osd->Flush();
}
@@ -315,11 +383,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%s #%d - %s", (m_FrontendInfo.caps & 0x10000000) ? "2" : "", (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()));
@@ -329,13 +397,13 @@ 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()));
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()));
@@ -347,8 +415,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()));
@@ -361,9 +429,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:
@@ -421,7 +486,7 @@ void cFemonOsd::DrawInfoWindow(void)
offset += OSDROWHEIGHT;
OSDDRAWINFOINACTIVE(tr("Dolby Surround Mode"), *getAC3DolbySurroundMode(m_Receiver->AC3DolbySurroundMode()));
offset += OSDROWHEIGHT;
OSDDRAWINFOINACTIVE(tr("Low Frequency Effects"), *cString::sprintf("%s", m_Receiver->AC3Lfe() ? tr("on") : tr("off")));
OSDDRAWINFOINACTIVE(tr("Low Frequency Effects"), *cString::sprintf("%s", m_Receiver->AC3Lfe() ? trVDR("on") : trVDR("off")));
offset += OSDROWHEIGHT;
OSDDRAWINFOINACTIVE(tr("Dialogue Normalization"), *getAC3DialogLevel(m_Receiver->AC3DialogLevel()));
}
@@ -438,7 +503,7 @@ void cFemonOsd::DrawInfoWindow(void)
void cFemonOsd::Action(void)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
debug("%s()\n", __PRETTY_FUNCTION__);
cTimeMs t;
SvdrpCommand_v1_0 cmd;
cmd.command = cString::sprintf("PLUG %s INFO\r\n", PLUGIN_NAME_I18N);
@@ -448,41 +513,57 @@ void cFemonOsd::Action(void)
m_SvdrpVideoBitrate = -1.0;
m_SvdrpAudioBitrate = -1.0;
if (m_Frontend != -1) {
CHECK(ioctl(m_Frontend, FE_READ_STATUS, &m_FrontendStatus));
CHECK(ioctl(m_Frontend, FE_READ_SIGNAL_STRENGTH, &m_Signal));
CHECK(ioctl(m_Frontend, FE_READ_SNR, &m_SNR));
CHECK(ioctl(m_Frontend, FE_READ_BER, &m_BER));
CHECK(ioctl(m_Frontend, FE_READ_UNCORRECTED_BLOCKS, &m_UNC));
m_FrontendStatusValid = (ioctl(m_Frontend, FE_READ_STATUS, &m_FrontendStatus) >= 0);
m_SignalValid = (ioctl(m_Frontend, FE_READ_SIGNAL_STRENGTH, &m_Signal) >= 0);
m_SNRValid = (ioctl(m_Frontend, FE_READ_SNR, &m_SNR) >= 0);
m_BERValid = (ioctl(m_Frontend, FE_READ_BER, &m_BER) >= 0);
m_UNCValid = (ioctl(m_Frontend, FE_READ_UNCORRECTED_BLOCKS, &m_UNC) >= 0);
DrawInfoWindow();
DrawStatusWindow();
}
else if (m_SvdrpConnection.handle >= 0) {
cmd.handle = m_SvdrpConnection.handle;
cmd.handle = m_SvdrpConnection.handle;
m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd);
if (cmd.responseCode == 900) {
m_FrontendStatusValid = false;
m_SignalValid = false;
m_SNRValid = false;
m_BERValid = false;
m_UNCValid = false;
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);
m_FrontendStatusValid = true;
}
else if (!strncasecmp(s, "SGNL:", 5)) {
m_Signal = (uint16_t)strtol(s + 5, NULL, 16);
m_SignalValid = true;
}
else if (!strncasecmp(s, "SNRA:", 5)) {
m_SNR = (uint16_t)strtol(s + 5, NULL, 16);
m_SNRValid = true;
}
else if (!strncasecmp(s, "BERA:", 5)) {
m_BER = (uint32_t)strtol(s + 5, NULL, 16);
m_BERValid = true;
}
else if (!strncasecmp(s, "UNCB:", 5)) {
m_UNC = (uint32_t)strtol(s + 5, NULL, 16);
m_UNCValid = true;
}
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();
@@ -493,17 +574,17 @@ void cFemonOsd::Action(void)
void cFemonOsd::Show(void)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
int apid[2] = {0, 0};
int dpid[2] = {0, 0};
debug("%s()\n", __PRETTY_FUNCTION__);
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
cString dev = cString::sprintf(FRONTEND_DEVICE, cDevice::ActualDevice()->CardIndex(), 0);
m_Frontend = open(dev, O_RDONLY | O_NONBLOCK);
if (m_Frontend >= 0) {
if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) {
esyslog("ERROR: cFemonOsd::Show() cannot read frontend info.");
if (!femonConfig.usesvdrp)
error("cFemonOsd::Show() cannot read frontend info.");
close(m_Frontend);
m_Frontend = -1;
memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo));
return;
}
}
@@ -512,11 +593,11 @@ void cFemonOsd::Show(void)
return;
}
else {
esyslog("ERROR: cFemonOsd::Show() cannot open frontend device.");
error("cFemonOsd::Show() cannot open frontend device.");
return;
}
m_Osd = cOsdProvider::NewOsd(((cOsd::OsdWidth() - OSDWIDTH) / 2) + cOsd::OsdLeft() + femonConfig.osdoffset, ((cOsd::OsdHeight() - OSDHEIGHT) / 2) + cOsd::OsdTop());
m_Osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
if (m_Osd) {
tArea Areas1[] = { { 0, 0, OSDWIDTH - 1, OSDHEIGHT - 1, 8 } };
if (Setup.AntiAlias && m_Osd->CanHandleAreas(Areas1, sizeof(Areas1) / sizeof(tArea)) == oeOk) {
@@ -538,9 +619,7 @@ void cFemonOsd::Show(void)
if (femonConfig.analyzestream) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (channel) {
IS_AUDIO_TRACK(track) ? apid[0] = channel->Apid(int(track - ttAudioFirst)) : apid[0] = channel->Apid(0);
IS_DOLBY_TRACK(track) ? dpid[0] = channel->Dpid(int(track - ttDolbyFirst)) : dpid[0] = channel->Dpid(0);
m_Receiver = new cFemonReceiver(channel->GetChannelID(), channel->Ca(), channel->Vpid(), apid, dpid);
m_Receiver = new cFemonReceiver(channel->Vtype(), channel->Vpid(), channel->Apid(IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0), channel->Dpid(IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0));
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
}
@@ -550,9 +629,7 @@ void cFemonOsd::Show(void)
void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
{
Dprintf("%s(%d,%d)\n", __PRETTY_FUNCTION__, device->DeviceNumber(), channelNumber);
int apid[2] = {0, 0};
int dpid[2] = {0, 0};
debug("%s(%d,%d)\n", __PRETTY_FUNCTION__, device->DeviceNumber(), channelNumber);
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
if (!device->IsPrimaryDevice() || !channelNumber || cDevice::PrimaryDevice()->CurrentChannel() != channelNumber)
return;
@@ -561,9 +638,11 @@ void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
m_Frontend = open(dev, O_RDONLY | O_NONBLOCK);
if (m_Frontend >= 0) {
if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) {
esyslog("ERROR: cFemonOsd::ChannelSwitch() cannot read frontend info.");
if (!femonConfig.usesvdrp)
error("cFemonOsd::ChannelSwitch() cannot read frontend info.");
close(m_Frontend);
m_Frontend = -1;
memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo));
return;
}
}
@@ -572,7 +651,7 @@ void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
return;
}
else {
esyslog("ERROR: cFemonOsd::ChannelSwitch() cannot open frontend device.");
error("cFemonOsd::ChannelSwitch() cannot open frontend device.");
return;
}
@@ -583,9 +662,7 @@ void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
if (femonConfig.analyzestream) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (channel) {
IS_AUDIO_TRACK(track) ? apid[0] = channel->Apid(int(track - ttAudioFirst)) : apid[0] = channel->Apid(0);
IS_DOLBY_TRACK(track) ? dpid[0] = channel->Dpid(int(track - ttDolbyFirst)) : dpid[0] = channel->Dpid(0);
m_Receiver = new cFemonReceiver(channel->GetChannelID(), channel->Ca(), channel->Vpid(), apid, dpid);
m_Receiver = new cFemonReceiver(channel->Vtype(), channel->Vpid(), channel->Apid(IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0), channel->Dpid(IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0));
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
}
@@ -593,9 +670,7 @@ void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
void cFemonOsd::SetAudioTrack(int Index, const char * const *Tracks)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
int apid[2] = {0, 0};
int dpid[2] = {0, 0};
debug("%s()\n", __PRETTY_FUNCTION__);
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
if (m_Receiver) {
m_Receiver->Deactivate();
@@ -604,9 +679,7 @@ void cFemonOsd::SetAudioTrack(int Index, const char * const *Tracks)
if (femonConfig.analyzestream) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (channel) {
IS_AUDIO_TRACK(track) ? apid[0] = channel->Apid(int(track - ttAudioFirst)) : apid[0] = channel->Apid(0);
IS_DOLBY_TRACK(track) ? dpid[0] = channel->Dpid(int(track - ttDolbyFirst)) : dpid[0] = channel->Dpid(0);
m_Receiver = new cFemonReceiver(channel->GetChannelID(), channel->Ca(), channel->Vpid(), apid, dpid);
m_Receiver = new cFemonReceiver(channel->Vtype(), channel->Vpid(), channel->Apid(IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0), channel->Dpid(IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0));
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
}
@@ -614,7 +687,7 @@ void cFemonOsd::SetAudioTrack(int Index, const char * const *Tracks)
bool cFemonOsd::DeviceSwitch(int direction)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
debug("%s()\n", __PRETTY_FUNCTION__);
int device = cDevice::ActualDevice()->DeviceNumber();
direction = sgn(direction);
if (device >= 0) {
@@ -630,13 +703,13 @@ bool cFemonOsd::DeviceSwitch(int direction)
device = cDevice::NumDevices() - 1;
}
if (cDevice::GetDevice(device)->ProvidesChannel(channel, 0)) {
Dprintf("%s(%d) device(%d)\n", __PRETTY_FUNCTION__, direction, device);
debug("%s(%d) device(%d)\n", __PRETTY_FUNCTION__, direction, device);
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), 0);
cControl::Shutdown();
cDevice::GetDevice(device)->SwitchChannel(channel, true);
if (cDevice::GetDevice(device) == cDevice::PrimaryDevice())
cDevice::GetDevice(device)->ForceTransferMode();
cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel->GetChannelID(), channel->Vpid(), channel->Apids(), channel->Dpids(), channel->Spids()));
cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel));
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), channel->Number());
return (true);
}
@@ -652,24 +725,24 @@ 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) {
SvdrpCommand_v1_0 cmd;
cmd.handle = m_SvdrpConnection.handle;
cmd.handle = m_SvdrpConnection.handle;
cmd.command = cString::sprintf("PLUG %s\r\n", PLUGIN_NAME_I18N);
m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd);
if (cmd.responseCode != 214) {
m_SvdrpPlugin->Service("SvdrpConnection-v1.0", &m_SvdrpConnection); // close connection
esyslog("ERROR: cFemonOsd::SvdrpConnect() cannot find plugin '%s' on server %s.", PLUGIN_NAME_I18N, *m_SvdrpConnection.serverIp);
error("cFemonOsd::SvdrpConnect() cannot find plugin '%s' on server %s.", PLUGIN_NAME_I18N, *m_SvdrpConnection.serverIp);
}
}
else
esyslog("ERROR: cFemonOsd::SvdrpConnect() cannot connect to SVDRP server.");
error("cFemonOsd::SvdrpConnect() cannot connect to SVDRP server.");
}
else
esyslog("ERROR: cFemonOsd::SvdrpConnect() cannot find plugin '%s'.", SVDRPPLUGIN);
error("cFemonOsd::SvdrpConnect() cannot find plugin '%s'.", SVDRPPLUGIN);
}
return m_SvdrpConnection.handle >= 0;
}
@@ -680,24 +753,24 @@ bool cFemonOsd::SvdrpTune(void)
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (channel) {
SvdrpCommand_v1_0 cmd;
cmd.handle = m_SvdrpConnection.handle;
cmd.handle = m_SvdrpConnection.handle;
cmd.command = cString::sprintf("CHAN %s\r\n", *channel->GetChannelID().ToString());
m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd);
if (cmd.responseCode == 250)
return true;
esyslog("ERROR: cFemonOsd::SvdrpTune() cannot tune server channel.");
error("cFemonOsd::SvdrpTune() cannot tune server channel.");
}
else
esyslog("ERROR: cFemonOsd::SvdrpTune() invalid channel.");
error("cFemonOsd::SvdrpTune() invalid channel.");
}
else
esyslog("ERROR: cFemonOsd::SvdrpTune() unexpected connection state.");
error("cFemonOsd::SvdrpTune() unexpected connection state.");
return false;
}
double cFemonOsd::GetVideoBitrate(void)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
debug("%s()\n", __PRETTY_FUNCTION__);
double value = 0.0;
if (m_Receiver)
@@ -708,7 +781,7 @@ double cFemonOsd::GetVideoBitrate(void)
double cFemonOsd::GetAudioBitrate(void)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
debug("%s()\n", __PRETTY_FUNCTION__);
double value = 0.0;
if (m_Receiver)
@@ -719,7 +792,7 @@ double cFemonOsd::GetAudioBitrate(void)
double cFemonOsd::GetDolbyBitrate(void)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
debug("%s()\n", __PRETTY_FUNCTION__);
double value = 0.0;
if (m_Receiver)
@@ -729,7 +802,7 @@ double cFemonOsd::GetDolbyBitrate(void)
}
eOSState cFemonOsd::ProcessKey(eKeys Key)
{
{
eOSState state = cOsdObject::ProcessKey(Key);
if (state == osUnknown) {
switch (Key) {
@@ -847,6 +920,6 @@ eOSState cFemonOsd::ProcessKey(eKeys Key)
break;
}
state = osContinue;
}
}
return state;
}

View File

@@ -34,16 +34,23 @@ private:
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;
bool m_SNRValid;
uint16_t m_Signal;
bool m_SignalValid;
uint32_t m_BER;
bool m_BERValid;
uint32_t m_UNC;
bool m_UNCValid;
fe_status_t m_FrontendStatus;
bool m_FrontendStatusValid;
dvb_frontend_info m_FrontendInfo;
int m_DisplayMode;
const cFont *m_Font;
int m_OsdWidth;
int m_OsdHeight;
cFont *m_Font;
cTimeMs m_InputTime;
cCondWait m_Sleep;
cMutex m_Mutex;

View File

@@ -8,40 +8,43 @@
#include <unistd.h>
#include "femontools.h"
#include "femoncfg.h"
#include "femonmpeg.h"
#include "femonaac.h"
#include "femonac3.h"
#include "femonh264.h"
#include "femonreceiver.h"
#define TS_SIZE 188
#define PAY_START 0x40
#define ADAPT_FIELD 0x20
#define PAYLOAD 0x10
#define PTS_DTS_FLAGS 0xC0
cFemonReceiver::cFemonReceiver(tChannelID ChannelID, int Ca, int Vpid, int Apid[], int Dpid[])
: cReceiver(ChannelID, -1, Vpid, Apid, Dpid, NULL),
cThread("femon receiver"),
cFemonReceiver::cFemonReceiver(int Vtype, int Vpid, int Apid, int Dpid)
: cThread("femon receiver"),
m_Mutex(),
m_Sleep(),
m_Active(false),
m_DetectH264(this),
m_DetectMPEG(this, this),
m_DetectAAC(this),
m_DetectAC3(this),
m_VideoBuffer(KILOBYTE(512), TS_SIZE, false, "Femon video"),
m_VideoType(Vtype),
m_VideoPid(Vpid),
m_VideoPacketCount(0),
m_VideoBitrate(0.0),
m_VideoValid(false),
m_VideoInfoBufferIndex(0),
m_AudioPid(Apid[0]),
m_AudioBuffer(KILOBYTE(256), TS_SIZE, false, "Femon audio"),
m_AudioPid(Apid),
m_AudioPacketCount(0),
m_AudioBitrate(0.0),
m_AudioValid(false),
m_AudioInfoBufferIndex(0),
m_AC3Pid(Dpid[0]),
m_AC3PacketCount(0),
m_AC3Buffer(KILOBYTE(256), TS_SIZE, false, "Femon AC3"),
m_AC3Pid(Dpid),
m_AC3PacketCount(0),
m_AC3Bitrate(0),
m_AC3Valid(false),
m_AC3InfoBufferIndex(0)
m_AC3Valid(false)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
debug("%s()\n", __PRETTY_FUNCTION__);
AddPid(m_VideoPid);
AddPid(m_AudioPid);
AddPid(m_AC3Pid);
m_VideoBuffer.SetTimeouts(0, 100);
m_AudioBuffer.SetTimeouts(0, 100);
m_AC3Buffer.SetTimeouts(0, 100);
m_VideoInfo.codec = VIDEO_CODEC_INVALID;
m_VideoInfo.format = VIDEO_FORMAT_INVALID;
@@ -51,16 +54,10 @@ cFemonReceiver::cFemonReceiver(tChannelID ChannelID, int Ca, int Vpid, int Apid[
m_VideoInfo.height = 0;
m_VideoInfo.frameRate = 0;
m_VideoInfo.bitrate = AUDIO_BITRATE_INVALID;
for (unsigned int i = 0; i < ELEMENTS(m_VideoInfoBuffer); ++i)
memcpy(&m_VideoInfoBuffer[i], &m_VideoInfo, sizeof(video_info_t));
m_AudioInfo.codec = AUDIO_CODEC_UNKNOWN;
m_AudioInfo.bitrate = AUDIO_BITRATE_INVALID;
m_AudioInfo.samplingFrequency = AUDIO_SAMPLING_FREQUENCY_INVALID;
m_AudioInfo.channelMode = AUDIO_CHANNEL_MODE_INVALID;
for (unsigned int i = 0; i < ELEMENTS(m_AudioInfoBuffer); ++i)
memcpy(&m_AudioInfoBuffer[i], &m_AudioInfo, sizeof(audio_info_t));
m_AC3Info.bitrate = AUDIO_BITRATE_INVALID;
m_AC3Info.samplingFrequency = AUDIO_SAMPLING_FREQUENCY_INVALID;
m_AC3Info.bitstreamMode = AUDIO_BITSTREAM_MODE_INVALID;
@@ -70,19 +67,17 @@ cFemonReceiver::cFemonReceiver(tChannelID ChannelID, int Ca, int Vpid, int Apid[
m_AC3Info.surroundMixLevel = AUDIO_SURROUND_MIX_LEVEL_INVALID;
m_AC3Info.dialogLevel = 0;
m_AC3Info.lfe = false;
for (unsigned int i = 0; i < ELEMENTS(m_AC3InfoBuffer); ++i)
memcpy(&m_AC3InfoBuffer[i], &m_AC3Info, sizeof(ac3_info_t));
}
cFemonReceiver::~cFemonReceiver(void)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
debug("%s()\n", __PRETTY_FUNCTION__);
Deactivate();
}
void cFemonReceiver::Deactivate(void)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
debug("%s()\n", __PRETTY_FUNCTION__);
if (m_Active) {
m_Active = false;
m_Sleep.Signal();
@@ -92,87 +87,9 @@ void cFemonReceiver::Deactivate(void)
}
}
void cFemonReceiver::GetVideoInfo(uint8_t *buf, int len)
{
int c = 0;
while (c < len) {
video_info_t tmp;
uint8_t *b = buf + c;
if (getMPEGVideoInfo(b, len - c, &tmp) || getH264VideoInfo(b, len - c, &tmp)) {
bool coherent = true;
memcpy(&m_VideoInfoBuffer[m_VideoInfoBufferIndex], &tmp, sizeof(video_info_t));
m_VideoInfoBufferIndex = (m_VideoInfoBufferIndex + 1) % ELEMENTS(m_VideoInfoBuffer);
for (unsigned int i = 1; i < ELEMENTS(m_VideoInfoBuffer); ++i) {
if (memcmp(&m_VideoInfoBuffer[0], &m_VideoInfoBuffer[i], sizeof(video_info_t)))
coherent = false;
break;
}
if (!m_VideoValid || coherent) {
m_VideoValid = true;
memcpy(&m_VideoInfo, &m_VideoInfoBuffer[0], sizeof(video_info_t));
}
return;
}
c++;
}
}
void cFemonReceiver::GetAudioInfo(uint8_t *buf, int len)
{
int c = 0;
while (c < len) {
audio_info_t tmp;
uint8_t *b = buf + c;
if (getAACAudioInfo(b, len - c, &tmp) || getMPEGAudioInfo(b, len - c, &tmp)) {
bool coherent = true;
memcpy(&m_AudioInfoBuffer[m_AudioInfoBufferIndex], &tmp, sizeof(audio_info_t));
m_AudioInfoBufferIndex = (m_AudioInfoBufferIndex + 1) % ELEMENTS(m_AudioInfoBuffer);
for (unsigned int i = 1; i < ELEMENTS(m_AudioInfoBuffer); ++i) {
if (memcmp(&m_AudioInfoBuffer[0], &m_AudioInfoBuffer[i], sizeof(audio_info_t)))
coherent = false;
break;
}
if (!m_AudioValid || coherent) {
m_AudioValid = true;
memcpy(&m_AudioInfo, &m_AudioInfoBuffer[0], sizeof(audio_info_t));
}
return;
}
c++;
}
}
void cFemonReceiver::GetAC3Info(uint8_t *buf, int len)
{
int c = 0;
while (c < len) {
ac3_info_t tmp;
uint8_t *b = buf + c;
if (getAC3AudioInfo(b, len - c, &tmp)) {
bool coherent = true;
memcpy(&m_AC3InfoBuffer[m_AC3InfoBufferIndex], &tmp, sizeof(ac3_info_t));
m_AC3InfoBufferIndex = (m_AC3InfoBufferIndex + 1) % ELEMENTS(m_AC3InfoBuffer);
for (unsigned int i = 1; i < ELEMENTS(m_AC3InfoBuffer); ++i) {
if (memcmp(&m_AC3InfoBuffer[0], &m_AC3InfoBuffer[i], sizeof(ac3_info_t)))
coherent = false;
break;
}
if (!m_AC3Valid || coherent) {
m_AC3Valid = true;
memcpy(&m_AC3Info, &m_AC3InfoBuffer[0], sizeof(ac3_info_t));
}
return;
}
c++;
}
}
void cFemonReceiver::Activate(bool On)
{
Dprintf("%s(%d)\n", __PRETTY_FUNCTION__, On);
debug("%s(%d)\n", __PRETTY_FUNCTION__, On);
if (On)
Start();
else
@@ -182,59 +99,149 @@ void cFemonReceiver::Activate(bool On)
void cFemonReceiver::Receive(uchar *Data, int Length)
{
// TS packet length: TS_SIZE
if (Length == TS_SIZE) {
int pid = ((Data[1] & 0x1f) << 8) | (Data[2]);
if (Running() && (*Data == TS_SYNC_BYTE) && (Length == TS_SIZE)) {
int len, pid = TsPid(Data);
if (pid == m_VideoPid) {
m_VideoPacketCount++;
}
else if (pid == m_AudioPid) {
m_AudioPacketCount++;
}
else if (pid == m_AC3Pid) {
m_AC3PacketCount++;
}
/* the following originates from libdvbmpeg: */
if (!(Data[3] & PAYLOAD)) {
return;
}
uint8_t off = 0;
if (Data[3] & ADAPT_FIELD) {
off = Data[4] + 1;
}
if (Data[1] & PAY_START) {
uint8_t *sb = Data + 4 + off;
if (sb[7] & PTS_DTS_FLAGS) {
uint8_t *pay = sb + sb[8] + 9;
int l = TS_SIZE - 13 - off - sb[8];
if (pid == m_VideoPid) {
GetVideoInfo(pay, l);
}
else if (pid == m_AudioPid) {
GetAudioInfo(pay, l);
}
else if (pid == m_AC3Pid) {
GetAC3Info(pay, l);
}
++m_VideoPacketCount;
len = m_VideoBuffer.Put(Data, Length);
if (len != Length) {
m_VideoBuffer.ReportOverflow(Length - len);
m_VideoBuffer.Clear();
}
}
else if (pid == m_AudioPid) {
++m_AudioPacketCount;
len = m_AudioBuffer.Put(Data, Length);
if (len != Length) {
m_AudioBuffer.ReportOverflow(Length - len);
m_AudioBuffer.Clear();
}
}
else if (pid == m_AC3Pid) {
++m_AC3PacketCount;
len = m_AC3Buffer.Put(Data, Length);
if (len != Length) {
m_AC3Buffer.ReportOverflow(Length - len);
m_AC3Buffer.Clear();
}
}
/* end */
}
}
void cFemonReceiver::Action(void)
{
Dprintf("%s()\n", __PRETTY_FUNCTION__);
cTimeMs t;
debug("%s()\n", __PRETTY_FUNCTION__);
cTimeMs calcPeriod(0);
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;
m_VideoPacketCount = 0;
m_AudioBitrate = (10.0 * 8.0 * 184.0 * m_AudioPacketCount) / femonConfig.calcinterval;
m_AudioPacketCount = 0;
m_AC3Bitrate = (10.0 * 8.0 * 184.0 * m_AC3PacketCount) / femonConfig.calcinterval;
m_AC3PacketCount = 0;
m_Sleep.Wait(max((int)(100 * femonConfig.calcinterval - t.Elapsed()), 3));
uint8_t *Data;
double timeout;
int len, Length;
bool processed = false;
// process available video data
while (Data = m_VideoBuffer.Get(Length)) {
if (!m_Active || (Length < TS_SIZE))
break;
Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) {
Length = i;
break;
}
}
m_VideoBuffer.Del(Length);
continue;
}
processed = true;
if (TsPayloadStart(Data)) {
while (const uint8_t *p = m_VideoAssembler.GetPes(len)) {
if (m_VideoType == 0x1B) { // MPEG4
if (m_DetectH264.processVideo(p, len)) {
m_VideoValid = true;
break;
}
}
else {
if (m_DetectMPEG.processVideo(p, len)) {
m_VideoValid = true;
break;
}
}
}
m_VideoAssembler.Reset();
}
m_VideoAssembler.PutTs(Data, Length);
m_VideoBuffer.Del(Length);
}
// process available audio data
while (Data = m_AudioBuffer.Get(Length)) {
if (!m_Active || (Length < TS_SIZE))
break;
Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) {
Length = i;
break;
}
}
m_AudioBuffer.Del(Length);
continue;
}
processed = true;
if (const uint8_t *p = m_AudioAssembler.GetPes(len)) {
if (m_DetectAAC.processAudio(p, len) || m_DetectMPEG.processAudio(p, len))
m_AudioValid = true;
m_AudioAssembler.Reset();
}
m_AudioAssembler.PutTs(Data, Length);
m_AudioBuffer.Del(Length);
}
// process available dolby data
while (Data = m_AC3Buffer.Get(Length)) {
if (!m_Active || (Length < TS_SIZE))
break;
Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) {
Length = i;
break;
}
}
m_AC3Buffer.Del(Length);
continue;
}
processed = true;
if (const uint8_t *p = m_AC3Assembler.GetPes(len)) {
if (m_DetectAC3.processAudio(p, len))
m_AC3Valid = true;
m_AC3Assembler.Reset();
}
m_AC3Assembler.PutTs(Data, Length);
m_AC3Buffer.Del(Length);
}
// calculate bitrates
timeout = double(calcPeriod.Elapsed());
if (m_Active && (timeout >= (100.0 * femonConfig.calcinterval))) {
// TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit
// PES headers should be compensated!
m_VideoBitrate = (1000.0 * 8.0 * 184.0 * m_VideoPacketCount) / timeout;
m_VideoPacketCount = 0;
m_AudioBitrate = (1000.0 * 8.0 * 184.0 * m_AudioPacketCount) / timeout;
m_AudioPacketCount = 0;
m_AC3Bitrate = (1000.0 * 8.0 * 184.0 * m_AC3PacketCount) / timeout;
m_AC3PacketCount = 0;
calcPeriod.Set(0);
}
if (!processed)
m_Sleep.Wait(10); // to avoid busy loop and reduce cpu load
}
}

View File

@@ -11,41 +11,49 @@
#include <vdr/thread.h>
#include <vdr/receiver.h>
#include "femonh264.h"
#include "femonmpeg.h"
#include "femonaac.h"
#include "femonac3.h"
#include "femonaudio.h"
#include "femonvideo.h"
#include "femontools.h"
class cFemonReceiver : public cReceiver, public cThread {
class cFemonReceiver : public cReceiver, public cThread, public cFemonVideoIf, public cFemonAudioIf, public cFemonAC3If {
private:
cCondWait m_Sleep;
bool m_Active;
cMutex m_Mutex;
cCondWait m_Sleep;
bool m_Active;
int m_VideoPid;
int m_VideoPacketCount;
double m_VideoBitrate;
bool m_VideoValid;
video_info_t m_VideoInfo;
video_info_t m_VideoInfoBuffer[3];
unsigned int m_VideoInfoBufferIndex;
cFemonH264 m_DetectH264;
cFemonMPEG m_DetectMPEG;
cFemonAAC m_DetectAAC;
cFemonAC3 m_DetectAC3;
int m_AudioPid;
int m_AudioPacketCount;
double m_AudioBitrate;
bool m_AudioValid;
audio_info_t m_AudioInfo;
audio_info_t m_AudioInfoBuffer[3];
unsigned int m_AudioInfoBufferIndex;
cRingBufferLinear m_VideoBuffer;
cTsToPes m_VideoAssembler;
int m_VideoType;
int m_VideoPid;
int m_VideoPacketCount;
double m_VideoBitrate;
bool m_VideoValid;
video_info_t m_VideoInfo;
int m_AC3Pid;
int m_AC3PacketCount;
double m_AC3Bitrate;
bool m_AC3Valid;
ac3_info_t m_AC3Info;
ac3_info_t m_AC3InfoBuffer[3];
unsigned int m_AC3InfoBufferIndex;
cRingBufferLinear m_AudioBuffer;
cTsToPes m_AudioAssembler;
int m_AudioPid;
int m_AudioPacketCount;
double m_AudioBitrate;
bool m_AudioValid;
audio_info_t m_AudioInfo;
void GetVideoInfo(uint8_t *buf, int len);
void GetAudioInfo(uint8_t *buf, int len);
void GetAC3Info(uint8_t *buf, int len);
cRingBufferLinear m_AC3Buffer;
cTsToPes m_AC3Assembler;
int m_AC3Pid;
int m_AC3PacketCount;
double m_AC3Bitrate;
bool m_AC3Valid;
ac3_info_t m_AC3Info;
protected:
virtual void Activate(bool On);
@@ -53,41 +61,115 @@ protected:
virtual void Action(void);
public:
cFemonReceiver(tChannelID ChannelID, int Ca, int Vpid, int Apid[], int Dpid[]);
virtual void SetVideoCodec(eVideoCodec codec) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.codec = codec; }
virtual void SetVideoFormat(eVideoFormat format) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.format = format; }
virtual void SetVideoScan(eVideoScan scan) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.scan = scan; }
virtual void SetVideoAspectRatio(eVideoAspectRatio aspectratio) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.aspectRatio = aspectratio; }
virtual void SetVideoSize(int width, int height) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.width = width;
m_VideoInfo.height = height; }
virtual void SetVideoFramerate(double framerate) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.frameRate = framerate; }
virtual void SetVideoBitrate(double bitrate) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.bitrate = bitrate; }
virtual void SetAudioCodec(eAudioCodec codec) { cMutexLock MutexLock(&m_Mutex);
m_AudioInfo.codec = codec; }
virtual void SetAudioBitrate(double bitrate) { cMutexLock MutexLock(&m_Mutex);
m_AudioInfo.bitrate = bitrate; }
virtual void SetAudioSamplingFrequency(int sampling) { cMutexLock MutexLock(&m_Mutex);
m_AudioInfo.samplingFrequency = sampling; }
virtual void SetAudioChannel(eAudioChannelMode mode) { cMutexLock MutexLock(&m_Mutex);
m_AudioInfo.channelMode = mode; }
virtual void SetAC3Bitrate(int bitrate) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.bitrate = bitrate; }
virtual void SetAC3SamplingFrequency(int sampling) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.samplingFrequency = sampling; }
virtual void SetAC3Bitstream(int mode) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.bitstreamMode = mode; }
virtual void SetAC3AudioCoding(int mode) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.audioCodingMode = mode; }
virtual void SetAC3DolbySurround(int mode) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.dolbySurroundMode = mode; }
virtual void SetAC3CenterMix(int level) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.centerMixLevel = level; }
virtual void SetAC3SurroundMix(int level) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.surroundMixLevel = level; }
virtual void SetAC3Dialog(int level) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.dialogLevel = level; }
virtual void SetAC3LFE(bool onoff) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.lfe = onoff; }
public:
cFemonReceiver(int Vtype, 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
int VideoCodec(void) { return m_VideoInfo.codec; }; // eVideoCodec
int VideoFormat(void) { return m_VideoInfo.format; }; // eVideoFormat
int VideoScan(void) { return m_VideoInfo.scan; }; // eVideoScan
int VideoAspectRatio(void) { return m_VideoInfo.aspectRatio; }; // eVideoAspectRatio
int VideoHorizontalSize(void) { return m_VideoInfo.width; }; // pixels
int VideoVerticalSize(void) { return m_VideoInfo.height; }; // pixels
double VideoFrameRate(void) { return m_VideoInfo.frameRate; }; // Hz
double VideoStreamBitrate(void) { return m_VideoInfo.bitrate; }; // bit/s
bool VideoValid(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoValid; }; // boolean
double VideoBitrate(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoBitrate; }; // bit/s
int VideoCodec(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.codec; }; // eVideoCodec
int VideoFormat(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.format; }; // eVideoFormat
int VideoScan(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.scan; }; // eVideoScan
int VideoAspectRatio(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.aspectRatio; }; // eVideoAspectRatio
int VideoHorizontalSize(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.width; }; // pixels
int VideoVerticalSize(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.height; }; // pixels
double VideoFrameRate(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.frameRate; }; // Hz
double VideoStreamBitrate(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.bitrate; }; // bit/s
bool AudioValid(void) { return m_AudioValid; }; // boolean
double AudioBitrate(void) { return m_AudioBitrate; }; // bit/s
int AudioCodec(void) { return m_AudioInfo.codec; }; // eAudioCodec
int AudioChannelMode(void) { return m_AudioInfo.channelMode; }; // eAudioChannelMode
double AudioStreamBitrate(void) { return m_AudioInfo.bitrate; }; // bit/s or eAudioBitrate
int AudioSamplingFreq(void) { return m_AudioInfo.samplingFrequency; }; // Hz or eAudioSamplingFrequency
bool AudioValid(void) { cMutexLock MutexLock(&m_Mutex);
return m_AudioValid; }; // boolean
double AudioBitrate(void) { cMutexLock MutexLock(&m_Mutex);
return m_AudioBitrate; }; // bit/s
int AudioCodec(void) { cMutexLock MutexLock(&m_Mutex);
return m_AudioInfo.codec; }; // eAudioCodec
int AudioChannelMode(void) { cMutexLock MutexLock(&m_Mutex);
return m_AudioInfo.channelMode; }; // eAudioChannelMode
double AudioStreamBitrate(void) { cMutexLock MutexLock(&m_Mutex);
return m_AudioInfo.bitrate; }; // bit/s or eAudioBitrate
int AudioSamplingFreq(void) { cMutexLock MutexLock(&m_Mutex);
return m_AudioInfo.samplingFrequency; }; // Hz or eAudioSamplingFrequency
bool AC3Valid(void) { return m_AC3Valid; }; // boolean
double AC3Bitrate(void) { return m_AC3Bitrate; }; // bit/s
double AC3StreamBitrate(void) { return m_AC3Info.bitrate; }; // bit/s or eAudioBitrate
int AC3SamplingFreq(void) { return m_AC3Info.samplingFrequency; }; // Hz or eAudioSamplingFrequency
int AC3BitStreamMode(void) { return m_AC3Info.bitstreamMode; }; // 0..7 or eAudioBitstreamMode
int AC3AudioCodingMode(void) { return m_AC3Info.audioCodingMode; }; // 0..7 or eAudioCodingMode
bool AC3_2_0(void) { return m_AC3Info.audioCodingMode == AUDIO_CODING_MODE_2_0; }; // boolean
bool AC3_5_1(void) { return m_AC3Info.audioCodingMode == AUDIO_CODING_MODE_3_2; }; // boolean
int AC3DolbySurroundMode(void) { return m_AC3Info.dolbySurroundMode; }; // eAudioDolbySurroundMode
int AC3CenterMixLevel(void) { return m_AC3Info.centerMixLevel; }; // eAudioCenterMixLevel
int AC3SurroundMixLevel(void) { return m_AC3Info.surroundMixLevel; }; // eAudioSurroundMixLevel
int AC3DialogLevel(void) { return m_AC3Info.dialogLevel; }; // -dB
bool AC3Lfe(void) { return m_AC3Info.lfe; }; // boolean
bool AC3Valid(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Valid; }; // boolean
double AC3Bitrate(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Bitrate; }; // bit/s
double AC3StreamBitrate(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.bitrate; }; // bit/s or eAudioBitrate
int AC3SamplingFreq(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.samplingFrequency; }; // Hz or eAudioSamplingFrequency
int AC3BitStreamMode(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.bitstreamMode; }; // 0..7 or eAudioBitstreamMode
int AC3AudioCodingMode(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.audioCodingMode; }; // 0..7 or eAudioCodingMode
bool AC3_2_0(void) { cMutexLock MutexLock(&m_Mutex);
return (m_AC3Info.audioCodingMode == AUDIO_CODING_MODE_2_0); }; // boolean
bool AC3_5_1(void) { cMutexLock MutexLock(&m_Mutex);
return (m_AC3Info.audioCodingMode == AUDIO_CODING_MODE_3_2); }; // boolean
int AC3DolbySurroundMode(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.dolbySurroundMode; }; // eAudioDolbySurroundMode
int AC3CenterMixLevel(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.centerMixLevel; }; // eAudioCenterMixLevel
int AC3SurroundMixLevel(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.surroundMixLevel; }; // eAudioSurroundMixLevel
int AC3DialogLevel(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.dialogLevel; }; // -dB
bool AC3Lfe(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.lfe; }; // boolean
};
#endif //__FEMONRECEIVER_H

View File

@@ -37,6 +37,11 @@
#include "symbols/five.xpm"
#include "symbols/six.xpm"
#include "symbols/seven.xpm"
#include "symbols/eight.xpm"
#include "symbols/format1080.xpm"
#include "symbols/format720.xpm"
#include "symbols/format576.xpm"
#include "symbols/format480.xpm"
cBitmap bmSymbol[SYMBOL_MAX_COUNT] =
{
@@ -69,5 +74,10 @@ cBitmap bmSymbol[SYMBOL_MAX_COUNT] =
cBitmap(four_xpm), // SYMBOL_FOUR
cBitmap(five_xpm), // SYMBOL_FIVE
cBitmap(six_xpm), // SYMBOL_SIX
cBitmap(seven_xpm) // SYMBOL_SEVEN
cBitmap(seven_xpm), // SYMBOL_SEVEN
cBitmap(eight_xpm), // SYMBOL_EIGHT
cBitmap(format1080_xpm), // SYMBOL_FORMAT_1080
cBitmap(format720_xpm), // SYMBOL_FORMAT_720
cBitmap(format576_xpm), // SYMBOL_FORMAT_576
cBitmap(format480_xpm) // SYMBOL_FORMAT_480
};

View File

@@ -41,6 +41,11 @@ enum eSymbols {
SYMBOL_FIVE,
SYMBOL_SIX,
SYMBOL_SEVEN,
SYMBOL_EIGHT,
SYMBOL_FORMAT_1080,
SYMBOL_FORMAT_720,
SYMBOL_FORMAT_576,
SYMBOL_FORMAT_480,
SYMBOL_MAX_COUNT
};

View File

@@ -5,6 +5,11 @@
*
*/
#ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#endif
#include <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
@@ -13,6 +18,64 @@
#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);
}
static const char *getUserString(int Value, const tChannelParameterMap *Map)
{
const tChannelParameterMap *map = Map;
while (map && map->userValue != -1) {
if (map->driverValue == Value)
return map->userString ? trVDR(map->userString) : "---";
map++;
}
return "---";
}
cString getFrontendInfo(int cardIndex)
{
cString info;
@@ -28,21 +91,28 @@ cString getFrontendInfo(int cardIndex)
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (fe < 0)
return NULL;
CHECK(ioctl(fe, FE_GET_INFO, &value));
CHECK(ioctl(fe, FE_READ_STATUS, &status));
CHECK(ioctl(fe, FE_READ_SIGNAL_STRENGTH, &signal));
CHECK(ioctl(fe, FE_READ_SNR, &snr));
CHECK(ioctl(fe, FE_READ_BER, &ber));
CHECK(ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &unc));
close(fe);
info = cString::sprintf("CARD:%d\nTYPE:%d\nNAME:%s\nSTAT:%02X\nSGNL:%04X\nSNRA:%04X\nBERA:%08X\nUNCB:%08X", cardIndex, value.type, value.name, status, signal, snr, ber, unc);
info = cString::sprintf("CARD:%d", cardIndex);
if (ioctl(fe, FE_GET_INFO, &value) >= 0)
info = cString::sprintf("%s\nTYPE:%d\nNAME:%s", *info, value.type, value.name);
if (ioctl(fe, FE_READ_STATUS, &status) >= 0)
info = cString::sprintf("%s\nSTAT:%02X", *info, status);
if (ioctl(fe, FE_READ_SIGNAL_STRENGTH, &signal) >= 0)
info = cString::sprintf("%s\nSGNL:%04X", *info, signal);
if (ioctl(fe, FE_READ_SNR, &snr) >= 0)
info = cString::sprintf("%s\nSNRA:%04X", *info, snr);
if (ioctl(fe, FE_READ_BER, &ber) >= 0)
info = cString::sprintf("%s\nBERA:%08X", *info, ber);
if (ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &unc) >= 0)
info = cString::sprintf("%s\nUNCB:%08X", *info, unc);
close(fe);
if (cFemonOsd::Instance())
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;
}
@@ -55,7 +125,8 @@ cString getFrontendName(int cardIndex)
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (fe < 0)
return NULL;
CHECK(ioctl(fe, FE_GET_INFO, &value));
memset(&value, 0, sizeof(value));
ioctl(fe, FE_GET_INFO, &value);
close(fe);
return (cString::sprintf("%s on device #%d", value.name, cardIndex));
@@ -69,7 +140,8 @@ cString getFrontendStatus(int cardIndex)
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (fe < 0)
return NULL;
CHECK(ioctl(fe, FE_READ_STATUS, &value));
memset(&value, 0, sizeof(value));
ioctl(fe, FE_READ_STATUS, &value);
close(fe);
return (cString::sprintf("Status %s:%s:%s:%s:%s on device #%d", (value & FE_HAS_LOCK) ? "LOCKED" : "-", (value & FE_HAS_SIGNAL) ? "SIGNAL" : "-", (value & FE_HAS_CARRIER) ? "CARRIER" : "-", (value & FE_HAS_VITERBI) ? "VITERBI" : "-", (value & FE_HAS_SYNC) ? "SYNC" : "-", cardIndex));
@@ -83,7 +155,7 @@ uint16_t getSignal(int cardIndex)
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (fe < 0)
return (value);
CHECK(ioctl(fe, FE_READ_SIGNAL_STRENGTH, &value));
ioctl(fe, FE_READ_SIGNAL_STRENGTH, &value);
close(fe);
return (value);
@@ -97,7 +169,7 @@ uint16_t getSNR(int cardIndex)
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (fe < 0)
return (value);
CHECK(ioctl(fe, FE_READ_SNR, &value));
ioctl(fe, FE_READ_SNR, &value);
close(fe);
return (value);
@@ -111,7 +183,7 @@ uint32_t getBER(int cardIndex)
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (fe < 0)
return (value);
CHECK(ioctl(fe, FE_READ_BER, &value));
ioctl(fe, FE_READ_BER, &value);
close(fe);
return (value);
@@ -125,7 +197,7 @@ uint32_t getUNC(int cardIndex)
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (fe < 0)
return (value);
CHECK(ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &value));
ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &value);
close(fe);
return (value);
@@ -158,47 +230,15 @@ 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)
{
/* 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);
}
cString getVideoStream(int value)
{
if (value != 0)
@@ -239,6 +279,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("---");
}
@@ -253,6 +294,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("---");
}
@@ -264,114 +306,54 @@ 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("---");
}
cString getCoderate(int value)
{
switch (value) {
case FEC_NONE: return cString::sprintf("%s", tr("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");
case FEC_4_5: return cString::sprintf("4/5");
case FEC_5_6: return cString::sprintf("5/6");
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"));
}
return cString::sprintf("---");
return cString::sprintf("%s", getUserString(value, CoderateValues));
}
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"));
}
return cString::sprintf("---");
return cString::sprintf("%s", getUserString(value, TransmissionValues));
}
cString getBandwidth(int value)
{
switch (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"));
}
return cString::sprintf("---");
return cString::sprintf("%s", getUserString(value, BandwidthValues));
}
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"));
}
return cString::sprintf("---");
return cString::sprintf("%s", getUserString(value, InversionValues));
}
cString getHierarchy(int value)
{
switch (value) {
case HIERARCHY_NONE: return cString::sprintf("%s", tr("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"));
}
return cString::sprintf("---");
return cString::sprintf("%s", getUserString(value, HierarchyValues));
}
cString getGuard(int value)
{
switch (value) {
case GUARD_INTERVAL_1_32: return cString::sprintf("1/32");
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"));
}
return cString::sprintf("---");
return cString::sprintf("%s", getUserString(value, GuardValues));
}
cString getModulation(int value)
{
switch (value) {
case QPSK: return cString::sprintf("QPSK");
case QAM_16: return cString::sprintf("QAM 16");
case QAM_32: return cString::sprintf("QAM 32");
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"));
}
return cString::sprintf("---");
}
cString getAlpha(int value)
{
return cString::sprintf("---");
}
cString getPriority(int value)
{
return cString::sprintf("---");
return cString::sprintf("%s", getUserString(value, ModulationValues));
}
cString getSystem(int value)
{
return cString::sprintf("---");
return cString::sprintf("%s", getUserString(value, SystemValues));
}
cString getRollOff(int value)
{
return cString::sprintf("---");
return cString::sprintf("%s", getUserString(value, RollOffValues));
}
cString getResolution(int width, int height, int scan)
@@ -409,6 +391,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("---");
}
@@ -423,6 +406,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("---");
}
@@ -445,6 +429,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("---");
}
@@ -461,6 +446,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("---");
@@ -473,6 +459,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("---");
}
@@ -484,6 +471,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("---");
}
@@ -495,6 +483,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("---");
}
@@ -517,6 +506,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"));
}
@@ -527,6 +517,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));
}
@@ -545,7 +536,89 @@ cString getBitrateMbits(double value)
cString getBitrateKbits(double value)
{
if (value > 0)
if (value > 0)
return cString::sprintf("%.0f %s", value / 1000.0, tr("kbit/s"));
return cString::sprintf("---");
}
cBitStream::cBitStream(const uint8_t *buf, const int len)
: data(buf),
count(len),
index(0)
{
}
cBitStream::~cBitStream()
{
}
int cBitStream::getBit()
{
if (index >= count)
return (1); // -> no infinite colomb's ...
int r = (data[index >> 3] >> (7 - (index & 7))) & 1;
++index;
return (r);
}
uint32_t cBitStream::getBits(uint32_t n)
{
uint32_t r = 0;
while (n--)
r = (r | (getBit() << n));
return (r);
}
void cBitStream::skipBits(uint32_t n)
{
index += n;
}
uint32_t cBitStream::getUeGolomb()
{
int n = 0;
while (!getBit() && (n < 32))
n++;
return (n ? ((1 << n) - 1) + getBits(n) : 0);
}
int32_t cBitStream::getSeGolomb()
{
uint32_t r = getUeGolomb() + 1;
return ((r & 1) ? -(r >> 1) : (r >> 1));
}
void cBitStream::skipGolomb()
{
int n = 0;
while (!getBit() && (n < 32))
n++;
skipBits(n);
}
void cBitStream::skipUeGolomb()
{
skipGolomb();
}
void cBitStream::skipSeGolomb()
{
skipGolomb();
}
void cBitStream::byteAlign()
{
int n = index % 8;
if (n > 0)
skipBits(8 - n);
}

View File

@@ -10,12 +10,15 @@
#include <stdint.h>
#include <vdr/channels.h>
#include <vdr/remux.h>
#include <vdr/tools.h>
#ifdef DEBUG
#define Dprintf(x...) printf(x);
#define debug(x...) dsyslog("FEMON: " x);
#define error(x...) esyslog("ERROR: " x);
#else
#define Dprintf(x...) ;
#define debug(x...) ;
#define error(x...) esyslog("ERROR: " x);
#endif
#define ELEMENTS(x) (sizeof(x) / sizeof(x[0]))
@@ -35,8 +38,7 @@ 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);
@@ -49,8 +51,6 @@ 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);
@@ -71,4 +71,35 @@ cString getVideoBitrate(double value, double stream);
cString getBitrateMbits(double value);
cString getBitrateKbits(double value);
class cBitStream {
private:
const uint8_t *data;
int count; // in bits
int index; // in bits
public:
cBitStream(const uint8_t *buf, const int len);
~cBitStream();
int getBit();
uint32_t getBits(uint32_t n);
void skipBits(uint32_t n);
uint32_t getUeGolomb();
int32_t getSeGolomb();
void skipGolomb();
void skipUeGolomb();
void skipSeGolomb();
void byteAlign();
void skipBit() { skipBits(1); }
uint32_t getU8() { return getBits(8); }
uint32_t getU16() { return ((getBits(8) << 8) | getBits(8)); }
uint32_t getU24() { return ((getBits(8) << 16) | (getBits(8) << 8) | getBits(8)); }
uint32_t getU32() { return ((getBits(8) << 24) | (getBits(8) << 16) | (getBits(8) << 8) | getBits(8)); }
bool isEOF() { return (index >= count); }
void reset() { index = 0; }
int getIndex() { return (isEOF() ? count : index); }
const uint8_t *getData() { return (isEOF() ? NULL : data + (index / 8)); }
};
#endif // __FEMONTOOLS_H

View File

@@ -66,7 +66,28 @@ typedef struct video_info {
int width; // pixels
int height; // pixels
double frameRate; // Hz
double bitrate; // Mbit/s
double bitrate; // bit/s
} video_info_t;
class cFemonVideoIf {
public:
cFemonVideoIf() {}
virtual ~cFemonVideoIf() {}
// eVideoCodec
virtual void SetVideoCodec(eVideoCodec codec) = 0;
// eVideoFormat
virtual void SetVideoFormat(eVideoFormat format) = 0;
// eVideoScan
virtual void SetVideoScan(eVideoScan scan) = 0;
// eVideoAspectRatio
virtual void SetVideoAspectRatio(eVideoAspectRatio aspectratio) = 0;
// pixels
virtual void SetVideoSize(int width, int height) = 0;
// Hz
virtual void SetVideoFramerate(double framerate) = 0;
// Mbit/s
virtual void SetVideoBitrate(double bitrate) = 0;
};
#endif //__FEMONVIDEO_H

View File

@@ -7,9 +7,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.6.4\n"
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2008-11-09 13:31+0200\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Christian Wieninger\n"
"Language-Team: <vdr@linuxtv.org>\n"
@@ -89,21 +89,6 @@ msgstr "Position"
msgid "Define the position of OSD."
msgstr ""
msgid "Define the height of OSD."
msgstr ""
msgid "Horizontal offset"
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 [%]"
@@ -182,15 +167,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"
@@ -248,12 +224,6 @@ msgstr "Dolby Surround Modus"
msgid "Low Frequency Effects"
msgstr "Tieft<66>ner Effekte"
msgid "on"
msgstr "Ein"
msgid "off"
msgstr "Aus"
msgid "Dialogue Normalization"
msgstr "Dialog Normalisierung"
@@ -263,36 +233,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 ""
@@ -332,15 +272,6 @@ msgstr ""
msgid "mono"
msgstr ""
msgid "none"
msgstr "Nichts"
msgid "auto"
msgstr "Auto"
msgid "MHz"
msgstr "MHz"
msgid "interlaced"
msgstr ""
@@ -431,6 +362,9 @@ msgstr "dB"
msgid "not indicated"
msgstr "nicht angegeben"
msgid "MHz"
msgstr "MHz"
msgid "free"
msgstr "frei"

View File

@@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.6.4\n"
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2008-11-09 13:31+0200\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Luis Palacios\n"
"Language-Team: <vdr@linuxtv.org>\n"
@@ -87,21 +87,6 @@ msgstr "Posici
msgid "Define the position of OSD."
msgstr ""
msgid "Define the height of OSD."
msgstr ""
msgid "Horizontal offset"
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]"
@@ -180,15 +165,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"
@@ -246,12 +222,6 @@ msgstr "Nivel sonoro Dolby Surround"
msgid "Low Frequency Effects"
msgstr "Efectos de baja frecuencia"
msgid "on"
msgstr "on"
msgid "off"
msgstr "off"
msgid "Dialogue Normalization"
msgstr "Normalizaci<63>n del di<64>logo"
@@ -261,36 +231,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 ""
@@ -330,15 +270,6 @@ msgstr ""
msgid "mono"
msgstr "o"
msgid "none"
msgstr "ninguno"
msgid "auto"
msgstr "auto"
msgid "MHz"
msgstr "MHz"
msgid "interlaced"
msgstr ""
@@ -429,6 +360,9 @@ msgstr "dB"
msgid "not indicated"
msgstr "no indicado"
msgid "MHz"
msgstr "MHz"
msgid "free"
msgstr "libre"

View File

@@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.6.4\n"
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2008-11-09 13:31+0200\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Arthur Konovalov\n"
"Language-Team: <vdr@linuxtv.org>\n"
@@ -22,7 +22,7 @@ msgid "Signal Information"
msgstr "Signaaliinfo"
msgid "Femon not available"
msgstr ""
msgstr "Femon ei ole k<>ttesaadav"
msgid "basic"
msgstr "standard"
@@ -37,7 +37,7 @@ msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "Klassikaline"
msgstr "Classic"
msgid "Elchi"
msgstr "Elchi"
@@ -64,94 +64,79 @@ msgid "SilverGreen"
msgstr "SilverGreen"
msgid "Hide main menu entry"
msgstr "Peida valik peamen<65><6E>s"
msgstr "Peita valik peamen<65><6E>s"
msgid "Define whether the main menu entry is hidden."
msgstr ""
msgstr "Valiku peamen<65><6E>s peitmise m<><6D>ritlemine."
msgid "Default display mode"
msgstr "Vaikimisi displei moodus"
msgstr "Vaikemoodus"
msgid "Define the default display mode at startup."
msgstr ""
msgstr "K<EFBFBD>ivitamisel vaikemooduse m<><6D>ritlemine."
msgid "Define the used OSD skin."
msgstr ""
msgstr "Kasutatava ekraanikesta m<><6D>ritlemine."
msgid "Define the used OSD theme."
msgstr ""
msgstr "Kasutatava teema m<><6D>ritlemine."
msgid "Position"
msgstr "Positsioon"
msgid "Define the position of OSD."
msgstr ""
msgid "Define the height of OSD."
msgstr ""
msgid "Horizontal offset"
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 ""
msgstr "Ekraaniinfo positsiooni m<><6D>ritlemine."
msgid "Red limit [%]"
msgstr "Punase limiit [%]"
msgid "Define a limit for red bar, which is used to indicate a bad signal."
msgstr ""
msgstr "Seaded punasele limiidile. Iseloomustab kehva signaali."
msgid "Green limit [%]"
msgstr "Rohelise limiit [%]"
msgid "Define a limit for green bar, which is used to indicate a good signal."
msgstr ""
msgstr "Seaded rohelisele limiidile. Iseloomustab head signaali."
msgid "OSD update interval [0.1s]"
msgstr "Uuendusintervall [0,1s]"
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
msgstr ""
msgstr "Ekraaniinfo uuendamise intervalli m<><6D>ritlemine. V<>iksem intervall- suurem CPU koormus."
msgid "Analyze stream"
msgstr "Voo anal<61><6C>s"
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
msgstr ""
msgstr "DVB voo bitikiiruse rehkendamise m<><6D>ritlemine."
msgid "Calculation interval [0.1s]"
msgstr "Kalkulatsiooni intervall [0,1s]"
msgstr "Arvutamise intervall [0,1s]"
msgid "Define an interval for calculation. The bigger interval generates more stable values."
msgstr ""
msgstr "Arvutamise intervalli m<><6D>ritlemine. Suurem intervall annab stabiilsemaid tulemusi."
msgid "Use SVDRP service"
msgstr ""
msgstr "SVDRP teenus"
msgid "Define whether the SVDRP service is used in client/server setups."
msgstr ""
msgstr "SVDRP teenuse klient/server seadete m<><6D>ritlemine."
msgid "SVDRP service port"
msgstr ""
msgstr "SVDRP port"
msgid "Define the port number of SVDRP service."
msgstr ""
msgstr "SVDRP teenuse pordi m<><6D>ritlemine."
msgid "SVDRP service IP"
msgstr ""
msgstr "SVDRP IP"
msgid "Define the IP address of SVDRP service."
msgstr ""
msgstr "SVDRP teenuse IP aadressi m<><6D>ritlemine."
msgid "Help"
msgstr ""
msgstr "Abi"
msgid "Video"
msgstr "Video"
@@ -180,26 +165,17 @@ 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"
msgid "Stream Information"
msgstr "Voo info"
msgstr "Vooinfo"
msgid "Video Stream"
msgstr "Videovoog"
msgid "Codec"
msgstr ""
msgstr "Koodek"
msgid "Bitrate"
msgstr "Bitikiirus"
@@ -220,7 +196,7 @@ msgid "Audio Stream"
msgstr "Audiovoog"
msgid "Channel Mode"
msgstr ""
msgstr "Kanalimoodus"
msgid "Sampling Frequency"
msgstr "S<>mplimissagedus"
@@ -246,12 +222,6 @@ msgstr "Dolby Surround'i t
msgid "Low Frequency Effects"
msgstr "LFE kanal"
msgid "on"
msgstr "Sees"
msgid "off"
msgstr "V<>ljas"
msgid "Dialogue Normalization"
msgstr "Dialoogi normalisatsioon"
@@ -259,103 +229,64 @@ msgid "Fixed"
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"
msgstr "Analoog"
msgid "MPEG-2"
msgstr ""
msgstr "MPEG-2"
msgid "H.264"
msgstr ""
msgstr "H.264"
msgid "MPEG-1 Layer I"
msgstr ""
msgstr "MPEG-1 Layet 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 "duaalne"
msgid "mono"
msgstr ""
msgid "none"
msgstr "ei"
msgid "auto"
msgstr "auto"
msgid "MHz"
msgstr "MHz"
msgstr "mono"
msgid "interlaced"
msgstr ""
msgstr "<EFBFBD>lerealaotus"
msgid "progressive"
msgstr ""
msgstr "progressiivne"
msgid "reserved"
msgstr "reserveeritud"
msgstr "reserv."
msgid "extended"
msgstr ""
msgstr "laiendatud"
msgid "unknown"
msgstr "tundmatu"
msgid "component"
msgstr ""
msgstr "komponentne"
msgid "PAL"
msgstr "PAL"
@@ -364,10 +295,10 @@ msgid "NTSC"
msgstr "NTSC"
msgid "SECAM"
msgstr ""
msgstr "SECAM"
msgid "MAC"
msgstr ""
msgstr "MAC"
msgid "Hz"
msgstr "Hz"
@@ -400,10 +331,10 @@ msgid "Karaoke"
msgstr "Karaoke"
msgid "Ch1"
msgstr "Kan. 1"
msgstr "Kan.1"
msgid "Ch2"
msgstr "Kan. 2"
msgstr "Kan.2"
msgid "C"
msgstr "C"
@@ -429,6 +360,9 @@ msgstr "dB"
msgid "not indicated"
msgstr "m<>rkimata"
msgid "MHz"
msgstr "MHz"
msgid "free"
msgstr "vaba"

View File

@@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.6.4\n"
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2008-11-09 13:31+0200\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Rolf Ahrenberg\n"
"Language-Team: <vdr@linuxtv.org>\n"
@@ -87,21 +87,6 @@ msgstr "Sijainti"
msgid "Define the position of OSD."
msgstr "Määrittele näytön sijainti."
msgid "Define the height of OSD."
msgstr "Määrittele näytön korkeus."
msgid "Horizontal offset"
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 [%]"
@@ -180,15 +165,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"
@@ -246,12 +222,6 @@ msgstr "Dolby Surround -tehoste"
msgid "Low Frequency Effects"
msgstr "LFE-kanava"
msgid "on"
msgstr "päällä"
msgid "off"
msgstr "poissa"
msgid "Dialogue Normalization"
msgstr "Dialogin normalisointi"
@@ -261,36 +231,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"
@@ -330,15 +270,6 @@ msgstr "kaksikanavainen"
msgid "mono"
msgstr "mono"
msgid "none"
msgstr "ei"
msgid "auto"
msgstr "auto"
msgid "MHz"
msgstr "MHz"
msgid "interlaced"
msgstr "lomiteltu"
@@ -429,6 +360,9 @@ msgstr "dB"
msgid "not indicated"
msgstr "ei ilmaistu"
msgid "MHz"
msgstr "MHz"
msgid "free"
msgstr "vapaa"

View File

@@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.6.4\n"
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2008-11-09 13:31+0200\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\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"
@@ -87,21 +87,6 @@ msgstr "Position"
msgid "Define the position of OSD."
msgstr "D<>finit la position de l'OSD."
msgid "Define the height of OSD."
msgstr "D<>finit l'hauteur de l'OSD."
msgid "Horizontal offset"
msgstr "D<>placement horizontal"
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 (%)"
@@ -180,15 +165,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"
@@ -246,12 +222,6 @@ msgstr "Mode Dolby Surround"
msgid "Low Frequency Effects"
msgstr "Effets de basses"
msgid "on"
msgstr "Oui"
msgid "off"
msgstr "Non"
msgid "Dialogue Normalization"
msgstr "Normalisation des dialogues"
@@ -261,36 +231,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 ""
@@ -330,15 +270,6 @@ msgstr ""
msgid "mono"
msgstr ""
msgid "none"
msgstr "Aucun"
msgid "auto"
msgstr "Auto"
msgid "MHz"
msgstr "MHz"
msgid "interlaced"
msgstr ""
@@ -429,6 +360,9 @@ msgstr "dB"
msgid "not indicated"
msgstr "non indiqu<71>"
msgid "MHz"
msgstr "MHz"
msgid "free"
msgstr "libre"

View File

@@ -6,9 +6,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.6.4\n"
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2008-11-09 13:31+0200\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\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"
@@ -88,21 +88,6 @@ msgstr "Posizione"
msgid "Define the position of OSD."
msgstr "Definisci la posizione dell'OSD."
msgid "Define the height of OSD."
msgstr "Definisci l'altezza dell'OSD."
msgid "Horizontal offset"
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 [%]"
@@ -181,15 +166,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"
@@ -247,12 +223,6 @@ msgstr "Modalit
msgid "Low Frequency Effects"
msgstr "Effetti bassa frequenza"
msgid "on"
msgstr "Attivo"
msgid "off"
msgstr "Disattivo"
msgid "Dialogue Normalization"
msgstr "Normalizzazione dialoghi"
@@ -262,36 +232,6 @@ 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 "MPEG-2"
@@ -331,15 +271,6 @@ msgstr "dual"
msgid "mono"
msgstr "mono"
msgid "none"
msgstr "nessuna"
msgid "auto"
msgstr "auto"
msgid "MHz"
msgstr "MHz"
msgid "interlaced"
msgstr "interlacciato"
@@ -430,6 +361,9 @@ msgstr "dB"
msgid "not indicated"
msgstr "non indicato"
msgid "MHz"
msgstr "MHz"
msgid "free"
msgstr "libero"

373
po/lt_LT.po Normal file
View File

@@ -0,0 +1,373 @@
# VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Valdemaras Pipiras
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Valdemaras Pipiras\n"
"Language-Team: <varas@ambernet.lt>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "DVB Signal Information Monitor (OSD)"
msgstr "DVB signalo informacijos stebėjimas (OSD)"
msgid "Signal Information"
msgstr "Signalo informacija"
msgid "Femon not available"
msgstr "Femon įskiepas nepasiekiamas"
msgid "basic"
msgstr "Standartinis"
msgid "transponder"
msgstr "Siųstuvas"
msgid "stream"
msgstr "Srautas"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "Klasikinis"
msgid "Elchi"
msgstr "Elchi"
msgid "ST:TNG"
msgstr "ST:TNG"
msgid "DeepBlue"
msgstr "DeepBlue"
msgid "Moronimo"
msgstr "Moronimo"
msgid "Enigma"
msgstr "Enigma"
msgid "EgalsTry"
msgstr "EgalsTry"
msgid "Duotone"
msgstr "Duotone"
msgid "SilverGreen"
msgstr "SilverGreen"
msgid "Hide main menu entry"
msgstr "Paslėpti pagrindinio meniu įrašus"
msgid "Define whether the main menu entry is hidden."
msgstr "Nustatyti pagrindinio meniu įrašų paslėpimą."
msgid "Default display mode"
msgstr "Numatytasis rodymo būdas"
msgid "Define the default display mode at startup."
msgstr "Nustatyti numatytąjį rodymo būdą paleidžiant."
msgid "Define the used OSD skin."
msgstr "Nustatyti naudojamą ekrano apvalkalą."
msgid "Define the used OSD theme."
msgstr "Nustatyti naudojamą ekrano temą."
msgid "Position"
msgstr "Pozicija"
msgid "Define the position of OSD."
msgstr "Nustatyti ekrano užsklandos poziciją."
msgid "Red limit [%]"
msgstr "Raudonoji ribą [%]"
msgid "Define a limit for red bar, which is used to indicate a bad signal."
msgstr "Nustatyti raudonos juostos ribą, kuri naudojama blogo signalo indikacijai."
msgid "Green limit [%]"
msgstr "Žalioji riba [%]"
msgid "Define a limit for green bar, which is used to indicate a good signal."
msgstr "Nustatyti žalios juostos ribą, kuri naudojama gero signalo indikacijai."
msgid "OSD update interval [0.1s]"
msgstr "Ekrano užsklandos atnaujinimo intervalas [0.1s]"
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
msgstr "Nustatyti ekrano užsklandos atnaujinimo intervalą. Mažesnis intervalas labiau apkrauna centrinį procesorių (CPU)."
msgid "Analyze stream"
msgstr "Analizuoti srautą"
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
msgstr "Nurodyti ar DVB srautas turi būti analizuojamas bei jo kokybė išskaičiuojama."
msgid "Calculation interval [0.1s]"
msgstr "Apskaitos intervalos [0.1s]"
msgid "Define an interval for calculation. The bigger interval generates more stable values."
msgstr "Nustatyti apskaitos intervalą. Kuo didesnis intervalas, tuo tikslesni duomenys."
msgid "Use SVDRP service"
msgstr "Naudoti SVDRP paslaugą"
msgid "Define whether the SVDRP service is used in client/server setups."
msgstr "Nurodyti ar SVDRP paslauga naudojama kliento/serverio nustatymuose."
msgid "SVDRP service port"
msgstr "SVDRP įrenginio portas"
msgid "Define the port number of SVDRP service."
msgstr "Nustatyti SVDRP įrenginio prievadą."
msgid "SVDRP service IP"
msgstr "SVDRP įrenginio IP"
msgid "Define the IP address of SVDRP service."
msgstr "Nustatyti SVDRP įrenginio IP adresą."
msgid "Help"
msgstr "Pagalba"
msgid "Video"
msgstr "Video"
msgid "Audio"
msgstr "Audio"
msgid "Transponder Information"
msgstr "Siųstuvo informacija"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Kodavimo dažnis"
msgid "Stream Information"
msgstr "Srauto informacija"
msgid "Video Stream"
msgstr "Video srautas"
msgid "Codec"
msgstr "Kodekas"
msgid "Bitrate"
msgstr "Kokybė"
msgid "Aspect Ratio"
msgstr "Proporcijos"
msgid "Frame Rate"
msgstr "Kadrų dažnis"
msgid "Video Format"
msgstr "Video formatas"
msgid "Resolution"
msgstr "Rezoliucija"
msgid "Audio Stream"
msgstr "Audio srautas"
msgid "Channel Mode"
msgstr "kanalo būsena"
msgid "Sampling Frequency"
msgstr "Parodomasis dažnis"
msgid "AC-3 Stream"
msgstr "AC-3 srautas"
msgid "Bit Stream Mode"
msgstr "Bitstream būsena"
msgid "Audio Coding Mode"
msgstr "Audio kodavimas"
msgid "Center Mix Level"
msgstr "Centerinis Mix lygis"
msgid "Surround Mix Level"
msgstr "Surround Mix lygis"
msgid "Dolby Surround Mode"
msgstr "Dolby Surround būklė"
msgid "Low Frequency Effects"
msgstr "Žemo dažnio efektai"
msgid "Dialogue Normalization"
msgstr "Dialogo normalizacija"
msgid "Fixed"
msgstr "Fest"
msgid "Analog"
msgstr "Analog"
msgid "MPEG-2"
msgstr "MPEG-2"
msgid "H.264"
msgstr "H.264"
msgid "MPEG-1 Layer I"
msgstr "MPEG-1 Layer I"
msgid "MPEG-1 Layer II"
msgstr "MPEG-1 Layer II"
msgid "MPEG-1 Layer III"
msgstr "MPEG-1 Layer III"
msgid "MPEG-2 Layer I"
msgstr "MPEG-2 Layer I"
msgid "MPEG-2 Layer II"
msgstr "MPEG-2 Layer II"
msgid "MPEG-2 Layer III"
msgstr "MPEG-2 Layer III"
msgid "HE-AAC"
msgstr "HE-AAC"
msgid "stereo"
msgstr "stereo"
msgid "joint Stereo"
msgstr "jungtinis stereo"
msgid "dual"
msgstr "dvigubas"
msgid "mono"
msgstr "mono"
msgid "interlaced"
msgstr "persipynęs (interlaced)"
msgid "progressive"
msgstr "progresyvinis"
msgid "reserved"
msgstr "belegt"
msgid "extended"
msgstr "išplėstas"
msgid "unknown"
msgstr "nežinomas"
msgid "component"
msgstr "komponentas"
msgid "PAL"
msgstr "PAL"
msgid "NTSC"
msgstr "NTSC"
msgid "SECAM"
msgstr "SECAM"
msgid "MAC"
msgstr "MAC"
msgid "Hz"
msgstr "Hz"
msgid "Complete Main (CM)"
msgstr "Pilnai pagrindinis (CM)"
msgid "Music and Effects (ME)"
msgstr "Muzika ir efektai (ME)"
msgid "Visually Impaired (VI)"
msgstr " (VI)"
msgid "Hearing Impaired (HI)"
msgstr " (HI)"
msgid "Dialogue (D)"
msgstr "Dialogas (D)"
msgid "Commentary (C)"
msgstr "Komentavimas (C)"
msgid "Emergency (E)"
msgstr "Avarinis (E)"
msgid "Voice Over (VO)"
msgstr "Voice over (VO)"
msgid "Karaoke"
msgstr "Karaoke"
msgid "Ch1"
msgstr "Kan1"
msgid "Ch2"
msgstr "Kan2"
msgid "C"
msgstr "C"
msgid "L"
msgstr "L"
msgid "R"
msgstr "R"
msgid "S"
msgstr "S"
msgid "SL"
msgstr "SL"
msgid "SR"
msgstr "SR"
msgid "dB"
msgstr "dB"
msgid "not indicated"
msgstr "nerasta"
msgid "MHz"
msgstr "MHz"
msgid "free"
msgstr "frei"
msgid "Mbit/s"
msgstr "Mbit/s"
msgid "kbit/s"
msgstr "kbit/s"

View File

@@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.6.4\n"
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2008-11-09 13:31+0200\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Vyacheslav Dikonov\n"
"Language-Team: <vdr@linuxtv.org>\n"
@@ -87,21 +87,6 @@ msgstr "
msgid "Define the position of OSD."
msgstr ""
msgid "Define the height of OSD."
msgstr ""
msgid "Horizontal offset"
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><> (%)"
@@ -180,15 +165,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"
@@ -246,12 +222,6 @@ msgstr ""
msgid "Low Frequency Effects"
msgstr ""
msgid "on"
msgstr "<22><><EFBFBD>"
msgid "off"
msgstr "<22><><EFBFBD><EFBFBD>"
msgid "Dialogue Normalization"
msgstr ""
@@ -261,36 +231,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 ""
@@ -330,15 +270,6 @@ msgstr ""
msgid "mono"
msgstr ""
msgid "none"
msgstr "<22><><EFBFBD>"
msgid "auto"
msgstr "<22><><EFBFBD><EFBFBD>"
msgid "MHz"
msgstr "<22><><EFBFBD>"
msgid "interlaced"
msgstr ""
@@ -429,6 +360,9 @@ msgstr "dB"
msgid "not indicated"
msgstr ""
msgid "MHz"
msgstr "<22><><EFBFBD>"
msgid "free"
msgstr ""

373
po/zh_CN.po Normal file
View File

@@ -0,0 +1,373 @@
# VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Nan Feng VDR <nfgx@21cn.com>, 2009.2
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2009-09-21 21:36+0800\n"
"Last-Translator: NanFeng <nfgx@21cn.com>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "DVB Signal Information Monitor (OSD)"
msgstr "卫星信号信息显示(OSD)"
msgid "Signal Information"
msgstr "频道信息浏览"
msgid "Femon not available"
msgstr "Femon插件无法使用"
msgid "basic"
msgstr "基本"
msgid "transponder"
msgstr "转发器"
msgid "stream"
msgstr "数据流"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "经典"
msgid "Elchi"
msgstr "Elchi"
msgid "ST:TNG"
msgstr "ST:TNG"
msgid "DeepBlue"
msgstr "DeepBlue"
msgid "Moronimo"
msgstr "Moronimo"
msgid "Enigma"
msgstr "Enigma"
msgid "EgalsTry"
msgstr "EgalsTry"
msgid "Duotone"
msgstr "双色调"
msgid "SilverGreen"
msgstr "银绿"
msgid "Hide main menu entry"
msgstr "隐藏主菜单条目."
msgid "Define whether the main menu entry is hidden."
msgstr "确定是否进入主菜单是隐藏的."
msgid "Default display mode"
msgstr "默认启动时显示模式."
msgid "Define the default display mode at startup."
msgstr "定义默认启动时显示模式."
msgid "Define the used OSD skin."
msgstr "确定使用的菜单皮肤."
msgid "Define the used OSD theme."
msgstr "确定使用的菜单主题."
msgid "Position"
msgstr "位置"
msgid "Define the position of OSD."
msgstr "确定菜单的位置."
msgid "Red limit [%]"
msgstr "红限制[ ]"
msgid "Define a limit for red bar, which is used to indicate a bad signal."
msgstr "定义一个限制红键,这是用来表示一个坏的信号."
msgid "Green limit [%]"
msgstr "绿限制[ ]"
msgid "Define a limit for green bar, which is used to indicate a good signal."
msgstr "定义一个限制的绿色键,这是用来表示一个良好的信号."
msgid "OSD update interval [0.1s]"
msgstr "菜单更新间隔时间 [0.1s]"
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
msgstr "确定一个OSD的更新时间间隔.较小的间隔产生较高的CPU负载."
msgid "Analyze stream"
msgstr "分析流"
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
msgstr "确定是否DVB流分析和比特率计算."
msgid "Calculation interval [0.1s]"
msgstr "计算时间间隔 [0.1s]"
msgid "Define an interval for calculation. The bigger interval generates more stable values."
msgstr "定义一个时间间隔来计算.更大的时间价格产生将更稳定."
msgid "Use SVDRP service"
msgstr "使用SVDRP服务"
msgid "Define whether the SVDRP service is used in client/server setups."
msgstr "定义是否SVDRP服务是用来在客户机/服务器的设置."
msgid "SVDRP service port"
msgstr "SVDRP服务端口"
msgid "Define the port number of SVDRP service."
msgstr "定义SVDRP服务的端口号."
msgid "SVDRP service IP"
msgstr "SVDRP服务的IP地址"
msgid "Define the IP address of SVDRP service."
msgstr "定义SVDRP服务的IP地址."
msgid "Help"
msgstr "帮助"
msgid "Video"
msgstr "视频"
msgid "Audio"
msgstr "音频"
msgid "Transponder Information"
msgstr "转发器信息"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "码速率"
msgid "Stream Information"
msgstr "流信息"
msgid "Video Stream"
msgstr "视频流"
msgid "Codec"
msgstr "解码模式"
msgid "Bitrate"
msgstr "比特率"
msgid "Aspect Ratio"
msgstr "纵横比"
msgid "Frame Rate"
msgstr "帧速率"
msgid "Video Format"
msgstr "视频制式"
msgid "Resolution"
msgstr "分辨率"
msgid "Audio Stream"
msgstr "音频流"
msgid "Channel Mode"
msgstr "声道模式"
msgid "Sampling Frequency"
msgstr "采样频率"
msgid "AC-3 Stream"
msgstr "AC-3流"
msgid "Bit Stream Mode"
msgstr "比特流模式"
msgid "Audio Coding Mode"
msgstr "音频编码模式"
msgid "Center Mix Level"
msgstr "中心混合级别"
msgid "Surround Mix Level"
msgstr "环绕混合级别"
msgid "Dolby Surround Mode"
msgstr "杜比环绕声模式"
msgid "Low Frequency Effects"
msgstr "低频效果"
msgid "Dialogue Normalization"
msgstr "对话正常化"
msgid "Fixed"
msgstr "固定"
msgid "Analog"
msgstr "模拟"
msgid "MPEG-2"
msgstr "MPEG-2"
msgid "H.264"
msgstr "H.264"
msgid "MPEG-1 Layer I"
msgstr "MPEG-1 Layer I"
msgid "MPEG-1 Layer II"
msgstr "MPEG-1 Layer II"
msgid "MPEG-1 Layer III"
msgstr "MPEG-1 Layer III"
msgid "MPEG-2 Layer I"
msgstr "MPEG-2 Layer I"
msgid "MPEG-2 Layer II"
msgstr "MPEG-2 Layer II"
msgid "MPEG-2 Layer III"
msgstr "MPEG-2 Layer III"
msgid "HE-AAC"
msgstr "HE-AAC"
msgid "stereo"
msgstr "立体声"
msgid "joint Stereo"
msgstr "联合立体声"
msgid "dual"
msgstr "双重"
msgid "mono"
msgstr "单声道"
msgid "interlaced"
msgstr "隔行扫描"
msgid "progressive"
msgstr "进步"
msgid "reserved"
msgstr "保留"
msgid "extended"
msgstr "扩展"
msgid "unknown"
msgstr "未知"
msgid "component"
msgstr "组件"
msgid "PAL"
msgstr "PAL"
msgid "NTSC"
msgstr "NTSC"
msgid "SECAM"
msgstr "SECAM"
msgid "MAC"
msgstr "MAC"
msgid "Hz"
msgstr "赫兹"
msgid "Complete Main (CM)"
msgstr "完成主要 (CM)"
msgid "Music and Effects (ME)"
msgstr "音乐和效果 (ME)"
msgid "Visually Impaired (VI)"
msgstr "视障 (VI)"
msgid "Hearing Impaired (HI)"
msgstr "听障 (HI)"
msgid "Dialogue (D)"
msgstr "对话 (D)"
msgid "Commentary (C)"
msgstr "评论 (C)"
msgid "Emergency (E)"
msgstr "紧急 (E)"
msgid "Voice Over (VO)"
msgstr "旁白 (VO)"
msgid "Karaoke"
msgstr "卡拉OK"
msgid "Ch1"
msgstr "Ch1"
msgid "Ch2"
msgstr "Ch2"
msgid "C"
msgstr "C"
msgid "L"
msgstr "L"
msgid "R"
msgstr "R"
msgid "S"
msgstr "S"
msgid "SL"
msgstr "SL"
msgid "SR"
msgstr "SR"
msgid "dB"
msgstr "dB"
msgid "not indicated"
msgstr "没有说明"
msgid "MHz"
msgstr "兆赫兹"
msgid "free"
msgstr "免费"
msgid "Mbit/s"
msgstr "兆位/秒"
msgid "kbit/s"
msgstr "千字节/秒"

373
po/zh_TW.po Normal file
View File

@@ -0,0 +1,373 @@
# VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Nan Feng VDR <nfgx@21cn.com>, 2009.2
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2009-09-21 21:36+0800\n"
"Last-Translator: NanFeng <nfgx@21cn.com>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "DVB Signal Information Monitor (OSD)"
msgstr "衛星信號信息顯示(OSD)"
msgid "Signal Information"
msgstr "頻道信息瀏覽"
msgid "Femon not available"
msgstr "Femon插件無法使用"
msgid "basic"
msgstr "基本"
msgid "transponder"
msgstr "轉發器"
msgid "stream"
msgstr "數據流"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "經典"
msgid "Elchi"
msgstr "Elchi"
msgid "ST:TNG"
msgstr "ST:TNG"
msgid "DeepBlue"
msgstr "DeepBlue"
msgid "Moronimo"
msgstr "Moronimo"
msgid "Enigma"
msgstr "Enigma"
msgid "EgalsTry"
msgstr "EgalsTry"
msgid "Duotone"
msgstr "雙色調"
msgid "SilverGreen"
msgstr "銀綠"
msgid "Hide main menu entry"
msgstr "隱藏主菜單條目."
msgid "Define whether the main menu entry is hidden."
msgstr "確定是否進入主菜單是隱藏的."
msgid "Default display mode"
msgstr "默認啟動時顯示模式."
msgid "Define the default display mode at startup."
msgstr "定義默認啟動時顯示模式."
msgid "Define the used OSD skin."
msgstr "確定使用的菜單皮膚."
msgid "Define the used OSD theme."
msgstr "確定使用的菜單主題."
msgid "Position"
msgstr "位置"
msgid "Define the position of OSD."
msgstr "確定菜單的位置."
msgid "Red limit [%]"
msgstr "紅限制[ ]"
msgid "Define a limit for red bar, which is used to indicate a bad signal."
msgstr "定義一個限制紅鍵,這是用來表示一個壞的信號."
msgid "Green limit [%]"
msgstr "綠限制[ ]"
msgid "Define a limit for green bar, which is used to indicate a good signal."
msgstr "定義一個限制的綠色鍵,這是用來表示一個良好的信號."
msgid "OSD update interval [0.1s]"
msgstr "菜單更新間隔時間[0.1s]"
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
msgstr "確定一個OSD的更新時間間隔.較小的間隔產生較高的CPU負載."
msgid "Analyze stream"
msgstr "分析流"
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
msgstr "確定是否DVB流分析和比特率計算."
msgid "Calculation interval [0.1s]"
msgstr "計算時間間隔[0.1s]"
msgid "Define an interval for calculation. The bigger interval generates more stable values."
msgstr "定義一個時間間隔來計算.更大的時間價格產生將更穩定."
msgid "Use SVDRP service"
msgstr "使用SVDRP服務"
msgid "Define whether the SVDRP service is used in client/server setups."
msgstr "定義是否SVDRP服務是用來在客戶機/服務器的設置."
msgid "SVDRP service port"
msgstr "SVDRP服務端口"
msgid "Define the port number of SVDRP service."
msgstr "定義SVDRP服務的端口號."
msgid "SVDRP service IP"
msgstr "SVDRP服務的IP地址"
msgid "Define the IP address of SVDRP service."
msgstr "定義SVDRP服務的IP地址."
msgid "Help"
msgstr "幫助"
msgid "Video"
msgstr "視頻"
msgid "Audio"
msgstr "音頻"
msgid "Transponder Information"
msgstr "轉發器信息"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "碼速率"
msgid "Stream Information"
msgstr "流信息"
msgid "Video Stream"
msgstr "視頻流"
msgid "Codec"
msgstr "解碼模式"
msgid "Bitrate"
msgstr "比特率"
msgid "Aspect Ratio"
msgstr "縱橫比"
msgid "Frame Rate"
msgstr "幀速率"
msgid "Video Format"
msgstr "視頻制式"
msgid "Resolution"
msgstr "分辨率"
msgid "Audio Stream"
msgstr "音頻流"
msgid "Channel Mode"
msgstr "聲道模式"
msgid "Sampling Frequency"
msgstr "採樣頻率"
msgid "AC-3 Stream"
msgstr "AC-3流"
msgid "Bit Stream Mode"
msgstr "比特流模式"
msgid "Audio Coding Mode"
msgstr "音頻編碼模式"
msgid "Center Mix Level"
msgstr "中心混合級別"
msgid "Surround Mix Level"
msgstr "環繞混合級別"
msgid "Dolby Surround Mode"
msgstr "杜比環繞聲模式"
msgid "Low Frequency Effects"
msgstr "低頻效果"
msgid "Dialogue Normalization"
msgstr "對話正常化"
msgid "Fixed"
msgstr "固定"
msgid "Analog"
msgstr "模擬"
msgid "MPEG-2"
msgstr "MPEG-2"
msgid "H.264"
msgstr "H.264"
msgid "MPEG-1 Layer I"
msgstr "MPEG-1 Layer I"
msgid "MPEG-1 Layer II"
msgstr "MPEG-1 Layer II"
msgid "MPEG-1 Layer III"
msgstr "MPEG-1 Layer III"
msgid "MPEG-2 Layer I"
msgstr "MPEG-2 Layer I"
msgid "MPEG-2 Layer II"
msgstr "MPEG-2 Layer II"
msgid "MPEG-2 Layer III"
msgstr "MPEG-2 Layer III"
msgid "HE-AAC"
msgstr "HE-AAC"
msgid "stereo"
msgstr "立體聲"
msgid "joint Stereo"
msgstr "聯合立體聲"
msgid "dual"
msgstr "雙重"
msgid "mono"
msgstr "單聲道"
msgid "interlaced"
msgstr "隔行掃描"
msgid "progressive"
msgstr "進步"
msgid "reserved"
msgstr "保留"
msgid "extended"
msgstr "擴展"
msgid "unknown"
msgstr "未知"
msgid "component"
msgstr "組件"
msgid "PAL"
msgstr "PAL"
msgid "NTSC"
msgstr "NTSC"
msgid "SECAM"
msgstr "SECAM"
msgid "MAC"
msgstr "MAC"
msgid "Hz"
msgstr "赫茲"
msgid "Complete Main (CM)"
msgstr "完成主要(CM)"
msgid "Music and Effects (ME)"
msgstr "音樂和效果(ME)"
msgid "Visually Impaired (VI)"
msgstr "視障(VI)"
msgid "Hearing Impaired (HI)"
msgstr "聽障(HI)"
msgid "Dialogue (D)"
msgstr "對話(D)"
msgid "Commentary (C)"
msgstr "評論(C)"
msgid "Emergency (E)"
msgstr "緊急(E)"
msgid "Voice Over (VO)"
msgstr "旁白(VO)"
msgid "Karaoke"
msgstr "卡拉OK"
msgid "Ch1"
msgstr "Ch1"
msgid "Ch2"
msgstr "Ch2"
msgid "C"
msgstr "C"
msgid "L"
msgstr "L"
msgid "R"
msgstr "R"
msgid "S"
msgstr "S"
msgid "SL"
msgstr "SL"
msgid "SR"
msgstr "SR"
msgid "dB"
msgstr "dB"
msgid "not indicated"
msgstr "沒有說明"
msgid "MHz"
msgstr "兆赫茲"
msgid "free"
msgstr "免費"
msgid "Mbit/s"
msgstr "兆位/秒"
msgid "kbit/s"
msgstr "千字節/秒"

23
symbols/eight.xpm Normal file
View File

@@ -0,0 +1,23 @@
/* XPM */
static const char *const eight_xpm[] = {
"15 18 2 1",
". c #FFFFFF",
"+ c #000000",
"+++++++++++++++",
"..............+",
".....++++.....+",
"....++++++....+",
"....++..++....+",
"...++....++...+",
"...++....++...+",
"....++..++....+",
".....++++.....+",
".....++++.....+",
"....++..++....+",
"...++....++...+",
"...++....++...+",
"....++..++....+",
"....++++++....+",
".....++++.....+",
"..............+",
"+++++++++++++++"};

23
symbols/format1080.xpm Normal file
View File

@@ -0,0 +1,23 @@
/* XPM */
static const char *const format1080_xpm[] = {
"40 18 2 1",
". c #FFFFFF",
"+ c #000000",
"++++++++++++++++++++++++++++++++++++++++",
"+......................................+",
"+......++...++++.....++++.....++++.....+",
"+...+++++..++++++...++++++...++++++....+",
"+...+++++..++..++...++..++...++..++....+",
"+......++.++....++.++....++.++....++...+",
"+......++.++....++.++....++.++....++...+",
"+......++.++....++..++..++..++....++...+",
"+......++.++....++...++++...++....++...+",
"+......++.++....++...++++...++....++...+",
"+......++.++....++..++..++..++....++...+",
"+......++.++....++.++....++.++....++...+",
"+......++.++....++.++....++.++....++...+",
"+......++..++..++...++..++...++..++....+",
"+......++..++++++...++++++...++++++....+",
"+......++...++++.....++++.....++++.....+",
"+......................................+",
"++++++++++++++++++++++++++++++++++++++++"};

23
symbols/format480.xpm Normal file
View File

@@ -0,0 +1,23 @@
/* XPM */
static const char *const format480_xpm[] = {
"35 18 2 1",
". c #FFFFFF",
"+ c #000000",
"+++++++++++++++++++++++++++++++++++",
"+.................................+",
"+.........++....++++.....++++.....+",
"+........+++...++++++...++++++....+",
"+.......++++...++..++...++..++....+",
"+......++.++..++....++.++....++...+",
"+.....++..++..++....++.++....++...+",
"+.....++..++...++..++..++....++...+",
"+....++...++....++++...++....++...+",
"+...++....++....++++...++....++...+",
"+...+++++++++..++..++..++....++...+",
"+...+++++++++.++....++.++....++...+",
"+.........++..++....++.++....++...+",
"+.........++...++..++...++..++....+",
"+.........++...++++++...++++++....+",
"+.........++....++++.....++++.....+",
"+.................................+",
"+++++++++++++++++++++++++++++++++++"};

23
symbols/format576.xpm Normal file
View File

@@ -0,0 +1,23 @@
/* XPM */
static const char *const format576_xpm[] = {
"33 18 2 1",
". c #FFFFFF",
"+ c #000000",
"+++++++++++++++++++++++++++++++++",
"+...............................+",
"+...+++++++.++++++++..++++++....+",
"+...+++++++.++++++++.++++++++...+",
"+...++......++....++.+++...++...+",
"+...++............++.++.........+",
"+...++...........+++.++.........+",
"+...++++++.......++..++.+++.....+",
"+...+++++++......++..+++++++....+",
"+...++...+++....+++..+++..+++...+",
"+.........++....++...++....++...+",
"+.........++....++...++....++...+",
"+...++....++...+++...++....++...+",
"+...++...+++...++....+++..+++...+",
"+...+++++++....++....+++++++....+",
"+....+++++.....++.....+++++.....+",
"+...............................+",
"+++++++++++++++++++++++++++++++++"};

23
symbols/format720.xpm Normal file
View File

@@ -0,0 +1,23 @@
/* XPM */
static const char *const format720_xpm[] = {
"34 18 2 1",
". c #FFFFFF",
"+ c #000000",
"++++++++++++++++++++++++++++++++++",
"+................................+",
"+...++++++++...++++.....++++.....+",
"+...++++++++.+++++++...++++++....+",
"+...++....++.++....++..++..++....+",
"+.........++.......++.++....++...+",
"+.........++.......++.++....++...+",
"+.........++.......++.++....++...+",
"+........++......+++..++....++...+",
"+.......+++.....+++...++....++...+",
"+.......++.....+++....++....++...+",
"+.......++....+++.....++....++...+",
"+......+++...+++......++....++...+",
"+......++....++........++..++....+",
"+......++....++++++++..++++++....+",
"+......++....++++++++...++++.....+",
"+................................+",
"++++++++++++++++++++++++++++++++++"};