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

Compare commits

..

36 Commits

Author SHA1 Message Date
Rolf Ahrenberg
5b5f704ea8 Removed cppcheck warnings and updated HISTORY. 2012-04-02 19:25:31 +03:00
Rolf Ahrenberg
2d849b4fb8 Added transponder info window support for IPTV devices. 2012-04-01 22:39:33 +03:00
Rolf Ahrenberg
0e6457ab42 Added an info line for IPTV devices. 2012-03-31 13:22:11 +03:00
Rolf Ahrenberg
0f8cc6c9ce Modified cFemonReceiver constructor. 2012-03-31 11:47:57 +03:00
Rolf Ahrenberg
f1d9b112a4 Added a new theme: PearlHD (Thanks to Taipan @ VDRPortal). 2012-03-30 20:48:25 +03:00
Rolf Ahrenberg
4431cf57d9 Silenced error log messages when accessing pseudo devices. 2012-03-29 23:31:44 +03:00
Rolf Ahrenberg
18840de217 Added the dynamite compatibility patch (Thanks to Lars Hanisch). 2012-03-29 21:48:52 +03:00
Rolf Ahrenberg
315a3365ba Updated for vdr-1.7.27. 2012-03-25 16:55:42 +03:00
Rolf Ahrenberg
8e1e025b0f Updated default CXXFLAGS. 2012-03-25 16:02:16 +03:00
Rolf Ahrenberg
543accdd06 Cleaned up compilation warnings again. 2012-03-19 18:09:16 +02:00
Rolf Ahrenberg
66eca7f8b5 Fixed channel switching.
Cleaned up compilation warnings.
2012-03-12 21:59:34 +02:00
Rolf Ahrenberg
905b7c0870 Updated for a new release version. 2012-03-10 23:07:03 +02:00
Rolf Ahrenberg
597425a271 Updated for vdr-1.7.26. 2012-03-10 23:05:38 +02:00
Rolf Ahrenberg
86210928b8 Updated for vdr-1.7.25. 2012-03-03 15:19:18 +02:00
Rolf Ahrenberg
c98fe8ca87 Added a GIT tag into the version string. 2012-02-26 22:54:18 +02:00
Rolf Ahrenberg
5598f7cc43 Silenced compilation warnings. 2012-02-19 18:54:19 +02:00
Rolf Ahrenberg
62f1f5f776 Updated Makefile. 2012-02-19 17:48:21 +02:00
Rolf Ahrenberg
8ba74bf5c4 Silenced compilation warnings - again. 2012-02-05 18:21:07 +02:00
Rolf Ahrenberg
38fbb2d47d Updated translation files. 2012-02-05 14:08:01 +02:00
Rolf Ahrenberg
09cf40f215 Added initial support for PVRINPUT devices (Thanks to Winfried Köhler).
Added initial support for IPTV devices.
2012-02-05 14:04:04 +02:00
Rolf Ahrenberg
d809e98052 Silenced a compilation warning. 2012-02-05 11:39:14 +02:00
Rolf Ahrenberg
5e16064c33 Fixed an invalid character. 2012-01-15 23:25:31 +02:00
Rolf Ahrenberg
cf8920ddd6 Updated for vdr-1.7.23.
Updated SVDRP interface.
2012-01-15 23:07:53 +02:00
Rolf Ahrenberg
1e3b10faa7 Added Hungarian translation (Thanks to Fuley Istvan) and incremented version number. 2011-12-23 15:28:06 +02:00
Rolf Ahrenberg
b7a41c8d78 Merge branch 'master' of ssh://arabuusimiehet.com/git/femon 2011-12-09 16:00:40 +02:00
Rolf Ahrenberg
3b776594ef Adapted cFemonBitStream for vdr-1.7.22. 2011-12-04 19:30:24 +02:00
Rolf Ahrenberg
635f99fda6 Merge branch 'master' of ssh://arabuusimiehet.com/git/femon 2011-11-28 16:30:56 +02:00
Rolf Ahrenberg
313bbd10ef Fixed scan/framerate settings in the H.264 analyzer. 2011-11-27 14:18:43 +02:00
Rolf Ahrenberg
7ab150cd3c Added some new symbols. 2011-11-27 02:09:27 +02:00
Rolf Ahrenberg
0f45bd7f51 Fixed scan/framerate settings in the H.264 analyzer. 2011-11-21 13:48:46 +02:00
Rolf Ahrenberg
f1cb78664c Cleaned up some whitespace bugs. 2011-11-20 19:04:24 +02:00
Rolf Ahrenberg
f1a671650f Enchanced both progressive frame and frame rate detection. 2011-11-19 19:56:51 +02:00
Rolf Ahrenberg
ac4d414597 Refactored bitstream code. 2011-11-19 16:02:16 +02:00
Rolf Ahrenberg
5003faabc4 Updated for vdr-1.7.19: New API functions for signal strength and quality used to provide information for the OSD. 2011-09-03 23:00:33 +03:00
Rolf Ahrenberg
131a61c80c Updated I18N target. 2011-06-19 16:55:07 +03:00
Rolf Ahrenberg
c408ea1cd9 Added cppcheck target into Makefile. 2011-06-15 17:50:03 +03:00
43 changed files with 1524 additions and 658 deletions

39
HISTORY
View File

@@ -414,3 +414,42 @@ VDR Plugin 'femon' Revision History
- Updated for vdr-1.7.18.
- Added scaling for symbols.
2011-12-04: Version 1.7.11
- Updated for vdr-1.7.22: New API functions for signal strength
and quality used to provide information for the OSD.
- Added cppcheck target into Makefile.
- Refactored bitstream code.
2012-01-15: Version 1.7.12
- Updated for vdr-1.7.23.
- Updated SVDRP interface.
- Added Hungarian translation (Thanks to Fuley Istvan).
2012-02-05: Version 1.7.13
- Added initial support for PVRINPUT devices (Thanks to Winfried Köhler).
- Added initial support for IPTV devices.
2012-03-10: Version 1.7.14
- Updated for vdr-1.7.26.
2012-03-12: Version 1.7.15
- Cleaned up compilation warnings.
- Fixed channel switching.
2012-03-25: Version 1.7.16
- Updated for vdr-1.7.27.
- Cleaned up compilation warnings again.
2012-04-02: Version 1.7.17
- Added the dynamite compatibility patch (Thanks to Lars Hanisch).
- Silenced error log messages when accessing pseudo devices.
- Added a new theme: PearlHD (Thanks to Taipan @ VDRPortal).
- Added the transponder info window support for IPTV devices.

View File

@@ -19,18 +19,19 @@ PLUGIN = femon
### The version number of this plugin (taken from the main source file):
VERSION = $(shell grep 'static const char VERSION\[\] *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
GITTAG = $(shell git describe --always 2>/dev/null)
### The C++ compiler and options:
CXX ?= g++
CXXFLAGS ?= -fPIC -g -O3 -Wall -Wextra -Wswitch-default -Wfloat-equal -Wundef -Wpointer-arith -Wconversion -Wcast-align -Wredundant-decls -Wno-unused-parameter -Woverloaded-virtual -Wno-parentheses
CXXFLAGS ?= -fPIC -g -O3 -Wall -Wextra -Wswitch-default -Wfloat-equal -Wundef -Wpointer-arith -Wconversion -Wcast-align -Wredundant-decls -Wno-unused-parameter -Werror=overloaded-virtual -Wno-parentheses
LDFLAGS ?= -Wl,--as-needed
### The directory environment:
VDRDIR = ../../..
LIBDIR = ../../lib
TMPDIR = /tmp
VDRDIR ?= ../../..
LIBDIR ?= ../../lib
TMPDIR ?= /tmp
### Make sure that necessary options are included:
@@ -59,6 +60,10 @@ ifdef FEMON_DEBUG
DEFINES += -DDEBUG
endif
ifneq ($(strip $(GITTAG)),)
DEFINES += -DGITVERSION='"-GIT-$(GITTAG)"'
endif
.PHONY: all all-redirect
all-redirect: all
@@ -96,7 +101,7 @@ I18Npot = $(PODIR)/$(PLUGIN).pot
msgfmt -c -o $@ $<
$(I18Npot): $(wildcard *.c)
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name='vdr-$(PLUGIN)' --package-version='$(VERSION)' --msgid-bugs-address='<see README>' -o $@ $^
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name='vdr-$(PLUGIN)' --package-version='$(VERSION)' --msgid-bugs-address='<see README>' -o $@ `ls $^`
%.po: $(I18Npot)
msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
@@ -128,3 +133,6 @@ dist: $(I18Npo) clean
clean:
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ $(PODIR)/*.mo $(PODIR)/*.pot
cppcheck: $(OBJS)
@cppcheck --enable=information,style,unusedFunction -v -f $(OBJS:%.o=%.c)

8
README
View File

@@ -32,15 +32,15 @@ Terminology:
--------------------------------------------------------------
|## Channel Name ################### [SVDRP][AR][VF][A/DD][D]|
|[=====Signal Strength in % ==============|=================]|
|[=====Signal-to-Noise Ratio in % ========|=================]|
|[=====Signal Strength ===================|=================]|
|[=====Signal Quality ================|=====================]|
| STR: #0000 (0%) BER: #00000000 Video: 0 Mbit/s |
| SNR: #0000 (0%) UNC: #00000000 Audio: 0 kbit/s |
| [LOCK] [SIGNAL] [CARRIER] [VITERBI] [SYNC] |
--------------------------------------------------------------
STR - Signal strength
SNR - Signal-to-noise ratio
STR - Signal strength from driver
SNR - Signal-to-noise ratio from driver
BER - Bit error rate
UNC - Uncorrected blocks
Video - Calculated video bitrate in Mbit/s

97
femon.c
View File

@@ -14,11 +14,15 @@
#include "femonservice.h"
#include "femontools.h"
#if defined(APIVERSNUM) && APIVERSNUM < 10718
#error "VDR-1.7.18 API version or greater is required!"
#if defined(APIVERSNUM) && APIVERSNUM < 10727
#error "VDR-1.7.27 API version or greater is required!"
#endif
static const char VERSION[] = "1.7.10";
#ifndef GITVERSION
#define GITVERSION ""
#endif
static const char VERSION[] = "1.7.17" GITVERSION;
static const char DESCRIPTION[] = trNOOP("DVB Signal Information Monitor (OSD)");
static const char MAINMENUENTRY[] = trNOOP("Signal Information");
@@ -134,14 +138,14 @@ bool cPluginFemon::Service(const char *Id, void *Data)
if (Data) {
FemonService_v1_0 *data = (FemonService_v1_0*)Data;
if (!cDevice::ActualDevice())
return false;
int ndx = cDevice::ActualDevice()->CardIndex();
data->fe_name = getFrontendName(ndx);
data->fe_status = getFrontendStatus(ndx);
data->fe_snr = getSNR(ndx);
data->fe_signal = getSignal(ndx);
data->fe_ber = getBER(ndx);
data->fe_unc = getUNC(ndx);
return false;
cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice());
data->fe_name = getFrontendName(dev);
data->fe_status = getFrontendStatus(dev);
data->fe_snr = getSNR(dev);
data->fe_signal = getSignal(dev);
data->fe_ber = getBER(dev);
data->fe_unc = getUNC(dev);
data->video_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetVideoBitrate() : 0.0;
data->audio_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetAudioBitrate() : 0.0;
data->dolby_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetDolbyBitrate() : 0.0;
@@ -153,7 +157,7 @@ bool cPluginFemon::Service(const char *Id, void *Data)
}
const char **cPluginFemon::SVDRPHelpPages(void)
{
{
static const char *HelpPages[] = {
"OPEN\n"
" Open femon plugin.",
@@ -163,26 +167,30 @@ const char **cPluginFemon::SVDRPHelpPages(void)
" Switch to next possible device.",
"PREV\n"
" Switch to previous possible device.",
"INFO\n"
" Print the current frontend information.",
"NAME\n"
" Print the current frontend name.",
"STAT\n"
" Print the current frontend status.",
"SGNL\n"
" Print the current signal strength.",
"SNRA\n"
" Print the current signal-to-noise ratio.",
"BERA\n"
" Print the current bit error rate.",
"UNCB\n"
" Print the current uncorrected blocks rate.",
"INFO <card index>\n"
" Print the frontend information.",
"NAME <card index>\n"
" Print the frontend name.",
"STAT <card index>\n"
" Print the frontend status.",
"STRG <card index>\n"
" Print the signal strength.",
"QUAL <card index>\n"
" Print the signal quality.",
"SGNL <card index>\n"
" Print the signal strength from driver.",
"SNRA <card index>\n"
" Print the signal-to-noise ratio from driver.",
"BERA <card index>\n"
" Print the bit error rate.",
"UNCB <card index>\n"
" Print the uncorrected blocks rate.",
"VIBR\n"
" Print the actual device and current video bitrate [Mbit/s].",
" Print the current video bitrate [Mbit/s].",
"AUBR\n"
" Print the actual device and current audio bitrate [kbit/s].",
" Print the current audio bitrate [kbit/s].",
"DDBR\n"
" Print the actual device and current dolby bitrate [kbit/s].",
" Print the current dolby bitrate [kbit/s].",
NULL
};
return HelpPages;
@@ -190,6 +198,12 @@ const char **cPluginFemon::SVDRPHelpPages(void)
cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode)
{
cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice());
if (*Option && isnumber(Option)) {
cDvbDevice *dev2 = dynamic_cast<cDvbDevice*>(cDevice::GetDevice(int(strtol(Option, NULL, 10))));
if (dev2)
dev = dev2;
}
if (strcasecmp(Command, "OPEN") == 0) {
if (cReplayControl::NowReplaying()) {
ReplyCode = 550; // Requested action not taken
@@ -217,27 +231,33 @@ cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int
return cString("Cannot switch device");
}
else if (strcasecmp(Command, "INFO") == 0) {
return getFrontendInfo(cDevice::ActualDevice()->CardIndex());
return getFrontendInfo(dev);
}
else if (strcasecmp(Command, "NAME") == 0) {
return getFrontendName(cDevice::ActualDevice()->CardIndex());
return getFrontendName(dev);
}
else if (strcasecmp(Command, "STAT") == 0) {
return getFrontendStatus(cDevice::ActualDevice()->CardIndex());
return getFrontendStatus(dev);
}
else if (strcasecmp(Command, "STRG") == 0) {
return cString::sprintf("%d on device #%d", dev->SignalStrength(), dev->CardIndex());
}
else if (strcasecmp(Command, "QUAL") == 0) {
return cString::sprintf("%d on device #%d", dev->SignalQuality(), dev->CardIndex());
}
else if (strcasecmp(Command, "SGNL") == 0) {
int value = getSignal(cDevice::ActualDevice()->CardIndex());
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, cDevice::ActualDevice()->CardIndex());
int value = getSignal(dev);
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, dev->CardIndex());
}
else if (strcasecmp(Command, "SNRA") == 0) {
int value = getSNR(cDevice::ActualDevice()->CardIndex());
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, cDevice::ActualDevice()->CardIndex());
int value = getSNR(dev);
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, dev->CardIndex());
}
else if (strcasecmp(Command, "BERA") == 0) {
return cString::sprintf("%08X on device #%d", getBER(cDevice::ActualDevice()->CardIndex()), cDevice::ActualDevice()->CardIndex());
return cString::sprintf("%08X on device #%d", getBER(dev), dev->CardIndex());
}
else if (strcasecmp(Command, "UNCB") == 0) {
return cString::sprintf("%08X on device #%d", getUNC(cDevice::ActualDevice()->CardIndex()), cDevice::ActualDevice()->CardIndex());
return cString::sprintf("%08X on device #%d", getUNC(dev), dev->CardIndex());
}
else if (strcasecmp(Command, "VIBR") == 0) {
if (cFemonOsd::Instance())
@@ -295,6 +315,7 @@ cMenuFemonSetup::cMenuFemonSetup(void)
themes[eFemonThemeEgalsTry] = tr("EgalsTry");
themes[eFemonThemeDuotone] = tr("Duotone");
themes[eFemonThemeSilverGreen] = tr("SilverGreen");
themes[eFemonThemePearlHD] = tr("PearlHD");
data = femonConfig;
Setup();

View File

@@ -10,7 +10,7 @@
#define IS_HEAAC_AUDIO(buf) (((buf)[0] == 0xFF) && (((buf)[1] & 0xF6) == 0xF0))
unsigned int cFemonAAC::s_Samplerates[16] =
int cFemonAAC::s_Samplerates[16] =
{
96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, -1, -1, -1, -1
};
@@ -26,7 +26,7 @@ cFemonAAC::~cFemonAAC()
bool cFemonAAC::processAudio(const uint8_t *buf, int len)
{
cBitStream bs(buf, len * 8);
cFemonBitStream bs(buf, len * 8);
if (!m_AudioHandler)
return false;
@@ -48,23 +48,23 @@ bool cFemonAAC::processAudio(const uint8_t *buf, int len)
// skip PES header
if (!PesLongEnough(len))
return false;
bs.skipBits(8 * PesPayloadOffset(buf));
bs.SkipBits(8 * PesPayloadOffset(buf));
// HE-AAC audio detection
if (bs.getBits(12) != 0xFFF) // syncword
if (bs.GetBits(12) != 0xFFF) // syncword
return false;
bs.skipBit(); // id
bs.SkipBit(); // id
// layer must be 0
if (bs.getBits(2)) // layer
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
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);

View File

@@ -14,7 +14,7 @@ class cFemonAAC {
private:
cFemonAudioIf *m_AudioHandler;
static unsigned int s_Samplerates[16];
static int s_Samplerates[16];
public:
cFemonAAC(cFemonAudioIf *audiohandler);

View File

@@ -9,17 +9,17 @@
#include "femontools.h"
#include "femonac3.h"
unsigned int cFemonAC3::s_Bitrates[32] =
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
};
unsigned int cFemonAC3::s_Frequencies[4] =
int cFemonAC3::s_Frequencies[4] =
{
480, 441, 320, 0
};
unsigned int cFemonAC3::s_Frames[3][32] =
int cFemonAC3::s_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},
@@ -41,7 +41,7 @@ bool cFemonAC3::processAudio(const uint8_t *buf, int len)
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);
cFemonBitStream bs(buf, len * 8);
if (!m_AudioHandler)
return false;
@@ -49,34 +49,34 @@ bool cFemonAC3::processAudio(const uint8_t *buf, int len)
// skip PES header
if (!PesLongEnough(len))
return false;
bs.skipBits(8 * PesPayloadOffset(buf));
bs.SkipBits(8 * PesPayloadOffset(buf));
// http://rmworkshop.com/dvd_info/related_info/ac3hdr.htm
// AC3 audio detection
if (bs.getU16() != 0x0B77) // syncword
if (bs.GetBits(16) != 0x0B77) // syncword
return false;
bs.skipBits(16); // CRC1
bs.SkipBits(16); // CRC1
fscod = bs.getBits(2); // sampling rate values
frmsizcod = bs.getBits(6); // frame size code
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
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);
centermixlevel = bs.GetBits(2);
// if a surround channel exists
if (acmod & 0x04)
surroundmixlevel = bs.getBits(2);
surroundmixlevel = bs.GetBits(2);
// if in 2/0 mode
if (acmod == 0x02)
dolbysurroundmode = bs.getBits(2);
dolbysurroundmode = bs.GetBits(2);
m_AudioHandler->SetAC3Bitrate(1000 * s_Bitrates[frmsizcod >> 1]);
m_AudioHandler->SetAC3SamplingFrequency(100 * s_Frequencies[fscod]);
@@ -86,8 +86,8 @@ bool cFemonAC3::processAudio(const uint8_t *buf, int len)
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
m_AudioHandler->SetAC3LFE(bs.GetBit()); // low frequency effects on
m_AudioHandler->SetAC3Dialog(bs.GetBits(5)); // dialog normalization
return true;
}

View File

@@ -14,9 +14,9 @@ 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];
static int s_Bitrates[32];
static int s_Frequencies[4];
static int s_Frames[3][32];
public:
cFemonAC3(cFemonAC3If *audiohandler);

View File

@@ -138,4 +138,16 @@ const cFemonTheme femonTheme[eFemonThemeMaxNumber] =
0xFFCE7B00, // clrYellow
0xFF336600, // clrGreen
},
{
// eFemonThemePearlHD
4, // bpp
0x90000000, // clrBackground
0xCC000000, // clrTitleBackground
0xFFBEBEBE, // clrTitleText
0xFF4E78B1, // clrActiveText
0xFFBEBEBE, // clrInactiveText
0xAAFF0000, // clrRed
0xAAF8F800, // clrYellow
0x6000ff00, // clrGreen
},
};

View File

@@ -59,20 +59,21 @@ enum eFemonThemes
eFemonThemeEgalsTry,
eFemonThemeDuotone,
eFemonThemeSilverGreen,
eFemonThemePearlHD,
eFemonThemeMaxNumber
};
struct cFemonTheme
{
int bpp;
int clrBackground;
int clrTitleBackground;
int clrTitleText;
int clrActiveText;
int clrInactiveText;
int clrRed;
int clrYellow;
int clrGreen;
unsigned int clrBackground;
unsigned int clrTitleBackground;
unsigned int clrTitleText;
unsigned int clrActiveText;
unsigned int clrInactiveText;
unsigned int clrRed;
unsigned int clrYellow;
unsigned int clrGreen;
};
extern const cFemonTheme femonTheme[eFemonThemeMaxNumber];

View File

@@ -163,16 +163,16 @@ bool cFemonH264::processVideo(const uint8_t *buf, int len)
if (aud_found) {
m_VideoHandler->SetVideoCodec(VIDEO_CODEC_H264);
if (sps_found) {
//debug("H.264 SPS: size %dx%d, aspect %d format %d framerate %.2f bitrate %.0f\n", m_Width, m_Height, m_AspectRatio, m_Format, m_FrameRate, m_BitRate);
//debug("H.264: size %dx%d, aspect %d format %d bitrate %.0f\n", m_Width, m_Height, m_AspectRatio, m_Format, m_BitRate);
m_VideoHandler->SetVideoFormat(m_Format);
m_VideoHandler->SetVideoSize(m_Width, m_Height);
m_VideoHandler->SetVideoAspectRatio(m_AspectRatio);
m_VideoHandler->SetVideoFramerate(m_FrameRate);
m_VideoHandler->SetVideoBitrate(m_BitRate);
}
if (sei_found) {
//debug("H.264 SEI: scan %d\n", m_Scan);
if (sps_found || sei_found) {
//debug("H.264: scan %d framerate %.2f\n", m_Scan, (m_Scan == VIDEO_SCAN_PROGRESSIVE) ? (m_FrameRate / 2) : m_FrameRate);
m_VideoHandler->SetVideoScan(m_Scan);
m_VideoHandler->SetVideoFramerate((m_Scan == VIDEO_SCAN_PROGRESSIVE) ? (m_FrameRate / 2) : m_FrameRate);
}
}
@@ -222,7 +222,7 @@ int cFemonH264::nalUnescape(uint8_t *dst, const uint8_t *src, int len)
int cFemonH264::parseSPS(const uint8_t *buf, int len)
{
int profile_idc, level_idc, constraint_set3_flag, pic_order_cnt_type, i, j;
cBitStream bs(buf, len);
cFemonBitStream bs(buf, len);
uint32_t width = m_Width;
uint32_t height = m_Height;
@@ -236,14 +236,14 @@ int cFemonH264::parseSPS(const uint8_t *buf, int len)
bool mb_adaptive_frame_field_flag = m_MbAdaptiveFrameFieldFlag;
uint32_t time_offset_length = m_TimeOffsetLength;
profile_idc = bs.getU8(); // profile_idc
bs.skipBit(); // constraint_set0_flag
bs.skipBit(); // constraint_set1_flag
bs.skipBit(); // constraint_set2_flag
constraint_set3_flag = bs.getBit(); // constraint_set3_flag
bs.skipBits(4); // reserved_zero_4bits
level_idc = bs.getU8(); // level_idc
bs.skipUeGolomb(); // seq_parameter_set_id
profile_idc = bs.GetBits(8); // profile_idc
bs.SkipBit(); // constraint_set0_flag
bs.SkipBit(); // constraint_set1_flag
bs.SkipBit(); // constraint_set2_flag
constraint_set3_flag = bs.GetBit(); // constraint_set3_flag
bs.SkipBits(4); // reserved_zero_4bits
level_idc = bs.GetBits(8); // level_idc
bs.SkipUeGolomb(); // seq_parameter_set_id
//debug("H.264 SPS: profile_idc %d level_idc %d\n", profile_idc, level_idc);
switch (profile_idc) {
case 66: // baseline profile
@@ -457,55 +457,55 @@ int cFemonH264::parseSPS(const uint8_t *buf, int len)
break;
}
if ((profile_idc == 100) || (profile_idc == 110) || (profile_idc == 122) || (profile_idc == 144)) {
if (bs.getUeGolomb() == 3) // chroma_format_idc
bs.skipBit(); // residual_colour_transform_flag
bs.skipUeGolomb(); // bit_depth_luma_minus8
bs.skipUeGolomb(); // bit_depth_chroma_minus8
bs.skipBit(); // qpprime_y_zero_transform_bypass_flag
if (bs.getBit()) { // seq_scaling_matrix_present_flag
if (bs.GetUeGolomb() == 3) // chroma_format_idc
bs.SkipBit(); // residual_colour_transform_flag
bs.SkipUeGolomb(); // bit_depth_luma_minus8
bs.SkipUeGolomb(); // bit_depth_chroma_minus8
bs.SkipBit(); // qpprime_y_zero_transform_bypass_flag
if (bs.GetBit()) { // seq_scaling_matrix_present_flag
for (i = 0; i < 8; ++i) {
if (bs.getBit()) { // seq_scaling_list_present_flag[i]
if (bs.GetBit()) { // seq_scaling_list_present_flag[i]
int last = 8, next = 8, size = (i < 6) ? 16 : 64;
for (j = 0; j < size; ++j) {
if (next)
next = (last + bs.getSeGolomb()) & 0xff;
next = (last + bs.GetSeGolomb()) & 0xff;
last = next ?: last;
}
}
}
}
}
bs.skipUeGolomb(); // log2_max_frame_num_minus4
pic_order_cnt_type = bs.getUeGolomb(); // pic_order_cnt_type
bs.SkipUeGolomb(); // log2_max_frame_num_minus4
pic_order_cnt_type = bs.GetUeGolomb(); // pic_order_cnt_type
if (pic_order_cnt_type == 0)
bs.skipUeGolomb(); // log2_max_pic_order_cnt_lsb_minus4
bs.SkipUeGolomb(); // log2_max_pic_order_cnt_lsb_minus4
else if (pic_order_cnt_type == 1) {
bs.skipBit(); // delta_pic_order_always_zero
bs.skipSeGolomb(); // offset_for_non_ref_pic
bs.skipSeGolomb(); // offset_for_top_to_bottom_field
j = bs.getUeGolomb(); // num_ref_frames_in_pic_order_cnt_cycle
bs.SkipBit(); // delta_pic_order_always_zero
bs.SkipSeGolomb(); // offset_for_non_ref_pic
bs.SkipSeGolomb(); // offset_for_top_to_bottom_field
j = bs.GetUeGolomb(); // num_ref_frames_in_pic_order_cnt_cycle
for (i = 0; i < j; ++i)
bs.skipSeGolomb(); // offset_for_ref_frame[i]
bs.SkipSeGolomb(); // offset_for_ref_frame[i]
}
bs.skipUeGolomb(); // num_ref_frames
bs.skipBit(); // gaps_in_frame_num_value_allowed_flag
width = bs.getUeGolomb() + 1; // pic_width_in_mbs_minus1
height = bs.getUeGolomb() + 1; // pic_height_in_mbs_minus1
frame_mbs_only_flag = bs.getBit(); // frame_mbs_only_flag
bs.SkipUeGolomb(); // num_ref_frames
bs.SkipBit(); // gaps_in_frame_num_value_allowed_flag
width = bs.GetUeGolomb() + 1; // pic_width_in_mbs_minus1
height = bs.GetUeGolomb() + 1; // pic_height_in_mbs_minus1
frame_mbs_only_flag = bs.GetBit(); // frame_mbs_only_flag
//debug("H.264 SPS: pic_width: %u mbs\n", width);
//debug("H.264 SPS: pic_height: %u mbs\n", height);
//debug("H.264 SPS: frame only flag: %d\n", frame_mbs_only_flag);
width *= 16;
height *= 16 * (frame_mbs_only_flag ? 1 : 2);
if (!frame_mbs_only_flag)
mb_adaptive_frame_field_flag = bs.getBit(); // mb_adaptive_frame_field_flag
bs.skipBit(); // direct_8x8_inference_flag
if (bs.getBit()) { // frame_cropping_flag
mb_adaptive_frame_field_flag = bs.GetBit(); // mb_adaptive_frame_field_flag
bs.SkipBit(); // direct_8x8_inference_flag
if (bs.GetBit()) { // frame_cropping_flag
uint32_t crop_left, crop_right, crop_top, crop_bottom;
crop_left = bs.getUeGolomb(); // frame_crop_left_offset
crop_right = bs.getUeGolomb(); // frame_crop_rigth_offset
crop_top = bs.getUeGolomb(); // frame_crop_top_offset
crop_bottom = bs.getUeGolomb(); // frame_crop_bottom_offset
crop_left = bs.GetUeGolomb(); // frame_crop_left_offset
crop_right = bs.GetUeGolomb(); // frame_crop_rigth_offset
crop_top = bs.GetUeGolomb(); // frame_crop_top_offset
crop_bottom = bs.GetUeGolomb(); // frame_crop_bottom_offset
//debug("H.264 SPS: cropping %d %d %d %d\n", crop_left, crop_top, crop_right, crop_bottom);
width -= 2 * (crop_left + crop_right);
if (frame_mbs_only_flag)
@@ -514,14 +514,14 @@ int cFemonH264::parseSPS(const uint8_t *buf, int len)
height -= 4 * (crop_top + crop_bottom);
}
// VUI parameters
if (bs.getBit()) { // vui_parameters_present_flag
if (bs.getBit()) { // aspect_ratio_info_present
if (bs.GetBit()) { // vui_parameters_present_flag
if (bs.GetBit()) { // aspect_ratio_info_present
uint32_t aspect_ratio_idc, sar_width = 0, sar_height = 0;
aspect_ratio_idc = bs.getU8(); // aspect_ratio_idc
aspect_ratio_idc = bs.GetBits(8); // aspect_ratio_idc
//debug("H.264 SPS: aspect_ratio_idc %d\n", aspect_ratio_idc);
if (aspect_ratio_idc == 255) { // extended sar
sar_width = bs.getU16(); // sar_width
sar_height = bs.getU16(); // sar_height
sar_width = bs.GetBits(16); // sar_width
sar_height = bs.GetBits(16); // sar_height
}
else if (aspect_ratio_idc < ELEMENTS(s_SAR)) {
sar_width = s_SAR[aspect_ratio_idc].w;
@@ -546,78 +546,78 @@ int cFemonH264::parseSPS(const uint8_t *buf, int len)
//debug("H.264 SPS: DAR %dx%d (%d)\n", sar_width, sar_height, aspect_ratio);
}
}
if (bs.getBit()) // overscan_info_present_flag
bs.skipBit(); // overscan_approriate_flag
if (bs.getBit()) { // video_signal_type_present_flag
if (bs.GetBit()) // overscan_info_present_flag
bs.SkipBit(); // overscan_approriate_flag
if (bs.GetBit()) { // video_signal_type_present_flag
uint32_t video_format;
video_format = bs.getBits(3); // video_format
video_format = bs.GetBits(3); // video_format
if (video_format < sizeof(s_VideoFormats) / sizeof(s_VideoFormats[0])) {
format = s_VideoFormats[video_format];
//debug("H.264 SPS: video format %d\n", format);
}
bs.skipBit(); // video_full_range_flag
if (bs.getBit()) { // colour_description_present_flag
bs.skipBits(8); // colour_primaries
bs.skipBits(8); // transfer_characteristics
bs.skipBits(8); // matrix_coefficients
bs.SkipBit(); // video_full_range_flag
if (bs.GetBit()) { // colour_description_present_flag
bs.SkipBits(8); // colour_primaries
bs.SkipBits(8); // transfer_characteristics
bs.SkipBits(8); // matrix_coefficients
}
}
if (bs.getBit()) { // chroma_loc_info_present_flag
bs.skipUeGolomb(); // chroma_sample_loc_type_top_field
bs.skipUeGolomb(); // chroma_sample_loc_type_bottom_field
if (bs.GetBit()) { // chroma_loc_info_present_flag
bs.SkipUeGolomb(); // chroma_sample_loc_type_top_field
bs.SkipUeGolomb(); // chroma_sample_loc_type_bottom_field
}
if (bs.getBit()) { // timing_info_present_flag
if (bs.GetBit()) { // timing_info_present_flag
uint32_t num_units_in_tick, time_scale;
num_units_in_tick = bs.getU32(); // num_units_in_tick
time_scale = bs.getU32(); // time_scale
num_units_in_tick = bs.GetBits(32); // num_units_in_tick
time_scale = bs.GetBits(32); // time_scale
if (num_units_in_tick > 0)
frame_rate = time_scale / num_units_in_tick;
bs.skipBit(); // fixed_frame_rate_flag
bs.SkipBit(); // fixed_frame_rate_flag
}
int nal_hrd_parameters_present_flag = bs.getBit(); // nal_hrd_parameters_present_flag
int nal_hrd_parameters_present_flag = bs.GetBit(); // nal_hrd_parameters_present_flag
if (nal_hrd_parameters_present_flag) {
int cpb_cnt_minus1;
cpb_cnt_minus1 = bs.getUeGolomb(); // cpb_cnt_minus1
bs.skipBits(4); // bit_rate_scale
bs.skipBits(4); // cpb_size_scale
cpb_cnt_minus1 = bs.GetUeGolomb(); // cpb_cnt_minus1
bs.SkipBits(4); // bit_rate_scale
bs.SkipBits(4); // cpb_size_scale
for (int i = 0; i < cpb_cnt_minus1; ++i) {
bs.skipUeGolomb(); // bit_rate_value_minus1[i]
bs.skipUeGolomb(); // cpb_size_value_minus1[i]
bs.skipBit(); // cbr_flag[i]
bs.SkipUeGolomb(); // bit_rate_value_minus1[i]
bs.SkipUeGolomb(); // cpb_size_value_minus1[i]
bs.SkipBit(); // cbr_flag[i]
}
bs.skipBits(5); // initial_cpb_removal_delay_length_minus1
bs.skipBits(5); // cpb_removal_delay_length_minus1
bs.skipBits(5); // dpb_output_delay_length_minus1
time_offset_length = bs.getBits(5); // time_offset_length
bs.SkipBits(5); // initial_cpb_removal_delay_length_minus1
bs.SkipBits(5); // cpb_removal_delay_length_minus1
bs.SkipBits(5); // dpb_output_delay_length_minus1
time_offset_length = bs.GetBits(5); // time_offset_length
}
int vlc_hrd_parameters_present_flag = bs.getBit(); // vlc_hrd_parameters_present_flag
int vlc_hrd_parameters_present_flag = bs.GetBit(); // vlc_hrd_parameters_present_flag
if (vlc_hrd_parameters_present_flag) {
int cpb_cnt_minus1;
cpb_cnt_minus1 = bs.getUeGolomb(); // cpb_cnt_minus1
bs.skipBits(4); // bit_rate_scale
bs.skipBits(4); // cpb_size_scale
cpb_cnt_minus1 = bs.GetUeGolomb(); // cpb_cnt_minus1
bs.SkipBits(4); // bit_rate_scale
bs.SkipBits(4); // cpb_size_scale
for (int i = 0; i < cpb_cnt_minus1; ++i) {
bs.skipUeGolomb(); // bit_rate_value_minus1[i]
bs.skipUeGolomb(); // cpb_size_value_minus1[i]
bs.skipBit(); // cbr_flag[i]
bs.SkipUeGolomb(); // bit_rate_value_minus1[i]
bs.SkipUeGolomb(); // cpb_size_value_minus1[i]
bs.SkipBit(); // cbr_flag[i]
}
bs.skipBits(5); // initial_cpb_removal_delay_length_minus1
bs.skipBits(5); // cpb_removal_delay_length_minus1
bs.skipBits(5); // dpb_output_delay_length_minus1
time_offset_length = bs.getBits(5);// time_offset_length
bs.SkipBits(5); // initial_cpb_removal_delay_length_minus1
bs.SkipBits(5); // cpb_removal_delay_length_minus1
bs.SkipBits(5); // dpb_output_delay_length_minus1
time_offset_length = bs.GetBits(5);// time_offset_length
}
cpb_dpb_delays_present_flag = (nal_hrd_parameters_present_flag | vlc_hrd_parameters_present_flag);
if (cpb_dpb_delays_present_flag)
bs.skipBit(); // low_delay_hrd_flag
pic_struct_present_flag = bs.getBit(); // pic_struct_present_flag
if (bs.getBit()) { // bitstream_restriction_flag
bs.skipBit(); // motion_vectors_over_pic_boundaries_flag
bs.skipUeGolomb(); // max_bytes_per_pic_denom
bs.skipUeGolomb(); // max_bits_per_mb_denom
bs.skipUeGolomb(); // log2_max_mv_length_horizontal
bs.skipUeGolomb(); // log2_max_mv_length_vertical
bs.skipUeGolomb(); // num_reorder_frames
bs.skipUeGolomb(); // max_dec_frame_buffering
bs.SkipBit(); // low_delay_hrd_flag
pic_struct_present_flag = bs.GetBit(); // pic_struct_present_flag
if (bs.GetBit()) { // bitstream_restriction_flag
bs.SkipBit(); // motion_vectors_over_pic_boundaries_flag
bs.SkipUeGolomb(); // max_bytes_per_pic_denom
bs.SkipUeGolomb(); // max_bits_per_mb_denom
bs.SkipUeGolomb(); // log2_max_mv_length_horizontal
bs.SkipUeGolomb(); // log2_max_mv_length_vertical
bs.SkipUeGolomb(); // num_reorder_frames
bs.SkipUeGolomb(); // max_dec_frame_buffering
}
}
@@ -625,6 +625,7 @@ int cFemonH264::parseSPS(const uint8_t *buf, int len)
m_Height = height;
m_AspectRatio = aspect_ratio;
m_Format = format;
m_Scan = frame_mbs_only_flag ? VIDEO_SCAN_PROGRESSIVE : VIDEO_SCAN_INTERLACED;
m_FrameRate = frame_rate;
m_BitRate = bit_rate;
m_CpbDpbDelaysPresentFlag = cpb_dpb_delays_present_flag;
@@ -633,38 +634,38 @@ int cFemonH264::parseSPS(const uint8_t *buf, int len)
m_MbAdaptiveFrameFieldFlag = mb_adaptive_frame_field_flag;
m_TimeOffsetLength = time_offset_length;
return (bs.getIndex() / 8);
return (bs.Index() / 8);
}
int cFemonH264::parseSEI(const uint8_t *buf, int len)
{
int num_referenced_subseqs, i;
cBitStream bs(buf, len);
cFemonBitStream bs(buf, len);
eVideoScan scan = m_Scan;
while ((bs.getIndex() * 8 + 16) < len) { // sei_message
while ((bs.Index() * 8 + 16) < len) { // sei_message
int lastByte, payloadSize = 0, payloadType = 0;
do {
lastByte = bs.getU8() & 0xFF;
lastByte = bs.GetBits(8) & 0xFF;
payloadType += lastByte;
} while (lastByte == 0xFF); // last_payload_type_byte
do {
lastByte = bs.getU8() & 0xFF;
lastByte = bs.GetBits(8) & 0xFF;
payloadSize += lastByte;
} while (lastByte == 0xFF); // last_payload_size_byte
switch (payloadType) { // sei_payload
case 1: // pic_timing
if (m_CpbDpbDelaysPresentFlag) { // cpb_dpb_delays_present_flag
bs.skipUeGolomb(); // cpb_removal_delay
bs.skipUeGolomb(); // dpb_output_delay
bs.SkipUeGolomb(); // cpb_removal_delay
bs.SkipUeGolomb(); // dpb_output_delay
}
if (m_PicStructPresentFlag) { // pic_struct_present_flag
uint32_t pic_struct;
pic_struct = bs.getBits(4); // pic_struct
uint32_t pic_struct, ct_type = 0, i = 0;
pic_struct = bs.GetBits(4); // pic_struct
if (pic_struct >= (sizeof(s_SeiNumClockTsTable)) / sizeof(s_SeiNumClockTsTable[0]))
return 0;
if (m_FrameMbsOnlyFlag && !m_MbAdaptiveFrameFieldFlag)
@@ -690,80 +691,69 @@ int cFemonH264::parseSEI(const uint8_t *buf, int len)
}
}
//debug("H.264 SEI: pic struct %d scan type %d\n", pic_struct, scan);
for (int i = 0; i < s_SeiNumClockTsTable[pic_struct]; ++i) {
if (bs.getBit()) { // clock_timestamp_flag[i]
for (i = 0; i < s_SeiNumClockTsTable[pic_struct]; ++i) {
if (bs.GetBit()) { // clock_timestamp_flag[i]
int full_timestamp_flag;
switch (bs.getBits(2)) { // ct_type
case 0:
scan = VIDEO_SCAN_PROGRESSIVE;
break;
case 1:
scan = VIDEO_SCAN_INTERLACED;
break;
case 2:
scan = VIDEO_SCAN_UNKNOWN;
break;
default:
scan = VIDEO_SCAN_RESERVED;
break;
}
//debug("H.264 SEI: scan type %d\n", scan);
bs.skipBit(); // nuit_field_based_flag
bs.skipBits(5); // counting_type
full_timestamp_flag = bs.getBit(); // full_timestamp_flag
bs.skipBit(); // discontinuity_flag
bs.skipBit(); // cnt_dropped_flag
bs.skipBits(8); // n_frames
ct_type |= (1 << bs.GetBits(2)); // ct_type
//debug("H.264 SEI: ct type %04X\n", ct_type);
bs.SkipBit(); // nuit_field_based_flag
bs.SkipBits(5); // counting_type
full_timestamp_flag = bs.GetBit(); // full_timestamp_flag
bs.SkipBit(); // discontinuity_flag
bs.SkipBit(); // cnt_dropped_flag
bs.SkipBits(8); // n_frames
if (full_timestamp_flag) {
bs.skipBits(6); // seconds_value
bs.skipBits(6); // minutes_value
bs.skipBits(5); // hours_value
bs.SkipBits(6); // seconds_value
bs.SkipBits(6); // minutes_value
bs.SkipBits(5); // hours_value
}
else {
if (bs.getBit()) { // seconds_flag
bs.skipBits(6); // seconds_value
if (bs.getBit()) { // minutes_flag
bs.skipBits(6); // minutes_value
if (bs.getBit()) // hours_flag
bs.skipBits(5); // hours_value
if (bs.GetBit()) { // seconds_flag
bs.SkipBits(6); // seconds_value
if (bs.GetBit()) { // minutes_flag
bs.SkipBits(6); // minutes_value
if (bs.GetBit()) // hours_flag
bs.SkipBits(5); // hours_value
}
}
}
if (m_TimeOffsetLength > 0)
bs.skipBits(m_TimeOffsetLength); // time_offset
bs.SkipBits(m_TimeOffsetLength); // time_offset
}
}
if (i > 0)
scan = (ct_type & (1 << 1)) ? VIDEO_SCAN_INTERLACED : VIDEO_SCAN_PROGRESSIVE;
}
break;
case 12: // sub_seq_characteristics
bs.skipUeGolomb(); // sub_seq_layer_num
bs.skipUeGolomb(); // sub_seq_id
if (bs.getBit()) // duration_flag
bs.skipBits(32); // sub_seq_duration
if (bs.getBit()) { // average_rate_flag
bs.skipBit(); // accurate_statistics_flag
bs.skipBits(16); // average_bit_rate (1000 bit/s)
bs.skipBits(16); // average_frame_rate (frames per 256s)
bs.SkipUeGolomb(); // sub_seq_layer_num
bs.SkipUeGolomb(); // sub_seq_id
if (bs.GetBit()) // duration_flag
bs.SkipBits(32); // sub_seq_duration
if (bs.GetBit()) { // average_rate_flag
bs.SkipBit(); // accurate_statistics_flag
bs.SkipBits(16); // average_bit_rate (1000 bit/s)
bs.SkipBits(16); // average_frame_rate (frames per 256s)
}
num_referenced_subseqs = bs.getUeGolomb(); // num_referenced_subseqs
num_referenced_subseqs = bs.GetUeGolomb(); // num_referenced_subseqs
for (i = 0; i < num_referenced_subseqs; ++i) {
bs.skipUeGolomb(); // ref_sub_seq_layer_num
bs.skipUeGolomb(); // ref_sub_seq_id
bs.getBit(); // ref_sub_seq_direction
bs.SkipUeGolomb(); // ref_sub_seq_layer_num
bs.SkipUeGolomb(); // ref_sub_seq_id
bs.GetBit(); // ref_sub_seq_direction
}
break;
default:
bs.skipBits(payloadSize * 8);
bs.SkipBits(payloadSize * 8);
break;
}
// force byte align
bs.byteAlign();
bs.ByteAlign();
}
m_Scan = scan;
return (bs.getIndex() / 8);
return (bs.Index() / 8);
}

View File

@@ -8,14 +8,14 @@
#include "femontools.h"
#include "femonlatm.h"
unsigned int cFemonLATM::s_Bitrates[3][16] =
int cFemonLATM::s_Bitrates[3][16] =
{
{0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, -1}, // MPEG-2 Layer I
{0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1}, // MPEG-2 Layer II/III
{0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1} // MPEG-2 Layer II/III
};
unsigned int cFemonLATM::s_Samplerates[4] =
int cFemonLATM::s_Samplerates[4] =
{
22050, 24000, 16000, -1
};
@@ -31,7 +31,7 @@ cFemonLATM::~cFemonLATM()
bool cFemonLATM::processAudio(const uint8_t *buf, int len)
{
cBitStream bs(buf, len * 8);
cFemonBitStream bs(buf, len * 8);
if (!m_AudioHandler)
return false;
@@ -39,23 +39,23 @@ bool cFemonLATM::processAudio(const uint8_t *buf, int len)
// skip PES header
if (!PesLongEnough(len))
return false;
bs.skipBits(8 * PesPayloadOffset(buf));
bs.SkipBits(8 * PesPayloadOffset(buf));
// MPEG audio detection
if (bs.getBits(12) != 0x56E) // syncword
if (bs.GetBits(12) != 0x56E) // syncword
return false;
m_AudioHandler->SetAudioCodec(AUDIO_CODEC_LATM);
if (bs.getBit() == 0) // id: MPEG-1=1, extension to lower sampling frequencies=0
if (bs.GetBit() == 0) // id: MPEG-1=1, extension to lower sampling frequencies=0
return true; // @todo: lower sampling frequencies support
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
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
switch (mode) {
case 0:

View File

@@ -14,8 +14,8 @@ class cFemonLATM {
private:
cFemonAudioIf *m_AudioHandler;
static unsigned int s_Bitrates[3][16];
static unsigned int s_Samplerates[4];
static int s_Bitrates[3][16];
static int s_Samplerates[4];
public:
cFemonLATM(cFemonAudioIf *audiohandler);

View File

@@ -10,7 +10,7 @@
#define IS_EXTENSION_START(buf) (((buf)[0] == 0x00) && ((buf)[1] == 0x00) && ((buf)[2] == 0x01) && ((buf)[3] == 0xB5))
unsigned int cFemonMPEG::s_Bitrates[2][3][16] =
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
@@ -24,7 +24,7 @@ unsigned int cFemonMPEG::s_Bitrates[2][3][16] =
}
};
unsigned int cFemonMPEG::s_Samplerates[2][4] =
int cFemonMPEG::s_Samplerates[2][4] =
{
{22050, 24000, 16000, -1}, // MPEG-2
{44100, 48000, 32000, -1} // MPEG-1
@@ -48,7 +48,7 @@ cFemonMPEG::~cFemonMPEG()
bool cFemonMPEG::processAudio(const uint8_t *buf, int len)
{
cBitStream bs(buf, len * 8);
cFemonBitStream bs(buf, len * 8);
if (!m_AudioHandler)
return false;
@@ -56,20 +56,20 @@ bool cFemonMPEG::processAudio(const uint8_t *buf, int len)
// skip PES header
if (!PesLongEnough(len))
return false;
bs.skipBits(8 * PesPayloadOffset(buf));
bs.SkipBits(8 * PesPayloadOffset(buf));
// MPEG audio detection
if (bs.getBits(12) != 0xFFF) // syncword
if (bs.GetBits(12) != 0xFFF) // syncword
return false;
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
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]);
@@ -124,7 +124,7 @@ bool cFemonMPEG::processAudio(const uint8_t *buf, int len)
bool cFemonMPEG::processVideo(const uint8_t *buf, int len)
{
cBitStream bs(buf, len * 8);
cFemonBitStream bs(buf, len * 8);
if (!m_VideoHandler)
return false;
@@ -132,20 +132,20 @@ bool cFemonMPEG::processVideo(const uint8_t *buf, int len)
// skip PES header
if (!PesLongEnough(len))
return false;
bs.skipBits(8 * PesPayloadOffset(buf));
bs.SkipBits(8 * PesPayloadOffset(buf));
// MPEG-2 video detection, search for start code
if (bs.getU32() != 0x000001B3) // sequence header
if (bs.GetBits(32) != 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
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
switch (bs.GetBits(4)) { // aspect ratio information
case 1:
aspect = VIDEO_ASPECT_RATIO_1_1;
break;
@@ -169,7 +169,7 @@ bool cFemonMPEG::processVideo(const uint8_t *buf, int len)
}
double frame_rate = 0;
switch (bs.getBits(4)) { // frame rate code
switch (bs.GetBits(4)) { // frame rate code
case 1:
frame_rate = 24000 / 1001.0;
format = VIDEO_FORMAT_UNKNOWN;
@@ -217,34 +217,34 @@ bool cFemonMPEG::processVideo(const uint8_t *buf, int len)
break;
}
int bit_rate = bs.getBits(18); // bit rate value
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
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 :
if (bs.GetBits(32) != 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
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
if ((bs.GetBits(32) != 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;

View File

@@ -16,9 +16,9 @@ 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];
static int s_Bitrates[2][3][16];
static int s_Samplerates[2][4];
static eAudioCodec s_Formats[2][4];
public:
cFemonMPEG(cFemonVideoIf *videohandler, cFemonAudioIf *audiohandler);

View File

@@ -6,11 +6,12 @@
*/
#ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#endif
#include <ctype.h>
#include <math.h>
#include "iptvservice.h"
#include "femoncfg.h"
#include "femonreceiver.h"
#include "femontools.h"
@@ -171,6 +172,10 @@ cFemonOsd::cFemonOsd()
m_SvdrpPlugin(NULL),
m_Number(0),
m_OldNumber(0),
m_Quality(0),
m_QualityValid(false),
m_Strength(0),
m_StrengthValid(false),
m_SNR(0),
m_SNRValid(false),
m_Signal(0),
@@ -179,7 +184,9 @@ cFemonOsd::cFemonOsd()
m_BERValid(false),
m_UNC(0),
m_UNCValid(false),
m_FrontendName(""),
m_FrontendStatusValid(false),
m_DeviceSource(DEVICESOURCE_DVBAPI),
m_DisplayMode(femonConfig.displaymode),
m_OsdWidth(cOsd::OsdWidth() * (100 - femonConfig.downscale) / 100),
m_OsdHeight(cOsd::OsdHeight() * (100 - femonConfig.downscale) / 100),
@@ -195,7 +202,7 @@ cFemonOsd::cFemonOsd()
memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo));
m_SvdrpConnection.handle = -1;
femonSymbols.Refresh();
m_Font = cFont::CreateFont(Setup.FontSml, min(max(Setup.FontSmlSize, MINFONTSIZE), MAXFONTSIZE));
m_Font = cFont::CreateFont(Setup.FontSml, constrain(Setup.FontSmlSize, MINFONTSIZE, MAXFONTSIZE));
if (!m_Font || !m_Font->Height()) {
m_Font = new cFemonDummyFont;
error("cFemonOsd::cFemonOsd() cannot create required font.");
@@ -241,14 +248,15 @@ cFemonOsd::~cFemonOsd(void)
void cFemonOsd::DrawStatusWindow(void)
{
cMutexLock lock(&m_Mutex);
cBitmap *bm = NULL;
int offset = 0;
int x = OSDWIDTH - OSDROUNDING;
int y = 0;
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (m_Osd && channel) {
cBitmap *bm = NULL;
int offset = 0;
int x = OSDWIDTH - OSDROUNDING;
int y = 0;
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
OSDDRAWSTATUSTITLEBAR(*cString::sprintf("%d%s %s", m_Number ? m_Number : channel->Number(), m_Number ? "-" : "", channel->ShortName(true)));
if (m_SvdrpFrontend >= 0) {
bm = &OSDSYMBOL(SYMBOL_SVDRP);
@@ -295,14 +303,34 @@ void cFemonOsd::DrawStatusWindow(void)
OSDDRAWSTATUSBM(OSDSPACING);
}
if (m_Receiver) {
if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 1080))
bm = &OSDSYMBOL(SYMBOL_FORMAT_1080);
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 720))
bm = &OSDSYMBOL(SYMBOL_FORMAT_720);
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 576))
bm = &OSDSYMBOL(SYMBOL_FORMAT_576);
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 480))
bm = &OSDSYMBOL(SYMBOL_FORMAT_480);
if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 1080)) {
switch (m_Receiver->VideoScan()) {
case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080i); break;
case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080p); break;
default: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080); break;
}
}
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 720)) {
switch (m_Receiver->VideoScan()) {
case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_720i); break;
case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_720p); break;
default: bm = &OSDSYMBOL(SYMBOL_FORMAT_720); break;
}
}
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 576)) {
switch (m_Receiver->VideoScan()) {
case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_576i); break;
case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_576p); break;
default: bm = &OSDSYMBOL(SYMBOL_FORMAT_576); break;
}
}
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 480)) {
switch (m_Receiver->VideoScan()) {
case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_480i); break;
case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_480p); break;
default: bm = &OSDSYMBOL(SYMBOL_FORMAT_480); break;
}
}
else
bm = NULL;
OSDDRAWSTATUSBM(OSDSPACING);
@@ -332,11 +360,11 @@ void cFemonOsd::DrawStatusWindow(void)
OSDDRAWSTATUSBM(OSDSPACING);
}
offset += OSDROWHEIGHT;
if (m_SignalValid)
OSDDRAWSTATUSBAR(m_Signal / 655);
if (m_StrengthValid)
OSDDRAWSTATUSBAR(m_Strength);
offset += OSDROWHEIGHT;
if (m_SNRValid)
OSDDRAWSTATUSBAR(m_SNR / 655);
if (m_QualityValid)
OSDDRAWSTATUSBAR(m_Quality);
offset += OSDROWHEIGHT;
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")),
@@ -364,12 +392,12 @@ void cFemonOsd::DrawStatusWindow(void)
void cFemonOsd::DrawInfoWindow(void)
{
cMutexLock lock(&m_Mutex);
int offset = 0;
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
if (m_Osd && channel) {
cDvbTransponderParameters dtp(channel->Parameters());
int offset = 0;
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
switch (m_DisplayMode) {
case eFemonModeTransponder:
OSDDRAWINFOTITLEBAR(tr("Transponder Information"));
@@ -392,8 +420,9 @@ void cFemonOsd::DrawInfoWindow(void)
OSDDRAWINFOLEFT( trVDR("CA"), *getCAids(channel));
offset += OSDROWHEIGHT;
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));
case cSource::stSat: {
cDvbTransponderParameters dtp(channel->Parameters());
OSDDRAWINFOLINE(*cString::sprintf("%s #%d - %s", *getSatelliteSystem(dtp.System()), (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), *m_FrontendName));
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency()));
OSDDRAWINFORIGHT(trVDR("Source"), *cSource::ToString(channel->Source()));
@@ -404,12 +433,15 @@ void cFemonOsd::DrawInfoWindow(void)
OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(dtp.Inversion()));
OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(dtp.CoderateH()));
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("System"), *getSystem(dtp.System()));
OSDDRAWINFOLEFT( trVDR("System"), *getSatelliteSystem(dtp.System()));
if (dtp.System())
OSDDRAWINFORIGHT(trVDR("RollOff"), *getRollOff(dtp.RollOff()));
}
break;
case cSource::stCable:
OSDDRAWINFOLINE(*cString::sprintf("DVB-C #%d - %s", (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name));
case cSource::stCable: {
cDvbTransponderParameters dtp(channel->Parameters());
OSDDRAWINFOLINE(*cString::sprintf("DVB-C #%d - %s", (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), *m_FrontendName));
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency()));
OSDDRAWINFORIGHT(trVDR("Source"), *cSource::ToString(channel->Source()));
@@ -419,10 +451,12 @@ void cFemonOsd::DrawInfoWindow(void)
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(dtp.Inversion()));
OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(dtp.CoderateH()));
}
break;
case cSource::stTerr:
OSDDRAWINFOLINE(*cString::sprintf("DVB-T #%d - %s", (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name));
case cSource::stTerr: {
cDvbTransponderParameters dtp(channel->Parameters());
OSDDRAWINFOLINE(*cString::sprintf("%s #%d - %s", *getTerrestrialSystem(dtp.System()), (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), *m_FrontendName));
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency()));
OSDDRAWINFORIGHT(trVDR("Transmission"), *getTransmission(dtp.Transmission()));
@@ -435,6 +469,29 @@ void cFemonOsd::DrawInfoWindow(void)
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Hierarchy"), *getHierarchy(dtp.Hierarchy()));
OSDDRAWINFORIGHT(trVDR("Guard"), *getGuard(dtp.Guard()));
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("System"), *getTerrestrialSystem(dtp.System()));
if (dtp.System())
OSDDRAWINFORIGHT(trVDR("PlpId"), *cString::sprintf("%d", dtp.PlpId()));
}
break;
case stIptv: {
OSDDRAWINFOLINE(*cString::sprintf("IPTV #%d - %s", (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), *m_FrontendName));
offset += OSDROWHEIGHT;
if (m_SvdrpFrontend < 0) {
cPlugin *p;
IptvService_v1_0 data;
data.cardIndex = cDevice::ActualDevice()->CardIndex();
p = cPluginManager::CallFirstService("IptvService-v1.0", &data);
if (p) {
OSDDRAWINFOLEFT(tr("Protocol"), *data.protocol);
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT(tr("Bitrate"), *data.bitrate);
offset += OSDROWHEIGHT;
}
}
}
break;
default:
@@ -518,62 +575,114 @@ void cFemonOsd::Action(void)
m_SvdrpFrontend = -1;
m_SvdrpVideoBitrate = -1.0;
m_SvdrpAudioBitrate = -1.0;
if (m_Frontend != -1) {
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;
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))
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);
switch (m_DeviceSource) {
case DEVICESOURCE_PVRINPUT:
m_Quality = cDevice::ActualDevice()->SignalStrength();
m_QualityValid = (m_Quality >= 0);
m_Strength = cDevice::ActualDevice()->SignalStrength();
m_StrengthValid = (m_Strength >= 0);
m_FrontendName = cDevice::ActualDevice()->DeviceName();
m_FrontendStatus = (fe_status_t)(m_StrengthValid ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0);
m_FrontendStatusValid = m_StrengthValid;
m_Signal = uint16_t(m_Strength * 0xFFFF / 100);
m_SignalValid = m_StrengthValid;
m_SNR = 0;
m_SNRValid = false;
m_BER = 0;
m_BERValid = false;
m_UNC = 0;
m_UNCValid = false;
break;
case DEVICESOURCE_IPTV:
m_Quality = cDevice::ActualDevice()->SignalQuality();
m_QualityValid = (m_Quality >= 0);
m_Strength = cDevice::ActualDevice()->SignalStrength();
m_StrengthValid = (m_Strength >= 0);
m_FrontendName = cDevice::ActualDevice()->DeviceName();
m_FrontendStatus = (fe_status_t)(m_StrengthValid ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0);
m_FrontendStatusValid = m_StrengthValid;
m_Signal = uint16_t(m_Strength * 0xFFFF / 100);
m_SignalValid = m_StrengthValid;
m_SNR = uint16_t(m_Quality * 0xFFFF / 100);
m_SNRValid = m_QualityValid;
m_BER = 0;
m_BERValid = false;
m_UNC = 0;
m_UNCValid = false;
break;
default:
case DEVICESOURCE_DVBAPI:
if (m_Frontend != -1) {
m_Quality = cDevice::ActualDevice()->SignalQuality();
m_QualityValid = (m_Quality >= 0);
m_Strength = cDevice::ActualDevice()->SignalStrength();
m_StrengthValid = (m_Strength >= 0);
m_FrontendName = cDevice::ActualDevice()->DeviceName();
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;
m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd);
if (cmd.responseCode == 900) {
m_StrengthValid = false;
m_QualityValid = false;
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))
m_SvdrpFrontend = (int)strtol(s + 5, NULL, 10);
else if (!strncasecmp(s, "STRG:", 5)) {
m_Strength = (int)strtol(s + 5, NULL, 10);
m_StrengthValid = (m_Strength >= 0);
}
else if (!strncasecmp(s, "QUAL:", 5)) {
m_Quality = (int)strtol(s + 5, NULL, 10);
m_QualityValid = (m_Quality >= 0);
}
else if (!strncasecmp(s, "TYPE:", 5))
m_FrontendInfo.type = (fe_type_t)strtol(s + 5, NULL, 10);
else if (!strncasecmp(s, "NAME:", 5)) {
m_FrontendName = s + 5;
}
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);
}
}
}
break;
}
DrawInfoWindow();
DrawStatusWindow();
m_Sleep.Wait(max((int)(100 * femonConfig.updateinterval - t.Elapsed()), 3));
}
}
@@ -582,26 +691,40 @@ void cFemonOsd::Show(void)
{
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) {
if (!femonConfig.usesvdrp)
error("cFemonOsd::Show() cannot read frontend info.");
close(m_Frontend);
m_Frontend = -1;
memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo));
const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
m_DeviceSource = DEVICESOURCE_DVBAPI;
if (channel) {
if (channel->IsSourceType('I'))
m_DeviceSource = DEVICESOURCE_IPTV;
else if (channel->IsSourceType('V'))
m_DeviceSource = DEVICESOURCE_PVRINPUT;
}
if (m_DeviceSource == DEVICESOURCE_DVBAPI) {
cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice());
m_Frontend = dev ? open(*cString::sprintf(FRONTEND_DEVICE, dev->Adapter(), dev->Frontend()), O_RDONLY | O_NONBLOCK) : -1;
if (m_Frontend >= 0) {
if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) {
if (!femonConfig.usesvdrp)
error("cFemonOsd::Show() cannot read frontend info.");
close(m_Frontend);
m_Frontend = -1;
memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo));
return;
}
}
else if (femonConfig.usesvdrp) {
if (!SvdrpConnect() || !SvdrpTune())
return;
}
else {
error("cFemonOsd::Show() cannot open frontend device.");
return;
}
}
else if (femonConfig.usesvdrp) {
if (!SvdrpConnect() || !SvdrpTune())
return;
}
else {
error("cFemonOsd::Show() cannot open frontend device.");
return;
}
else
m_Frontend = -1;
m_Osd = cOsdProvider::NewOsd(m_OsdLeft, m_OsdTop);
if (m_Osd) {
@@ -622,55 +745,66 @@ void cFemonOsd::Show(void)
m_Receiver->Deactivate();
DELETENULL(m_Receiver);
}
if (femonConfig.analyzestream) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (channel) {
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);
}
if (femonConfig.analyzestream && channel) {
m_Receiver = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0);
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
Start();
}
}
void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber, bool liveView)
{
debug("%s(%d,%d)\n", __PRETTY_FUNCTION__, device->DeviceNumber(), channelNumber);
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
if (!device->IsPrimaryDevice() || !channelNumber || cDevice::PrimaryDevice()->CurrentChannel() != channelNumber)
const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (!liveView || !channelNumber || !channel || channel->Number() != channelNumber)
return;
close(m_Frontend);
cString dev = cString::sprintf(FRONTEND_DEVICE, cDevice::ActualDevice()->CardIndex(), 0);
m_Frontend = open(dev, O_RDONLY | O_NONBLOCK);
m_DeviceSource = DEVICESOURCE_DVBAPI;
if (channel) {
if (channel->IsSourceType('I'))
m_DeviceSource = DEVICESOURCE_IPTV;
else if (channel->IsSourceType('V'))
m_DeviceSource = DEVICESOURCE_PVRINPUT;
}
if (m_Frontend >= 0) {
if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) {
if (!femonConfig.usesvdrp)
error("cFemonOsd::ChannelSwitch() cannot read frontend info.");
close(m_Frontend);
m_Frontend = -1;
memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo));
close(m_Frontend);
m_Frontend = -1;
}
if (m_DeviceSource == DEVICESOURCE_DVBAPI) {
cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice());
m_Frontend = dev ? open(*cString::sprintf(FRONTEND_DEVICE, dev->Adapter(), dev->Frontend()), O_RDONLY | O_NONBLOCK) : -1;
if (m_Frontend >= 0) {
if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) {
if (!femonConfig.usesvdrp)
error("cFemonOsd::ChannelSwitch() cannot read frontend info.");
close(m_Frontend);
m_Frontend = -1;
memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo));
return;
}
}
else if (femonConfig.usesvdrp) {
if (!SvdrpConnect() || !SvdrpTune())
return;
}
else {
error("cFemonOsd::ChannelSwitch() cannot open frontend device.");
return;
}
}
else if (femonConfig.usesvdrp) {
if (!SvdrpConnect() || !SvdrpTune())
return;
}
else {
error("cFemonOsd::ChannelSwitch() cannot open frontend device.");
return;
}
if (m_Receiver) {
m_Receiver->Deactivate();
DELETENULL(m_Receiver);
}
if (femonConfig.analyzestream) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (channel) {
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);
}
if (femonConfig.analyzestream && channel) {
m_Receiver = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0);
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
}
@@ -683,9 +817,9 @@ void cFemonOsd::SetAudioTrack(int Index, const char * const *Tracks)
DELETENULL(m_Receiver);
}
if (femonConfig.analyzestream) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (channel) {
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));
m_Receiver = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0);
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
}
@@ -710,13 +844,13 @@ bool cFemonOsd::DeviceSwitch(int direction)
}
if (cDevice::GetDevice(device)->ProvidesChannel(channel, 0)) {
debug("%s(%d) device(%d)\n", __PRETTY_FUNCTION__, direction, device);
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), 0);
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), 0, true);
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));
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), channel->Number());
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), channel->Number(), true);
return (true);
}
}
@@ -811,7 +945,7 @@ eOSState cFemonOsd::ProcessKey(eKeys Key)
{
eOSState state = cOsdObject::ProcessKey(Key);
if (state == osUnknown) {
switch (Key) {
switch (int(Key)) {
case k0:
if ((m_Number == 0) && (m_OldNumber != 0)) {
m_Number = m_OldNumber;

View File

@@ -24,6 +24,13 @@
class cFemonOsd : public cOsdObject, public cThread, public cStatus {
private:
enum eDeviceSourceType {
DEVICESOURCE_DVBAPI = 0,
DEVICESOURCE_IPTV,
DEVICESOURCE_PVRINPUT,
DEVICESOURCE_COUNT
};
static cFemonOsd *pInstance;
cOsd *m_Osd;
@@ -36,6 +43,10 @@ private:
cPlugin *m_SvdrpPlugin;
int m_Number;
int m_OldNumber;
int m_Quality;
bool m_QualityValid;
int m_Strength;
bool m_StrengthValid;
uint16_t m_SNR;
bool m_SNRValid;
uint16_t m_Signal;
@@ -44,9 +55,11 @@ private:
bool m_BERValid;
uint32_t m_UNC;
bool m_UNCValid;
cString m_FrontendName;
fe_status_t m_FrontendStatus;
bool m_FrontendStatusValid;
dvb_frontend_info m_FrontendInfo;
eDeviceSourceType m_DeviceSource;
int m_DisplayMode;
int m_OsdWidth;
int m_OsdHeight;
@@ -67,7 +80,7 @@ protected:
cFemonOsd(const cFemonOsd&);
cFemonOsd& operator= (const cFemonOsd&);
virtual void Action(void);
virtual void ChannelSwitch(const cDevice * device, int channelNumber);
virtual void ChannelSwitch(const cDevice *device, int channelNumber, bool liveView);
virtual void SetAudioTrack(int Index, const char * const *Tracks);
public:

View File

@@ -10,8 +10,9 @@
#include "femoncfg.h"
#include "femonreceiver.h"
cFemonReceiver::cFemonReceiver(int Vtype, int Vpid, int Apid, int Dpid)
: cThread("femon receiver"),
cFemonReceiver::cFemonReceiver(const cChannel *Channel, int ATrack, int DTrack)
: cReceiver(Channel),
cThread("femon receiver"),
m_Mutex(),
m_Sleep(),
m_Active(false),
@@ -21,24 +22,25 @@ cFemonReceiver::cFemonReceiver(int Vtype, int Vpid, int Apid, int Dpid)
m_DetectLATM(this),
m_DetectAC3(this),
m_VideoBuffer(KILOBYTE(512), TS_SIZE, false, "Femon video"),
m_VideoType(Vtype),
m_VideoPid(Vpid),
m_VideoType(Channel ? Channel->Vtype(): 0),
m_VideoPid(Channel ? Channel->Vpid() : 0),
m_VideoPacketCount(0),
m_VideoBitrate(0.0),
m_VideoValid(false),
m_AudioBuffer(KILOBYTE(256), TS_SIZE, false, "Femon audio"),
m_AudioPid(Apid),
m_AudioPid(Channel ? Channel->Apid(ATrack) : 0),
m_AudioPacketCount(0),
m_AudioBitrate(0.0),
m_AudioValid(false),
m_AC3Buffer(KILOBYTE(256), TS_SIZE, false, "Femon AC3"),
m_AC3Pid(Dpid),
m_AC3Pid(Channel ? Channel->Dpid(DTrack) : 0),
m_AC3PacketCount(0),
m_AC3Bitrate(0),
m_AC3Valid(false)
{
debug("%s()\n", __PRETTY_FUNCTION__);
SetPids(NULL);
AddPid(m_VideoPid);
AddPid(m_AudioPid);
AddPid(m_AC3Pid);
@@ -142,7 +144,7 @@ void cFemonReceiver::Action(void)
bool processed = false;
// process available video data
while (Data = m_VideoBuffer.Get(Length)) {
while ((Data = m_VideoBuffer.Get(Length))) {
if (!m_Active || (Length < TS_SIZE))
break;
Length = TS_SIZE;
@@ -179,7 +181,7 @@ void cFemonReceiver::Action(void)
}
// process available audio data
while (Data = m_AudioBuffer.Get(Length)) {
while ((Data = m_AudioBuffer.Get(Length))) {
if (!m_Active || (Length < TS_SIZE))
break;
Length = TS_SIZE;
@@ -204,7 +206,7 @@ void cFemonReceiver::Action(void)
}
// process available dolby data
while (Data = m_AC3Buffer.Get(Length)) {
while ((Data = m_AC3Buffer.Get(Length))) {
if (!m_Active || (Length < TS_SIZE))
break;
Length = TS_SIZE;

View File

@@ -108,7 +108,7 @@ public:
m_AC3Info.lfe = onoff; }
public:
cFemonReceiver(int Vtype, int Vpid, int Apid, int Dpid);
cFemonReceiver(const cChannel* Channel, int ATrack, int DTrack);
virtual ~cFemonReceiver();
void Deactivate(void);

View File

@@ -41,9 +41,17 @@
#include "symbols/seven.xpm"
#include "symbols/eight.xpm"
#include "symbols/format1080.xpm"
#include "symbols/format1080i.xpm"
#include "symbols/format1080p.xpm"
#include "symbols/format720.xpm"
#include "symbols/format720i.xpm"
#include "symbols/format720p.xpm"
#include "symbols/format576.xpm"
#include "symbols/format576i.xpm"
#include "symbols/format576p.xpm"
#include "symbols/format480.xpm"
#include "symbols/format480i.xpm"
#include "symbols/format480p.xpm"
static cBitmap bmStereo(stereo_xpm);
static cBitmap bmMonoLeft(monoleft_xpm);
@@ -77,9 +85,17 @@ static cBitmap bmSix(six_xpm);
static cBitmap bmSeven(seven_xpm);
static cBitmap bmEight(eight_xpm);
static cBitmap bmFormat1080(format1080_xpm);
static cBitmap bmFormat1080i(format1080i_xpm);
static cBitmap bmFormat1080p(format1080p_xpm);
static cBitmap bmFormat720(format720_xpm);
static cBitmap bmFormat720i(format720i_xpm);
static cBitmap bmFormat720p(format720p_xpm);
static cBitmap bmFormat576(format576_xpm);
static cBitmap bmFormat576i(format576i_xpm);
static cBitmap bmFormat576p(format576p_xpm);
static cBitmap bmFormat480(format480_xpm);
static cBitmap bmFormat480i(format480i_xpm);
static cBitmap bmFormat480p(format480p_xpm);
cFemonSymbolCache femonSymbols;
@@ -150,9 +166,17 @@ bool cFemonSymbolCache::Populate(void)
cacheM.Append(bmSeven.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_SEVEN
cacheM.Append(bmEight.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_EIGHT
cacheM.Append(bmFormat1080.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_1080
cacheM.Append(bmFormat1080i.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_1080i
cacheM.Append(bmFormat1080p.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_1080p
cacheM.Append(bmFormat720.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_720
cacheM.Append(bmFormat720i.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_720i
cacheM.Append(bmFormat720p.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_720p
cacheM.Append(bmFormat576.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_576
cacheM.Append(bmFormat576i.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_576i
cacheM.Append(bmFormat576p.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_576p
cacheM.Append(bmFormat480.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_480
cacheM.Append(bmFormat480i.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_480i
cacheM.Append(bmFormat480p.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_480p
return true;
}

View File

@@ -44,9 +44,17 @@ enum eSymbols {
SYMBOL_SEVEN,
SYMBOL_EIGHT,
SYMBOL_FORMAT_1080,
SYMBOL_FORMAT_1080i,
SYMBOL_FORMAT_1080p,
SYMBOL_FORMAT_720,
SYMBOL_FORMAT_720i,
SYMBOL_FORMAT_720p,
SYMBOL_FORMAT_576,
SYMBOL_FORMAT_576i,
SYMBOL_FORMAT_576p,
SYMBOL_FORMAT_480,
SYMBOL_FORMAT_480i,
SYMBOL_FORMAT_480p,
SYMBOL_MAX_COUNT
};
@@ -69,8 +77,8 @@ public:
~cFemonSymbolCache();
void Refresh();
cBitmap& Get(eSymbols symbolP);
int GetSpacing() { return yFactorM * DEFAULT_SPACING; }
int GetRounding() { return yFactorM * DEFAULT_ROUNDING; }
int GetSpacing() { return int(yFactorM * DEFAULT_SPACING); }
int GetRounding() { return int(yFactorM * DEFAULT_ROUNDING); }
};
extern cFemonSymbolCache femonSymbols;

View File

@@ -25,41 +25,41 @@ static cString getCA(int value)
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
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("SECA Mediaguard (%X)", value); // Canal Plus
case 0x0464: return cString::sprintf("EuroDec (%X)", value); // EuroDec
case 0x0500 ... 0x05FF: return cString::sprintf("Viaccess (%X)", value); // France Telecom
case 0x0600 ... 0x06FF: return cString::sprintf("Irdeto (%X)", value); // Irdeto
case 0x0900 ... 0x09FF: return cString::sprintf("NDS Videoguard (%X)", value); // News Datacom
case 0x0B00 ... 0x0BFF: return cString::sprintf("Conax (%X)", value); // Norwegian Telekom
case 0x0D00 ... 0x0DFF: return cString::sprintf("CryptoWorks (%X)", value); // Philips
case 0x0E00 ... 0x0EFF: return cString::sprintf("PowerVu (%X)", value); // Scientific Atlanta
case 0x1000: return cString::sprintf("RAS (%X)", value); // Tandberg Television
case 0x1200 ... 0x12FF: return cString::sprintf("NagraVision (%X)", value); // BellVu Express
case 0x1700 ... 0x17FF: return cString::sprintf("BetaCrypt (%X)", value); // BetaTechnik
case 0x1800 ... 0x18FF: return cString::sprintf("NagraVision (%X)", value); // Kudelski SA
case 0x22F0: return cString::sprintf("Codicrypt (%X)", value); // Scopus Network Technologies
case 0x2600: return cString::sprintf("BISS (%X)", value); // European Broadcasting Union
case 0x4347: return cString::sprintf("CryptOn (%X)", value); // CryptOn
case 0x4800: return cString::sprintf("Accessgate (%X)", value); // Telemann
case 0x4900: return cString::sprintf("China Crypt (%X)", value); // CryptoWorks
case 0x4A10: return cString::sprintf("EasyCas (%X)", value); // EasyCas
case 0x4A20: return cString::sprintf("AlphaCrypt (%X)", value); // AlphaCrypt
case 0x4A70: return cString::sprintf("DreamCrypt (%X)", value); // Dream Multimedia
case 0x4A60: return cString::sprintf("SkyCrypt (%X)", value); // @Sky
case 0x4A61: return cString::sprintf("Neotioncrypt (%X)", value); // Neotion
case 0x4A62: return cString::sprintf("SkyCrypt (%X)", value); // @Sky
case 0x4A63: return cString::sprintf("Neotion SHL (%X)", value); // Neotion
case 0x4A64 ... 0x4A6F: return cString::sprintf("SkyCrypt (%X)", value); // @Sky
case 0x4A80: return cString::sprintf("ThalesCrypt (%X)", value); // TPS
case 0x4AA1: return cString::sprintf("KeyFly (%X)", value); // SIDSA
case 0x4ABF: return cString::sprintf("DG-Crypt (%X)", value); // Beijing Compunicate Technology Inc.
case 0x4AD0 ... 0x4AD1: return cString::sprintf("X-Crypt (%X)", value); // XCrypt Inc.
case 0x4AD4: return cString::sprintf("OmniCrypt (%X)", value); // Widevine Technologies, Inc.
case 0x4AE0: return cString::sprintf("RossCrypt (%X)", value); // Digi Raum Electronics Co. Ltd.
case 0x5500: return cString::sprintf("Z-Crypt (%X)", value); // Digi Raum Electronics Co. Ltd.
case 0x5501: return cString::sprintf("Griffin (%X)", value); // Griffin
default: break;
}
return cString::sprintf("%X", value);
@@ -76,7 +76,17 @@ static const char *getUserString(int Value, const tDvbParameterMap *Map)
return "---";
}
cString getFrontendInfo(int cardIndex)
cDvbDevice *getDvbDevice(cDevice* device)
{
cDvbDevice *dev = dynamic_cast<cDvbDevice*>(device);
#ifdef __DYNAMIC_DEVICE_PROBE
if (!dev && device && device->HasSubDevice())
dev = dynamic_cast<cDvbDevice*>(device->SubDevice());
#endif
return dev;
}
cString getFrontendInfo(cDvbDevice *device)
{
cString info;
struct dvb_frontend_info value;
@@ -86,16 +96,18 @@ cString getFrontendInfo(int cardIndex)
uint32_t ber = 0;
uint32_t unc = 0;
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (!device)
return info;
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0)
return NULL;
return info;
info = cString::sprintf("CARD:%d", cardIndex);
info = cString::sprintf("CARD:%d\nSTRG:%d\nQUAL:%d", device->CardIndex(), device->SignalStrength(), device->SignalQuality());
if (ioctl(fe, FE_GET_INFO, &value) >= 0)
info = cString::sprintf("%s\nTYPE:%d\nNAME:%s", *info, value.type, value.name);
info = cString::sprintf("%s\nTYPE:%d\nNAME:%s", *info, value.type, *device->DeviceName());
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)
@@ -117,42 +129,39 @@ cString getFrontendInfo(int cardIndex)
return info;
}
cString getFrontendName(int cardIndex)
cString getFrontendName(cDvbDevice *device)
{
struct dvb_frontend_info value;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (fe < 0)
if (!device)
return NULL;
memset(&value, 0, sizeof(value));
ioctl(fe, FE_GET_INFO, &value);
close(fe);
return (cString::sprintf("%s on device #%d", value.name, cardIndex));
return (cString::sprintf("%s on device #%d", *device->DeviceName(), device->CardIndex()));
}
cString getFrontendStatus(int cardIndex)
cString getFrontendStatus(cDvbDevice *device)
{
fe_status_t value;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (!device)
return NULL;
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0)
return NULL;
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));
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" : "-", device->CardIndex()));
}
uint16_t getSignal(int cardIndex)
uint16_t getSignal(cDvbDevice *device)
{
uint16_t value = 0;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (!device)
return (value);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0)
return (value);
ioctl(fe, FE_READ_SIGNAL_STRENGTH, &value);
@@ -161,12 +170,14 @@ uint16_t getSignal(int cardIndex)
return (value);
}
uint16_t getSNR(int cardIndex)
uint16_t getSNR(cDvbDevice *device)
{
uint16_t value = 0;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (!device)
return (value);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0)
return (value);
ioctl(fe, FE_READ_SNR, &value);
@@ -175,12 +186,14 @@ uint16_t getSNR(int cardIndex)
return (value);
}
uint32_t getBER(int cardIndex)
uint32_t getBER(cDvbDevice *device)
{
uint32_t value = 0;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (!device)
return (value);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0)
return (value);
ioctl(fe, FE_READ_BER, &value);
@@ -189,12 +202,14 @@ uint32_t getBER(int cardIndex)
return (value);
}
uint32_t getUNC(int cardIndex)
uint32_t getUNC(cDvbDevice *device)
{
uint32_t value = 0;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (!device)
return (value);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0)
return (value);
ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &value);
@@ -347,9 +362,14 @@ cString getModulation(int value)
return cString::sprintf("%s", getUserString(value, ModulationValues));
}
cString getSystem(int value)
cString getTerrestrialSystem(int value)
{
return cString::sprintf("%s", getUserString(value, SystemValues));
return cString::sprintf("%s", getUserString(value, SystemValuesTerr));
}
cString getSatelliteSystem(int value)
{
return cString::sprintf("%s", getUserString(value, SystemValuesSat));
}
cString getRollOff(int value)
@@ -542,84 +562,31 @@ cString getBitrateKbits(double value)
return cString::sprintf("---");
}
cBitStream::cBitStream(const uint8_t *buf, const int len)
: data(buf),
count(len),
index(0)
{
}
// --- cFemonBitStream -------------------------------------------------------
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()
uint32_t cFemonBitStream::GetUeGolomb()
{
int n = 0;
while (!getBit() && (n < 32))
while (!GetBit() && (n < 32))
n++;
return (n ? ((1 << n) - 1) + getBits(n) : 0);
return (n ? ((1 << n) - 1) + GetBits(n) : 0);
}
int32_t cBitStream::getSeGolomb()
int32_t cFemonBitStream::GetSeGolomb()
{
uint32_t r = getUeGolomb() + 1;
uint32_t r = GetUeGolomb() + 1;
return ((r & 1) ? -(r >> 1) : (r >> 1));
}
void cBitStream::skipGolomb()
void cFemonBitStream::SkipGolomb()
{
int n = 0;
while (!getBit() && (n < 32))
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);
SkipBits(n);
}

View File

@@ -10,6 +10,7 @@
#include <stdint.h>
#include <vdr/channels.h>
#include <vdr/dvbdevice.h>
#include <vdr/remux.h>
#include <vdr/tools.h>
@@ -25,15 +26,17 @@
#define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d"
cString getFrontendInfo(int cardIndex = 0);
cString getFrontendName(int cardIndex = 0);
cString getFrontendStatus(int cardIndex = 0);
cDvbDevice *getDvbDevice(cDevice* device);
uint16_t getSNR(int cardIndex = 0);
uint16_t getSignal(int cardIndex = 0);
cString getFrontendInfo(cDvbDevice *device);
cString getFrontendName(cDvbDevice *device);
cString getFrontendStatus(cDvbDevice *device);
uint32_t getBER(int cardIndex = 0);
uint32_t getUNC(int cardIndex = 0);
uint16_t getSNR(cDvbDevice *device);
uint16_t getSignal(cDvbDevice *device);
uint32_t getBER(cDvbDevice *device);
uint32_t getUNC(cDvbDevice *device);
cString getApids(const cChannel *channel);
cString getDpids(const cChannel *channel);
@@ -51,7 +54,8 @@ cString getInversion(int value);
cString getHierarchy(int value);
cString getGuard(int value);
cString getModulation(int value);
cString getSystem(int value);
cString getTerrestrialSystem(int value);
cString getSatelliteSystem(int value);
cString getRollOff(int value);
cString getResolution(int width, int height, int scan);
cString getAspectRatio(int value);
@@ -71,35 +75,14 @@ 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
class cFemonBitStream : public cBitStream {
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)); }
};
cFemonBitStream(const uint8_t *Data, const int Length) : cBitStream(Data, Length) {}
uint32_t GetUeGolomb();
int32_t GetSeGolomb();
void SkipGolomb();
void SkipUeGolomb() { SkipGolomb(); }
void SkipSeGolomb() { SkipGolomb(); }
};
#endif // __FEMONTOOLS_H

22
iptvservice.h Normal file
View File

@@ -0,0 +1,22 @@
/*
* iptvservice.h: IPTV plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __IPTVSERVICE_H
#define __IPTVSERVICE_H
#include <vdr/tools.h>
#define stIptv ('I' << 24)
struct IptvService_v1_0 {
unsigned int cardIndex;
cString protocol;
cString bitrate;
};
#endif //__IPTVSERVICE_H

View File

@@ -7,7 +7,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n"
"Project-Id-Version: vdr-femon 1.7.17\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
@@ -66,6 +66,9 @@ msgstr "Duotone"
msgid "SilverGreen"
msgstr "SilverGreen"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry"
msgstr "Hauptmen<65>eintrag verstecken"
@@ -177,6 +180,12 @@ msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Bitrate"
msgid "Stream Information"
msgstr "Streaminformation"
@@ -186,9 +195,6 @@ msgstr "Video Stream"
msgid "Codec"
msgstr ""
msgid "Bitrate"
msgstr "Bitrate"
msgid "Aspect Ratio"
msgstr "Seitenverh<72>ltnis"

View File

@@ -5,7 +5,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n"
"Project-Id-Version: vdr-femon 1.7.17\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
@@ -64,6 +64,9 @@ msgstr "Duotone"
msgid "SilverGreen"
msgstr "SilverGreen"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry"
msgstr "Ocultar en el men<65> principal"
@@ -175,6 +178,12 @@ msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Tasa de bits"
msgid "Stream Information"
msgstr "Informaci<63>n del flujo"
@@ -184,9 +193,6 @@ msgstr "Flujo de video"
msgid "Codec"
msgstr ""
msgid "Bitrate"
msgstr "Tasa de bits"
msgid "Aspect Ratio"
msgstr "Proporciones de la imagen"

View File

@@ -5,7 +5,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n"
"Project-Id-Version: vdr-femon 1.7.17\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
@@ -64,6 +64,9 @@ msgstr "Duotone"
msgid "SilverGreen"
msgstr "SilverGreen"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry"
msgstr "Peita valik peamen<65><6E>s"
@@ -175,6 +178,12 @@ msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Bitikiirus"
msgid "Stream Information"
msgstr "Vooinfo"
@@ -184,9 +193,6 @@ msgstr "Videovoog"
msgid "Codec"
msgstr "Koodek"
msgid "Bitrate"
msgstr "Bitikiirus"
msgid "Aspect Ratio"
msgstr "K<>lgsuhe"

View File

@@ -5,7 +5,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n"
"Project-Id-Version: vdr-femon 1.7.17\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
@@ -64,6 +64,9 @@ msgstr "Duotone"
msgid "SilverGreen"
msgstr "SilverGreen"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry"
msgstr "Piilota valinta päävalikosta"
@@ -175,6 +178,12 @@ msgstr "Radio-ID"
msgid "Coderate"
msgstr "Suojaustaso"
msgid "Protocol"
msgstr "Protokolla"
msgid "Bitrate"
msgstr "Bittinopeus"
msgid "Stream Information"
msgstr "Lähetteen tiedot"
@@ -184,9 +193,6 @@ msgstr "Kuvaraita"
msgid "Codec"
msgstr "Koodekki"
msgid "Bitrate"
msgstr "Bittinopeus"
msgid "Aspect Ratio"
msgstr "Kuvasuhde"
@@ -381,3 +387,9 @@ msgstr "Mbit/s"
msgid "kbit/s"
msgstr "kbit/s"
#~ msgid "Information"
#~ msgstr "Tiedot"
#~ msgid "Statistics"
#~ msgstr "Tilastot"

View File

@@ -5,7 +5,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n"
"Project-Id-Version: vdr-femon 1.7.17\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
@@ -64,6 +64,9 @@ msgstr "Duotone"
msgid "SilverGreen"
msgstr "SilverGreen"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry"
msgstr "Masquer dans le menu principal"
@@ -175,6 +178,12 @@ msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Bitrate"
msgid "Stream Information"
msgstr "Information flux"
@@ -184,9 +193,6 @@ msgstr "Flux vid
msgid "Codec"
msgstr ""
msgid "Bitrate"
msgstr "Bitrate"
msgid "Aspect Ratio"
msgstr "Proportions d'image"

392
po/hu_HU.po Normal file
View File

@@ -0,0 +1,392 @@
# VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# F<>ley Istv<74>n <ifuley at tigercomp dot ro>, 2011
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 1.7.17\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0200\n"
"Last-Translator: F<>ley Istv<74>n <ifuley at tigercomp dot ro>\n"
"Language-Team: Hungarian <ifuley at tigercomp dot ro>\n"
"Language: hu\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-2\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-Language: Hungarian\n"
"X-Poedit-Country: HUNGARY\n"
"X-Poedit-SourceCharset: iso-8859-2\n"
msgid "DVB Signal Information Monitor (OSD)"
msgstr "DVB jelszint monitor (OSD)"
msgid "Signal Information"
msgstr "Jel inform<72>ci<63>"
msgid "Femon not available"
msgstr "Femon nem el<65>rhet<65>"
msgid "basic"
msgstr "alap"
msgid "transponder"
msgstr "transponder"
msgid "stream"
msgstr "adatfolyam (stream)"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "Klasszikus"
msgid "Elchi"
msgstr "Elchi"
msgid "ST:TNG"
msgstr "ST:TNG"
msgid "DeepBlue"
msgstr "S<>t<EFBFBD>tk<74>k"
msgid "Moronimo"
msgstr "Moronimo"
msgid "Enigma"
msgstr "Enigma"
msgid "EgalsTry"
msgstr "EgalsTry"
msgid "Duotone"
msgstr "K<>tsz<73>n<EFBFBD> (duotone)"
msgid "SilverGreen"
msgstr "Ez<45>st-z<>ld"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry"
msgstr "Men<65>bejegyz<79>s elrejt<6A>se"
msgid "Define whether the main menu entry is hidden."
msgstr "Meghat<61>rozza, hogy megjelenjen-e a f<>men<65>ben."
msgid "Default display mode"
msgstr "Alap<61>rtelmezett megjelen<65>t<EFBFBD>si m<>d"
msgid "Define the default display mode at startup."
msgstr "Bekapcsol<6F>skor melyik megjelen<65>t<EFBFBD>si m<>ddal induljon."
msgid "Define the used OSD skin."
msgstr "Az OSD b<>r kiv<69>laszt<7A>sa."
msgid "Define the used OSD theme."
msgstr "Az OSD t<>ma kiv<69>laszt<7A>sa."
msgid "Position"
msgstr "Elhelyez<65>s"
msgid "Define the position of OSD."
msgstr "A k<>perny<6E>elhelyez<65>s kiv<69>laszt<7A>sa"
msgid "Downscale OSD size [%]"
msgstr "Az OSD lem<65>retez<65>se [%]"
msgid "Define the downscale ratio for OSD size."
msgstr "Az OSD m<>ret<65>nek lem<65>retez<65>se sz<73>zal<61>kban."
msgid "Red limit [%]"
msgstr "Piros sz<73>nt hat<61>ra [%]"
msgid "Define a limit for red bar, which is used to indicate a bad signal."
msgstr "A piros s<>v hat<61>r<EFBFBD>nak be<62>ll<6C>t<EFBFBD>sa, ezt haszn<7A>ljuk a nem el<65>gs<67>ges jelszint kijelz<6C>s<EFBFBD>hez."
msgid "Green limit [%]"
msgstr "Z<>ld sz<73>nt hat<61>ra [%]"
msgid "Define a limit for green bar, which is used to indicate a good signal."
msgstr "A z<>ld s<>v hat<61>r<EFBFBD>nak be<62>ll<6C>t<EFBFBD>sa, ezt haszn<7A>ljuk az el<65>gs<67>ges jelszint kijelz<6C>s<EFBFBD>hez."
msgid "OSD update interval [0.1s]"
msgstr "OSD friss<73>t<EFBFBD>s<EFBFBD>nek gyakoris<69>ga [0.1mp]"
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
msgstr "Meghat<61>rozza, hogy milyen gyakran legyen friss<73>tve az OSD. Kisebb intervallum nagyobb CPU terhel<65>st eredm<64>nyez."
msgid "Analyze stream"
msgstr "Adatfolyam (stream) elemz<6D>se."
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
msgstr "Meghat<61>rozza, hogy a DVB adatfolyam elemz<6D>sre ker<65>lj<6C>n-e, <20>s sz<73>mol<6F>djon-e bitr<74>ta."
msgid "Calculation interval [0.1s]"
msgstr "Sz<53>m<EFBFBD>t<EFBFBD>s gyakoris<69>ga [0.1mp]"
msgid "Define an interval for calculation. The bigger interval generates more stable values."
msgstr "Meghat<61>rozza, hogy milyen gyakran t<>rt<72>njen sz<73>m<EFBFBD>t<EFBFBD>s. Nagyobb intervallum pontosabb <20>rt<72>keket eredm<64>nyez."
msgid "Use SVDRP service"
msgstr "SVDRP szolg<6C>ltat<61>s haszn<7A>lata."
msgid "Define whether the SVDRP service is used in client/server setups."
msgstr "Ki-bekapcsolja az SVDRP szolg<6C>ltat<61>st, amely kliens-szerver k<>rnyezetben haszn<7A>latos."
msgid "SVDRP service port"
msgstr "Az SVDRP szolg<6C>ltat<61>s portja"
msgid "Define the port number of SVDRP service."
msgstr "Meghat<61>rozza, hogy melyik porton fut az SVDRP."
msgid "SVDRP service IP"
msgstr "Az SVDRP szolg<6C>ltat<61>s IP-je"
msgid "Define the IP address of SVDRP service."
msgstr "Meghat<61>rozza, hogy milyen IP c<>men fut az SVDRP szolg<6C>ltat<61>s."
msgid "Help"
msgstr "Seg<65>ts<74>g"
msgid "Video"
msgstr "Video"
msgid "Audio"
msgstr "Audio"
msgid "Transponder Information"
msgstr "Transponder inf<6E>"
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 "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Bitr<74>ta"
msgid "Stream Information"
msgstr "Adatfolyam inf<6E>"
msgid "Video Stream"
msgstr "Vide<64> adatfolyam"
msgid "Codec"
msgstr "Kodek"
msgid "Aspect Ratio"
msgstr "M<>retar<61>ny"
msgid "Frame Rate"
msgstr "K<>pfriss<73>t<EFBFBD>s"
msgid "Video Format"
msgstr "Vide<64> form<72>tum"
msgid "Resolution"
msgstr "Felbont<6E>s"
msgid "Audio Stream"
msgstr "Hang adatfolyam"
msgid "Channel Mode"
msgstr "Hangs<67>v m<>d"
msgid "Sampling Frequency"
msgstr "Mintav<61>telez<65>si frekvencia"
msgid "AC-3 Stream"
msgstr "AC-3 adatfolyam"
msgid "Bit Stream Mode"
msgstr "Bit Stream m<>d"
msgid "Audio Coding Mode"
msgstr "Hang k<>dol<6F>si m<>d"
msgid "Center Mix Level"
msgstr "K<>z<EFBFBD>pcsatorna kever<65>si jelszintje"
msgid "Surround Mix Level"
msgstr "T<>rhat<61>s csatorna kever<65>si szintje"
msgid "Dolby Surround Mode"
msgstr "Dolby Surround m<>d"
msgid "Low Frequency Effects"
msgstr "LFE - alacsony frekvenci<63>s effektek"
msgid "Dialogue Normalization"
msgstr "P<>rbesz<73>d jelszint normaliz<69>l<EFBFBD>sa"
msgid "Fixed"
msgstr "<22>lland<6E>"
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 "LATM"
msgstr "LATM"
msgid "stereo"
msgstr "sztere<72>"
msgid "joint Stereo"
msgstr "joint sztere<72>"
msgid "dual"
msgstr "du<64>l"
msgid "mono"
msgstr "mon<6F>"
msgid "interlaced"
msgstr "v<>ltotts<74>vos"
msgid "progressive"
msgstr "progressz<73>v"
msgid "reserved"
msgstr "fenntartott"
msgid "extended"
msgstr "kiterjesztett"
msgid "unknown"
msgstr "ismeretlen"
msgid "component"
msgstr "komponens"
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 "Mestercsatorna (CM)"
msgid "Music and Effects (ME)"
msgstr "Zene <20>s effektek (ME)"
msgid "Visually Impaired (VI)"
msgstr "L<>t<EFBFBD>sk<73>rosultak (VI)"
msgid "Hearing Impaired (HI)"
msgstr "Hall<6C>sk<73>rosultak (HI)"
msgid "Dialogue (D)"
msgstr "P<>rbesz<73>d (D)"
msgid "Commentary (C)"
msgstr "Narr<72>ci<63> (C)"
msgid "Emergency (E)"
msgstr "S<>rg<72>ss<73>gi (E)"
msgid "Voice Over (VO)"
msgstr "R<>besz<73>l<EFBFBD>s (VO)"
msgid "Karaoke"
msgstr "Karaoke"
msgid "Ch1"
msgstr "Ch1"
msgid "Ch2"
msgstr "Ch2"
msgid "C"
msgstr "K"
msgid "L"
msgstr "B"
msgid "R"
msgstr "J"
msgid "S"
msgstr "S"
msgid "SL"
msgstr "BS"
msgid "SR"
msgstr "JS"
msgid "dB"
msgstr "dB"
msgid "not indicated"
msgstr "nincs felt<6C>ntetve"
msgid "MHz"
msgstr "MHz"
msgid "free"
msgstr "szabad"
msgid "Mbit/s"
msgstr "Mbit/s"
msgid "kbit/s"
msgstr "kbit/s"

View File

@@ -6,7 +6,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n"
"Project-Id-Version: vdr-femon 1.7.17\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
@@ -68,6 +68,9 @@ msgstr "Duotone"
msgid "SilverGreen"
msgstr "SilverGreen"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry"
msgstr "Nascondi voce menu principale"
@@ -179,6 +182,12 @@ msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Bitrate"
msgid "Stream Information"
msgstr "Informazioni flusso"
@@ -188,9 +197,6 @@ msgstr "Flusso video"
msgid "Codec"
msgstr "Codifica"
msgid "Bitrate"
msgstr "Bitrate"
msgid "Aspect Ratio"
msgstr "Formato immagine"

View File

@@ -5,7 +5,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n"
"Project-Id-Version: vdr-femon 1.7.17\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
@@ -64,6 +64,9 @@ msgstr "Duotone"
msgid "SilverGreen"
msgstr "SilverGreen"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry"
msgstr "Paslėpti pagrindinio meniu įrašus"
@@ -175,6 +178,12 @@ msgstr "Rid"
msgid "Coderate"
msgstr "Kodavimo dažnis"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Kokybė"
msgid "Stream Information"
msgstr "Srauto informacija"
@@ -184,9 +193,6 @@ msgstr "Video srautas"
msgid "Codec"
msgstr "Kodekas"
msgid "Bitrate"
msgstr "Kokybė"
msgid "Aspect Ratio"
msgstr "Proporcijos"

View File

@@ -5,7 +5,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n"
"Project-Id-Version: vdr-femon 1.7.17\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
@@ -64,6 +64,9 @@ msgstr "Duotone"
msgid "SilverGreen"
msgstr "SilverGreen"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"
@@ -175,6 +178,12 @@ msgstr "Rid"
msgid "Coderate"
msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr ""
msgid "Stream Information"
msgstr ""
@@ -184,9 +193,6 @@ msgstr ""
msgid "Codec"
msgstr ""
msgid "Bitrate"
msgstr ""
msgid "Aspect Ratio"
msgstr ""

View File

@@ -5,7 +5,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n"
"Project-Id-Version: vdr-femon 1.7.17\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
@@ -64,6 +64,9 @@ msgstr "双色调"
msgid "SilverGreen"
msgstr "银绿"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry"
msgstr "隐藏主菜单条目."
@@ -175,6 +178,12 @@ msgstr "Rid"
msgid "Coderate"
msgstr "码速率"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "比特率"
msgid "Stream Information"
msgstr "流信息"
@@ -184,9 +193,6 @@ msgstr "视频流"
msgid "Codec"
msgstr "解码模式"
msgid "Bitrate"
msgstr "比特率"
msgid "Aspect Ratio"
msgstr "纵横比"

View File

@@ -5,7 +5,7 @@
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n"
"Project-Id-Version: vdr-femon 1.7.17\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
@@ -64,6 +64,9 @@ msgstr "雙色調"
msgid "SilverGreen"
msgstr "銀綠"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry"
msgstr "隱藏主菜單條目."
@@ -175,6 +178,12 @@ msgstr "Rid"
msgid "Coderate"
msgstr "碼速率"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "比特率"
msgid "Stream Information"
msgstr "流信息"
@@ -184,9 +193,6 @@ msgstr "視頻流"
msgid "Codec"
msgstr "解碼模式"
msgid "Bitrate"
msgstr "比特率"
msgid "Aspect Ratio"
msgstr "縱橫比"

23
symbols/format1080i.xpm Normal file
View File

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

23
symbols/format1080p.xpm Normal file
View File

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

23
symbols/format480i.xpm Normal file
View File

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

23
symbols/format480p.xpm Normal file
View File

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

23
symbols/format576i.xpm Normal file
View File

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

23
symbols/format576p.xpm Normal file
View File

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

23
symbols/format720i.xpm Normal file
View File

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

23
symbols/format720p.xpm Normal file
View File

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