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

Compare commits

..

26 Commits

Author SHA1 Message Date
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
40 changed files with 1285 additions and 572 deletions

27
HISTORY
View File

@@ -414,3 +414,30 @@ VDR Plugin 'femon' Revision History
- Updated for vdr-1.7.18. - Updated for vdr-1.7.18.
- Added scaling for symbols. - 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.

View File

@@ -19,6 +19,7 @@ PLUGIN = femon
### The version number of this plugin (taken from the main source file): ### The version number of this plugin (taken from the main source file):
VERSION = $(shell grep 'static const char VERSION\[\] *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g') VERSION = $(shell grep 'static const char VERSION\[\] *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
GITTAG = $(shell git describe --always 2>/dev/null)
### The C++ compiler and options: ### The C++ compiler and options:
@@ -28,9 +29,9 @@ LDFLAGS ?= -Wl,--as-needed
### The directory environment: ### The directory environment:
VDRDIR = ../../.. VDRDIR ?= ../../..
LIBDIR = ../../lib LIBDIR ?= ../../lib
TMPDIR = /tmp TMPDIR ?= /tmp
### Make sure that necessary options are included: ### Make sure that necessary options are included:
@@ -59,6 +60,10 @@ ifdef FEMON_DEBUG
DEFINES += -DDEBUG DEFINES += -DDEBUG
endif endif
ifneq ($(strip $(GITTAG)),)
DEFINES += -DGITVERSION='"-GIT-$(GITTAG)"'
endif
.PHONY: all all-redirect .PHONY: all all-redirect
all-redirect: all all-redirect: all
@@ -96,7 +101,7 @@ I18Npot = $(PODIR)/$(PLUGIN).pot
msgfmt -c -o $@ $< msgfmt -c -o $@ $<
$(I18Npot): $(wildcard *.c) $(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) %.po: $(I18Npot)
msgmerge -U --no-wrap --no-location --backup=none -q $@ $< msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
@@ -128,3 +133,6 @@ dist: $(I18Npo) clean
clean: clean:
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ $(PODIR)/*.mo $(PODIR)/*.pot @-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]| |## Channel Name ################### [SVDRP][AR][VF][A/DD][D]|
|[=====Signal Strength in % ==============|=================]| |[=====Signal Strength ===================|=================]|
|[=====Signal-to-Noise Ratio in % ========|=================]| |[=====Signal Quality ================|=====================]|
| STR: #0000 (0%) BER: #00000000 Video: 0 Mbit/s | | STR: #0000 (0%) BER: #00000000 Video: 0 Mbit/s |
| SNR: #0000 (0%) UNC: #00000000 Audio: 0 kbit/s | | SNR: #0000 (0%) UNC: #00000000 Audio: 0 kbit/s |
| [LOCK] [SIGNAL] [CARRIER] [VITERBI] [SYNC] | | [LOCK] [SIGNAL] [CARRIER] [VITERBI] [SYNC] |
-------------------------------------------------------------- --------------------------------------------------------------
STR - Signal strength STR - Signal strength from driver
SNR - Signal-to-noise ratio SNR - Signal-to-noise ratio from driver
BER - Bit error rate BER - Bit error rate
UNC - Uncorrected blocks UNC - Uncorrected blocks
Video - Calculated video bitrate in Mbit/s Video - Calculated video bitrate in Mbit/s

96
femon.c
View File

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

View File

@@ -10,7 +10,7 @@
#define IS_HEAAC_AUDIO(buf) (((buf)[0] == 0xFF) && (((buf)[1] & 0xF6) == 0xF0)) #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 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) bool cFemonAAC::processAudio(const uint8_t *buf, int len)
{ {
cBitStream bs(buf, len * 8); cFemonBitStream bs(buf, len * 8);
if (!m_AudioHandler) if (!m_AudioHandler)
return false; return false;
@@ -48,23 +48,23 @@ bool cFemonAAC::processAudio(const uint8_t *buf, int len)
// skip PES header // skip PES header
if (!PesLongEnough(len)) if (!PesLongEnough(len))
return false; return false;
bs.skipBits(8 * PesPayloadOffset(buf)); bs.SkipBits(8 * PesPayloadOffset(buf));
// HE-AAC audio detection // HE-AAC audio detection
if (bs.getBits(12) != 0xFFF) // syncword if (bs.GetBits(12) != 0xFFF) // syncword
return false; return false;
bs.skipBit(); // id bs.SkipBit(); // id
// layer must be 0 // layer must be 0
if (bs.getBits(2)) // layer if (bs.GetBits(2)) // layer
return false; return false;
bs.skipBit(); // protection_absent bs.SkipBit(); // protection_absent
bs.skipBits(2); // profile bs.SkipBits(2); // profile
int sampling_frequency_index = bs.getBits(4); // sampling_frequency_index int sampling_frequency_index = bs.GetBits(4); // sampling_frequency_index
bs.skipBit(); // private pid bs.SkipBit(); // private pid
int channel_configuration = bs.getBits(3); // channel_configuration int channel_configuration = bs.GetBits(3); // channel_configuration
m_AudioHandler->SetAudioCodec(AUDIO_CODEC_HEAAC); m_AudioHandler->SetAudioCodec(AUDIO_CODEC_HEAAC);
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_RESERVED); m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_RESERVED);

View File

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

View File

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

View File

@@ -14,9 +14,9 @@ class cFemonAC3 {
private: private:
cFemonAC3If *m_AudioHandler; cFemonAC3If *m_AudioHandler;
static unsigned int s_Bitrates[32]; static int s_Bitrates[32];
static unsigned int s_Frequencies[4]; static int s_Frequencies[4];
static unsigned int s_Frames[3][32]; static int s_Frames[3][32];
public: public:
cFemonAC3(cFemonAC3If *audiohandler); cFemonAC3(cFemonAC3If *audiohandler);

View File

@@ -64,15 +64,15 @@ enum eFemonThemes
struct cFemonTheme struct cFemonTheme
{ {
int bpp; unsigned int bpp;
int clrBackground; unsigned int clrBackground;
int clrTitleBackground; unsigned int clrTitleBackground;
int clrTitleText; unsigned int clrTitleText;
int clrActiveText; unsigned int clrActiveText;
int clrInactiveText; unsigned int clrInactiveText;
int clrRed; unsigned int clrRed;
int clrYellow; unsigned int clrYellow;
int clrGreen; unsigned int clrGreen;
}; };
extern const cFemonTheme femonTheme[eFemonThemeMaxNumber]; extern const cFemonTheme femonTheme[eFemonThemeMaxNumber];

View File

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

View File

@@ -8,14 +8,14 @@
#include "femontools.h" #include "femontools.h"
#include "femonlatm.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, 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
{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 22050, 24000, 16000, -1
}; };
@@ -31,7 +31,7 @@ cFemonLATM::~cFemonLATM()
bool cFemonLATM::processAudio(const uint8_t *buf, int len) bool cFemonLATM::processAudio(const uint8_t *buf, int len)
{ {
cBitStream bs(buf, len * 8); cFemonBitStream bs(buf, len * 8);
if (!m_AudioHandler) if (!m_AudioHandler)
return false; return false;
@@ -39,23 +39,23 @@ bool cFemonLATM::processAudio(const uint8_t *buf, int len)
// skip PES header // skip PES header
if (!PesLongEnough(len)) if (!PesLongEnough(len))
return false; return false;
bs.skipBits(8 * PesPayloadOffset(buf)); bs.SkipBits(8 * PesPayloadOffset(buf));
// MPEG audio detection // MPEG audio detection
if (bs.getBits(12) != 0x56E) // syncword if (bs.GetBits(12) != 0x56E) // syncword
return false; return false;
m_AudioHandler->SetAudioCodec(AUDIO_CODEC_LATM); 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 return true; // @todo: lower sampling frequencies support
int layer = 3 - bs.getBits(2); // layer: I=11, II=10, III=01 int layer = 3 - bs.GetBits(2); // layer: I=11, II=10, III=01
bs.skipBit(); // protection bit bs.SkipBit(); // protection bit
int bit_rate_index = bs.getBits(4); // bitrate index int bit_rate_index = bs.GetBits(4); // bitrate index
int sampling_frequency = bs.getBits(2); // sampling frequency int sampling_frequency = bs.GetBits(2); // sampling frequency
bs.skipBit(); // padding bit bs.SkipBit(); // padding bit
bs.skipBit(); // private pid bs.SkipBit(); // private pid
int mode = bs.getBits(2); // mode int mode = bs.GetBits(2); // mode
switch (mode) { switch (mode) {
case 0: case 0:

View File

@@ -14,8 +14,8 @@ class cFemonLATM {
private: private:
cFemonAudioIf *m_AudioHandler; cFemonAudioIf *m_AudioHandler;
static unsigned int s_Bitrates[3][16]; static int s_Bitrates[3][16];
static unsigned int s_Samplerates[4]; static int s_Samplerates[4];
public: public:
cFemonLATM(cFemonAudioIf *audiohandler); 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)) #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 {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 {22050, 24000, 16000, -1}, // MPEG-2
{44100, 48000, 32000, -1} // MPEG-1 {44100, 48000, 32000, -1} // MPEG-1
@@ -48,7 +48,7 @@ cFemonMPEG::~cFemonMPEG()
bool cFemonMPEG::processAudio(const uint8_t *buf, int len) bool cFemonMPEG::processAudio(const uint8_t *buf, int len)
{ {
cBitStream bs(buf, len * 8); cFemonBitStream bs(buf, len * 8);
if (!m_AudioHandler) if (!m_AudioHandler)
return false; return false;
@@ -56,20 +56,20 @@ bool cFemonMPEG::processAudio(const uint8_t *buf, int len)
// skip PES header // skip PES header
if (!PesLongEnough(len)) if (!PesLongEnough(len))
return false; return false;
bs.skipBits(8 * PesPayloadOffset(buf)); bs.SkipBits(8 * PesPayloadOffset(buf));
// MPEG audio detection // MPEG audio detection
if (bs.getBits(12) != 0xFFF) // syncword if (bs.GetBits(12) != 0xFFF) // syncword
return false; return false;
int id = bs.getBit(); // id: MPEG-2=0, MPEG-1=1 int id = bs.GetBit(); // id: MPEG-2=0, MPEG-1=1
int layer = 3 - bs.getBits(2); // layer: I=11, II=10, III=01 int layer = 3 - bs.GetBits(2); // layer: I=11, II=10, III=01
bs.skipBit(); // protection bit bs.SkipBit(); // protection bit
int bit_rate_index = bs.getBits(4); // bitrate index int bit_rate_index = bs.GetBits(4); // bitrate index
int sampling_frequency = bs.getBits(2); // sampling frequency int sampling_frequency = bs.GetBits(2); // sampling frequency
bs.skipBit(); // padding bit bs.SkipBit(); // padding bit
bs.skipBit(); // private pid bs.SkipBit(); // private pid
int mode = bs.getBits(2); // mode int mode = bs.GetBits(2); // mode
m_AudioHandler->SetAudioCodec(s_Formats[id][layer]); 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) bool cFemonMPEG::processVideo(const uint8_t *buf, int len)
{ {
cBitStream bs(buf, len * 8); cFemonBitStream bs(buf, len * 8);
if (!m_VideoHandler) if (!m_VideoHandler)
return false; return false;
@@ -132,20 +132,20 @@ bool cFemonMPEG::processVideo(const uint8_t *buf, int len)
// skip PES header // skip PES header
if (!PesLongEnough(len)) if (!PesLongEnough(len))
return false; return false;
bs.skipBits(8 * PesPayloadOffset(buf)); bs.SkipBits(8 * PesPayloadOffset(buf));
// MPEG-2 video detection, search for start code // MPEG-2 video detection, search for start code
if (bs.getU32() != 0x000001B3) // sequence header if (bs.GetBits(32) != 0x000001B3) // sequence header
return false; return false;
int scan = VIDEO_SCAN_UNKNOWN; int scan = VIDEO_SCAN_UNKNOWN;
int format = VIDEO_FORMAT_UNKNOWN; int format = VIDEO_FORMAT_UNKNOWN;
int aspect = VIDEO_ASPECT_RATIO_RESERVED; int aspect = VIDEO_ASPECT_RATIO_RESERVED;
int horizontal_size = bs.getBits(12); // horizontal size value int horizontal_size = bs.GetBits(12); // horizontal size value
int vertical_size = bs.getBits(12); // vertical 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: case 1:
aspect = VIDEO_ASPECT_RATIO_1_1; aspect = VIDEO_ASPECT_RATIO_1_1;
break; break;
@@ -169,7 +169,7 @@ bool cFemonMPEG::processVideo(const uint8_t *buf, int len)
} }
double frame_rate = 0; double frame_rate = 0;
switch (bs.getBits(4)) { // frame rate code switch (bs.GetBits(4)) { // frame rate code
case 1: case 1:
frame_rate = 24000 / 1001.0; frame_rate = 24000 / 1001.0;
format = VIDEO_FORMAT_UNKNOWN; format = VIDEO_FORMAT_UNKNOWN;
@@ -217,34 +217,34 @@ bool cFemonMPEG::processVideo(const uint8_t *buf, int len)
break; break;
} }
int bit_rate = bs.getBits(18); // bit rate value int bit_rate = bs.GetBits(18); // bit rate value
bs.skipBit(); // marker bit bs.SkipBit(); // marker bit
bs.skipBits(10); // vbv buffer size value bs.SkipBits(10); // vbv buffer size value
bs.skipBit(); // constrained parameters value bs.SkipBit(); // constrained parameters value
if (bs.getBit()) // load intra quantizer matrix if (bs.GetBit()) // load intra quantizer matrix
bs.skipBits(8 * 64); // intra quantizer matrix bs.SkipBits(8 * 64); // intra quantizer matrix
if (bs.getBit()) // load non-intra quantizer matrix if (bs.GetBit()) // load non-intra quantizer matrix
bs.skipBits(8 * 64); // non-intra quantizer matrix bs.SkipBits(8 * 64); // non-intra quantizer matrix
if (bs.getU32() != 0x000001B5) { // extension start if (bs.GetBits(32) != 0x000001B5) { // extension start
bs.skipBits(4); // extension start code identifier bs.SkipBits(4); // extension start code identifier
bs.skipBits(8); // profile and level indicator bs.SkipBits(8); // profile and level indicator
scan = bs.getBit() ? VIDEO_SCAN_PROGRESSIVE : scan = bs.GetBit() ? VIDEO_SCAN_PROGRESSIVE :
VIDEO_SCAN_INTERLACED; // progressive sequence VIDEO_SCAN_INTERLACED; // progressive sequence
bs.skipBits(2); // chroma format bs.SkipBits(2); // chroma format
horizontal_size |= (bs.getBits(2) << 12); // horizontal size extension horizontal_size |= (bs.GetBits(2) << 12); // horizontal size extension
vertical_size |= (bs.getBits(2) << 12); // vertical size extension vertical_size |= (bs.GetBits(2) << 12); // vertical size extension
bit_rate |= (bs.getBits(12) << 18); // bit rate extension bit_rate |= (bs.GetBits(12) << 18); // bit rate extension
bs.skipBit(); // marker bit bs.SkipBit(); // marker bit
bs.skipBits(8); // vpv buffer size extension bs.SkipBits(8); // vpv buffer size extension
bs.skipBit(); // low delay bs.SkipBit(); // low delay
bs.skipBits(2); // frame rate extension n bs.SkipBits(2); // frame rate extension n
bs.skipBits(5); // frame rate extension d bs.SkipBits(5); // frame rate extension d
if ((bs.getU32() != 0x000001B5) && // extension start code if ((bs.GetBits(32) != 0x000001B5) && // extension start code
(bs.getBits(4) == 0x0010)) { // sequence display extension id (bs.GetBits(4) == 0x0010)) { // sequence display extension id
switch (bs.getBits(3)) { // video format switch (bs.GetBits(3)) { // video format
case 0x000: case 0x000:
format = VIDEO_FORMAT_COMPONENT; format = VIDEO_FORMAT_COMPONENT;
break; break;

View File

@@ -16,9 +16,9 @@ private:
cFemonVideoIf *m_VideoHandler; cFemonVideoIf *m_VideoHandler;
cFemonAudioIf *m_AudioHandler; cFemonAudioIf *m_AudioHandler;
static unsigned int s_Bitrates[2][3][16]; static int s_Bitrates[2][3][16];
static unsigned int s_Samplerates[2][4]; static int s_Samplerates[2][4];
static eAudioCodec s_Formats[2][4]; static eAudioCodec s_Formats[2][4];
public: public:
cFemonMPEG(cFemonVideoIf *videohandler, cFemonAudioIf *audiohandler); cFemonMPEG(cFemonVideoIf *videohandler, cFemonAudioIf *audiohandler);

View File

@@ -6,7 +6,7 @@
*/ */
#ifndef __STDC_FORMAT_MACROS #ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS
#endif #endif
#include <ctype.h> #include <ctype.h>
@@ -171,6 +171,10 @@ cFemonOsd::cFemonOsd()
m_SvdrpPlugin(NULL), m_SvdrpPlugin(NULL),
m_Number(0), m_Number(0),
m_OldNumber(0), m_OldNumber(0),
m_Quality(0),
m_QualityValid(false),
m_Strength(0),
m_StrengthValid(false),
m_SNR(0), m_SNR(0),
m_SNRValid(false), m_SNRValid(false),
m_Signal(0), m_Signal(0),
@@ -180,6 +184,7 @@ cFemonOsd::cFemonOsd()
m_UNC(0), m_UNC(0),
m_UNCValid(false), m_UNCValid(false),
m_FrontendStatusValid(false), m_FrontendStatusValid(false),
m_DeviceSource(DEVICESOURCE_DVBAPI),
m_DisplayMode(femonConfig.displaymode), m_DisplayMode(femonConfig.displaymode),
m_OsdWidth(cOsd::OsdWidth() * (100 - femonConfig.downscale) / 100), m_OsdWidth(cOsd::OsdWidth() * (100 - femonConfig.downscale) / 100),
m_OsdHeight(cOsd::OsdHeight() * (100 - femonConfig.downscale) / 100), m_OsdHeight(cOsd::OsdHeight() * (100 - femonConfig.downscale) / 100),
@@ -195,7 +200,7 @@ cFemonOsd::cFemonOsd()
memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo)); memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo));
m_SvdrpConnection.handle = -1; m_SvdrpConnection.handle = -1;
femonSymbols.Refresh(); 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()) { if (!m_Font || !m_Font->Height()) {
m_Font = new cFemonDummyFont; m_Font = new cFemonDummyFont;
error("cFemonOsd::cFemonOsd() cannot create required font."); error("cFemonOsd::cFemonOsd() cannot create required font.");
@@ -241,14 +246,15 @@ cFemonOsd::~cFemonOsd(void)
void cFemonOsd::DrawStatusWindow(void) void cFemonOsd::DrawStatusWindow(void)
{ {
cMutexLock lock(&m_Mutex); 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()); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (m_Osd && channel) { 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))); OSDDRAWSTATUSTITLEBAR(*cString::sprintf("%d%s %s", m_Number ? m_Number : channel->Number(), m_Number ? "-" : "", channel->ShortName(true)));
if (m_SvdrpFrontend >= 0) { if (m_SvdrpFrontend >= 0) {
bm = &OSDSYMBOL(SYMBOL_SVDRP); bm = &OSDSYMBOL(SYMBOL_SVDRP);
@@ -295,14 +301,34 @@ void cFemonOsd::DrawStatusWindow(void)
OSDDRAWSTATUSBM(OSDSPACING); OSDDRAWSTATUSBM(OSDSPACING);
} }
if (m_Receiver) { if (m_Receiver) {
if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 1080)) if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 1080)) {
bm = &OSDSYMBOL(SYMBOL_FORMAT_1080); switch (m_Receiver->VideoScan()) {
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 720)) case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080i); break;
bm = &OSDSYMBOL(SYMBOL_FORMAT_720); case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080p); break;
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 576)) default: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080); break;
bm = &OSDSYMBOL(SYMBOL_FORMAT_576); }
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 480)) }
bm = &OSDSYMBOL(SYMBOL_FORMAT_480); 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 else
bm = NULL; bm = NULL;
OSDDRAWSTATUSBM(OSDSPACING); OSDDRAWSTATUSBM(OSDSPACING);
@@ -332,11 +358,11 @@ void cFemonOsd::DrawStatusWindow(void)
OSDDRAWSTATUSBM(OSDSPACING); OSDDRAWSTATUSBM(OSDSPACING);
} }
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
if (m_SignalValid) if (m_StrengthValid)
OSDDRAWSTATUSBAR(m_Signal / 655); OSDDRAWSTATUSBAR(m_Strength);
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
if (m_SNRValid) if (m_QualityValid)
OSDDRAWSTATUSBAR(m_SNR / 655); OSDDRAWSTATUSBAR(m_Quality);
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWSTATUSVALUES("STR:", m_SignalValid ? *cString::sprintf("%04x", m_Signal) : "", m_SignalValid ? *cString::sprintf("(%2d%%)", m_Signal / 655) : "", 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")), "BER:", m_BERValid ? *cString::sprintf("%08x", m_BER) : "", *cString::sprintf("%s:", tr("Video")),
@@ -364,12 +390,13 @@ void cFemonOsd::DrawStatusWindow(void)
void cFemonOsd::DrawInfoWindow(void) void cFemonOsd::DrawInfoWindow(void)
{ {
cMutexLock lock(&m_Mutex); cMutexLock lock(&m_Mutex);
int offset = 0;
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
if (m_Osd && channel) { if (m_Osd && channel) {
int offset = 0;
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
cDvbTransponderParameters dtp(channel->Parameters()); cDvbTransponderParameters dtp(channel->Parameters());
switch (m_DisplayMode) { switch (m_DisplayMode) {
case eFemonModeTransponder: case eFemonModeTransponder:
OSDDRAWINFOTITLEBAR(tr("Transponder Information")); OSDDRAWINFOTITLEBAR(tr("Transponder Information"));
@@ -393,7 +420,7 @@ void cFemonOsd::DrawInfoWindow(void)
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
switch (channel->Source() & cSource::st_Mask) { switch (channel->Source() & cSource::st_Mask) {
case cSource::stSat: 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)); OSDDRAWINFOLINE(*cString::sprintf("%s #%d - %s", *getSatelliteSystem(dtp.System()), (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency())); OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency()));
OSDDRAWINFORIGHT(trVDR("Source"), *cSource::ToString(channel->Source())); OSDDRAWINFORIGHT(trVDR("Source"), *cSource::ToString(channel->Source()));
@@ -404,7 +431,8 @@ void cFemonOsd::DrawInfoWindow(void)
OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(dtp.Inversion())); OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(dtp.Inversion()));
OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(dtp.CoderateH())); OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(dtp.CoderateH()));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("System"), *getSystem(dtp.System())); OSDDRAWINFOLEFT( trVDR("System"), *getSatelliteSystem(dtp.System()));
if (dtp.System())
OSDDRAWINFORIGHT(trVDR("RollOff"), *getRollOff(dtp.RollOff())); OSDDRAWINFORIGHT(trVDR("RollOff"), *getRollOff(dtp.RollOff()));
break; break;
@@ -422,7 +450,7 @@ void cFemonOsd::DrawInfoWindow(void)
break; break;
case cSource::stTerr: case cSource::stTerr:
OSDDRAWINFOLINE(*cString::sprintf("DVB-T #%d - %s", (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name)); OSDDRAWINFOLINE(*cString::sprintf("%s #%d - %s", *getTerrestrialSystem(dtp.System()), (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency())); OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency()));
OSDDRAWINFORIGHT(trVDR("Transmission"), *getTransmission(dtp.Transmission())); OSDDRAWINFORIGHT(trVDR("Transmission"), *getTransmission(dtp.Transmission()));
@@ -435,6 +463,10 @@ void cFemonOsd::DrawInfoWindow(void)
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Hierarchy"), *getHierarchy(dtp.Hierarchy())); OSDDRAWINFOLEFT( trVDR("Hierarchy"), *getHierarchy(dtp.Hierarchy()));
OSDDRAWINFORIGHT(trVDR("Guard"), *getGuard(dtp.Guard())); 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; break;
default: default:
@@ -518,62 +550,111 @@ void cFemonOsd::Action(void)
m_SvdrpFrontend = -1; m_SvdrpFrontend = -1;
m_SvdrpVideoBitrate = -1.0; m_SvdrpVideoBitrate = -1.0;
m_SvdrpAudioBitrate = -1.0; m_SvdrpAudioBitrate = -1.0;
if (m_Frontend != -1) { switch (m_DeviceSource) {
m_FrontendStatusValid = (ioctl(m_Frontend, FE_READ_STATUS, &m_FrontendStatus) >= 0); case DEVICESOURCE_PVRINPUT:
m_SignalValid = (ioctl(m_Frontend, FE_READ_SIGNAL_STRENGTH, &m_Signal) >= 0); m_Quality = cDevice::ActualDevice()->SignalStrength();
m_SNRValid = (ioctl(m_Frontend, FE_READ_SNR, &m_SNR) >= 0); m_QualityValid = (m_Quality >= 0);
m_BERValid = (ioctl(m_Frontend, FE_READ_BER, &m_BER) >= 0); m_Strength = cDevice::ActualDevice()->SignalStrength();
m_UNCValid = (ioctl(m_Frontend, FE_READ_UNCORRECTED_BLOCKS, &m_UNC) >= 0); m_StrengthValid = (m_Strength >= 0);
DrawInfoWindow(); m_FrontendStatus = (fe_status_t)(m_StrengthValid ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0);
DrawStatusWindow(); m_FrontendStatusValid = m_StrengthValid;
} m_Signal = uint16_t(m_Strength * 0xFFFF / 100);
else if (m_SvdrpConnection.handle >= 0) { m_SignalValid = m_StrengthValid;
cmd.handle = m_SvdrpConnection.handle; m_SNR = 0;
m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd); m_SNRValid = false;
if (cmd.responseCode == 900) { m_BER = 0;
m_FrontendStatusValid = false; m_BERValid = false;
m_SignalValid = false; m_UNC = 0;
m_SNRValid = false; m_UNCValid = false;
m_BERValid = false; break;
m_UNCValid = false; case DEVICESOURCE_IPTV:
for (cLine *line = cmd.reply.First(); line; line = cmd.reply.Next(line)) { m_Quality = cDevice::ActualDevice()->SignalQuality();
const char *s = line->Text(); m_QualityValid = (m_Quality >= 0);
if (!strncasecmp(s, "CARD:", 5)) m_Strength = cDevice::ActualDevice()->SignalStrength();
m_SvdrpFrontend = (int)strtol(s + 5, NULL, 10); m_StrengthValid = (m_Strength >= 0);
else if (!strncasecmp(s, "TYPE:", 5)) m_FrontendStatus = (fe_status_t)(m_StrengthValid ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0);
m_FrontendInfo.type = (fe_type_t)strtol(s + 5, NULL, 10); m_FrontendStatusValid = m_StrengthValid;
else if (!strncasecmp(s, "NAME:", 5)) { m_Signal = uint16_t(m_Strength * 0xFFFF / 100);
strn0cpy(m_FrontendInfo.name, s + 5, sizeof(m_FrontendInfo.name)); m_SignalValid = m_StrengthValid;
} m_SNR = uint16_t(m_Quality * 0xFFFF / 100);
else if (!strncasecmp(s, "STAT:", 5)) { m_SNRValid = m_QualityValid;
m_FrontendStatus = (fe_status_t)strtol(s + 5, NULL, 16); m_BER = 0;
m_FrontendStatusValid = true; m_BERValid = false;
} m_UNC = 0;
else if (!strncasecmp(s, "SGNL:", 5)) { m_UNCValid = false;
m_Signal = (uint16_t)strtol(s + 5, NULL, 16); break;
m_SignalValid = true; default:
} case DEVICESOURCE_DVBAPI:
else if (!strncasecmp(s, "SNRA:", 5)) { if (m_Frontend != -1) {
m_SNR = (uint16_t)strtol(s + 5, NULL, 16); m_Quality = cDevice::ActualDevice()->SignalQuality();
m_SNRValid = true; m_QualityValid = (m_Quality >= 0);
} m_Strength = cDevice::ActualDevice()->SignalStrength();
else if (!strncasecmp(s, "BERA:", 5)) { m_StrengthValid = (m_Strength >= 0);
m_BER = (uint32_t)strtol(s + 5, NULL, 16); m_FrontendStatusValid = (ioctl(m_Frontend, FE_READ_STATUS, &m_FrontendStatus) >= 0);
m_BERValid = true; m_SignalValid = (ioctl(m_Frontend, FE_READ_SIGNAL_STRENGTH, &m_Signal) >= 0);
} m_SNRValid = (ioctl(m_Frontend, FE_READ_SNR, &m_SNR) >= 0);
else if (!strncasecmp(s, "UNCB:", 5)) { m_BERValid = (ioctl(m_Frontend, FE_READ_BER, &m_BER) >= 0);
m_UNC = (uint32_t)strtol(s + 5, NULL, 16); m_UNCValid = (ioctl(m_Frontend, FE_READ_UNCORRECTED_BLOCKS, &m_UNC) >= 0);
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);
} }
} else if (m_SvdrpConnection.handle >= 0) {
DrawInfoWindow(); cmd.handle = m_SvdrpConnection.handle;
DrawStatusWindow(); 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)) {
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);
}
}
}
break;
}
DrawInfoWindow();
DrawStatusWindow();
m_Sleep.Wait(max((int)(100 * femonConfig.updateinterval - t.Elapsed()), 3)); m_Sleep.Wait(max((int)(100 * femonConfig.updateinterval - t.Elapsed()), 3));
} }
} }
@@ -582,26 +663,40 @@ void cFemonOsd::Show(void)
{ {
debug("%s()\n", __PRETTY_FUNCTION__); debug("%s()\n", __PRETTY_FUNCTION__);
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
cString dev = cString::sprintf(FRONTEND_DEVICE, cDevice::ActualDevice()->CardIndex(), 0); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
m_Frontend = open(dev, O_RDONLY | O_NONBLOCK);
if (m_Frontend >= 0) { m_DeviceSource = DEVICESOURCE_DVBAPI;
if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) { if (channel) {
if (!femonConfig.usesvdrp) if (channel->IsSourceType('I'))
error("cFemonOsd::Show() cannot read frontend info."); m_DeviceSource = DEVICESOURCE_IPTV;
close(m_Frontend); else if (channel->IsSourceType('V'))
m_Frontend = -1; m_DeviceSource = DEVICESOURCE_PVRINPUT;
memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo)); }
if (m_DeviceSource == DEVICESOURCE_DVBAPI) {
cDvbDevice *dev = dynamic_cast<cDvbDevice*>(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; return;
} }
} }
else if (femonConfig.usesvdrp) { else
if (!SvdrpConnect() || !SvdrpTune()) m_Frontend = -1;
return;
}
else {
error("cFemonOsd::Show() cannot open frontend device.");
return;
}
m_Osd = cOsdProvider::NewOsd(m_OsdLeft, m_OsdTop); m_Osd = cOsdProvider::NewOsd(m_OsdLeft, m_OsdTop);
if (m_Osd) { if (m_Osd) {
@@ -622,55 +717,66 @@ void cFemonOsd::Show(void)
m_Receiver->Deactivate(); m_Receiver->Deactivate();
DELETENULL(m_Receiver); DELETENULL(m_Receiver);
} }
if (femonConfig.analyzestream) { if (femonConfig.analyzestream && channel) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); 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));
if (channel) { cDevice::ActualDevice()->AttachReceiver(m_Receiver);
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);
}
} }
Start(); 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); debug("%s(%d,%d)\n", __PRETTY_FUNCTION__, device->DeviceNumber(), channelNumber);
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
if (!device->IsPrimaryDevice() || !channelNumber || cDevice::PrimaryDevice()->CurrentChannel() != channelNumber) cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (!liveView || !channelNumber || !channel || channel->Number() != channelNumber)
return; return;
close(m_Frontend);
cString dev = cString::sprintf(FRONTEND_DEVICE, cDevice::ActualDevice()->CardIndex(), 0); m_DeviceSource = DEVICESOURCE_DVBAPI;
m_Frontend = open(dev, O_RDONLY | O_NONBLOCK); if (channel) {
if (channel->IsSourceType('I'))
m_DeviceSource = DEVICESOURCE_IPTV;
else if (channel->IsSourceType('V'))
m_DeviceSource = DEVICESOURCE_PVRINPUT;
}
if (m_Frontend >= 0) { if (m_Frontend >= 0) {
if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) { close(m_Frontend);
if (!femonConfig.usesvdrp) m_Frontend = -1;
error("cFemonOsd::ChannelSwitch() cannot read frontend info."); }
close(m_Frontend);
m_Frontend = -1; if (m_DeviceSource == DEVICESOURCE_DVBAPI) {
memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo)); cDvbDevice *dev = dynamic_cast<cDvbDevice*>(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; return;
} }
} }
else if (femonConfig.usesvdrp) {
if (!SvdrpConnect() || !SvdrpTune())
return;
}
else {
error("cFemonOsd::ChannelSwitch() cannot open frontend device.");
return;
}
if (m_Receiver) { if (m_Receiver) {
m_Receiver->Deactivate(); m_Receiver->Deactivate();
DELETENULL(m_Receiver); DELETENULL(m_Receiver);
} }
if (femonConfig.analyzestream) { if (femonConfig.analyzestream && channel) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); 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));
if (channel) { cDevice::ActualDevice()->AttachReceiver(m_Receiver);
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);
}
} }
} }
@@ -710,13 +816,13 @@ bool cFemonOsd::DeviceSwitch(int direction)
} }
if (cDevice::GetDevice(device)->ProvidesChannel(channel, 0)) { if (cDevice::GetDevice(device)->ProvidesChannel(channel, 0)) {
debug("%s(%d) device(%d)\n", __PRETTY_FUNCTION__, direction, device); debug("%s(%d) device(%d)\n", __PRETTY_FUNCTION__, direction, device);
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), 0); cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), 0, true);
cControl::Shutdown(); cControl::Shutdown();
cDevice::GetDevice(device)->SwitchChannel(channel, true); cDevice::GetDevice(device)->SwitchChannel(channel, true);
if (cDevice::GetDevice(device) == cDevice::PrimaryDevice()) if (cDevice::GetDevice(device) == cDevice::PrimaryDevice())
cDevice::GetDevice(device)->ForceTransferMode(); cDevice::GetDevice(device)->ForceTransferMode();
cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel)); cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel));
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), channel->Number()); cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), channel->Number(), true);
return (true); return (true);
} }
} }
@@ -811,7 +917,7 @@ eOSState cFemonOsd::ProcessKey(eKeys Key)
{ {
eOSState state = cOsdObject::ProcessKey(Key); eOSState state = cOsdObject::ProcessKey(Key);
if (state == osUnknown) { if (state == osUnknown) {
switch (Key) { switch (int(Key)) {
case k0: case k0:
if ((m_Number == 0) && (m_OldNumber != 0)) { if ((m_Number == 0) && (m_OldNumber != 0)) {
m_Number = m_OldNumber; m_Number = m_OldNumber;

View File

@@ -24,6 +24,13 @@
class cFemonOsd : public cOsdObject, public cThread, public cStatus { class cFemonOsd : public cOsdObject, public cThread, public cStatus {
private: private:
enum eDeviceSourceType {
DEVICESOURCE_DVBAPI = 0,
DEVICESOURCE_IPTV,
DEVICESOURCE_PVRINPUT,
DEVICESOURCE_COUNT
};
static cFemonOsd *pInstance; static cFemonOsd *pInstance;
cOsd *m_Osd; cOsd *m_Osd;
@@ -36,6 +43,10 @@ private:
cPlugin *m_SvdrpPlugin; cPlugin *m_SvdrpPlugin;
int m_Number; int m_Number;
int m_OldNumber; int m_OldNumber;
int m_Quality;
bool m_QualityValid;
int m_Strength;
bool m_StrengthValid;
uint16_t m_SNR; uint16_t m_SNR;
bool m_SNRValid; bool m_SNRValid;
uint16_t m_Signal; uint16_t m_Signal;
@@ -47,6 +58,7 @@ private:
fe_status_t m_FrontendStatus; fe_status_t m_FrontendStatus;
bool m_FrontendStatusValid; bool m_FrontendStatusValid;
dvb_frontend_info m_FrontendInfo; dvb_frontend_info m_FrontendInfo;
eDeviceSourceType m_DeviceSource;
int m_DisplayMode; int m_DisplayMode;
int m_OsdWidth; int m_OsdWidth;
int m_OsdHeight; int m_OsdHeight;
@@ -67,7 +79,7 @@ protected:
cFemonOsd(const cFemonOsd&); cFemonOsd(const cFemonOsd&);
cFemonOsd& operator= (const cFemonOsd&); cFemonOsd& operator= (const cFemonOsd&);
virtual void Action(void); 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); virtual void SetAudioTrack(int Index, const char * const *Tracks);
public: public:

View File

@@ -142,7 +142,7 @@ void cFemonReceiver::Action(void)
bool processed = false; bool processed = false;
// process available video data // process available video data
while (Data = m_VideoBuffer.Get(Length)) { while ((Data = m_VideoBuffer.Get(Length))) {
if (!m_Active || (Length < TS_SIZE)) if (!m_Active || (Length < TS_SIZE))
break; break;
Length = TS_SIZE; Length = TS_SIZE;
@@ -179,7 +179,7 @@ void cFemonReceiver::Action(void)
} }
// process available audio data // process available audio data
while (Data = m_AudioBuffer.Get(Length)) { while ((Data = m_AudioBuffer.Get(Length))) {
if (!m_Active || (Length < TS_SIZE)) if (!m_Active || (Length < TS_SIZE))
break; break;
Length = TS_SIZE; Length = TS_SIZE;
@@ -204,7 +204,7 @@ void cFemonReceiver::Action(void)
} }
// process available dolby data // process available dolby data
while (Data = m_AC3Buffer.Get(Length)) { while ((Data = m_AC3Buffer.Get(Length))) {
if (!m_Active || (Length < TS_SIZE)) if (!m_Active || (Length < TS_SIZE))
break; break;
Length = TS_SIZE; Length = TS_SIZE;

View File

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

View File

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

View File

@@ -76,7 +76,7 @@ static const char *getUserString(int Value, const tDvbParameterMap *Map)
return "---"; return "---";
} }
cString getFrontendInfo(int cardIndex) cString getFrontendInfo(cDvbDevice *device)
{ {
cString info; cString info;
struct dvb_frontend_info value; struct dvb_frontend_info value;
@@ -86,13 +86,15 @@ cString getFrontendInfo(int cardIndex)
uint32_t ber = 0; uint32_t ber = 0;
uint32_t unc = 0; uint32_t unc = 0;
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); 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) 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) 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, value.name);
@@ -117,42 +119,48 @@ cString getFrontendInfo(int cardIndex)
return info; return info;
} }
cString getFrontendName(int cardIndex) cString getFrontendName(cDvbDevice *device)
{ {
struct dvb_frontend_info value; struct dvb_frontend_info 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) if (fe < 0)
return NULL; return NULL;
memset(&value, 0, sizeof(value)); memset(&value, 0, sizeof(value));
ioctl(fe, FE_GET_INFO, &value); ioctl(fe, FE_GET_INFO, &value);
close(fe); close(fe);
return (cString::sprintf("%s on device #%d", value.name, cardIndex)); return (cString::sprintf("%s on device #%d", value.name, device->CardIndex()));
} }
cString getFrontendStatus(int cardIndex) cString getFrontendStatus(cDvbDevice *device)
{ {
fe_status_t value; 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) if (fe < 0)
return NULL; return NULL;
memset(&value, 0, sizeof(value)); memset(&value, 0, sizeof(value));
ioctl(fe, FE_READ_STATUS, &value); ioctl(fe, FE_READ_STATUS, &value);
close(fe); 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; 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) if (fe < 0)
return (value); return (value);
ioctl(fe, FE_READ_SIGNAL_STRENGTH, &value); ioctl(fe, FE_READ_SIGNAL_STRENGTH, &value);
@@ -161,12 +169,14 @@ uint16_t getSignal(int cardIndex)
return (value); return (value);
} }
uint16_t getSNR(int cardIndex) uint16_t getSNR(cDvbDevice *device)
{ {
uint16_t value = 0; 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) if (fe < 0)
return (value); return (value);
ioctl(fe, FE_READ_SNR, &value); ioctl(fe, FE_READ_SNR, &value);
@@ -175,12 +185,14 @@ uint16_t getSNR(int cardIndex)
return (value); return (value);
} }
uint32_t getBER(int cardIndex) uint32_t getBER(cDvbDevice *device)
{ {
uint32_t value = 0; 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) if (fe < 0)
return (value); return (value);
ioctl(fe, FE_READ_BER, &value); ioctl(fe, FE_READ_BER, &value);
@@ -189,12 +201,14 @@ uint32_t getBER(int cardIndex)
return (value); return (value);
} }
uint32_t getUNC(int cardIndex) uint32_t getUNC(cDvbDevice *device)
{ {
uint32_t value = 0; 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) if (fe < 0)
return (value); return (value);
ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &value); ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &value);
@@ -347,9 +361,14 @@ cString getModulation(int value)
return cString::sprintf("%s", getUserString(value, ModulationValues)); 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) cString getRollOff(int value)
@@ -542,84 +561,31 @@ cString getBitrateKbits(double value)
return cString::sprintf("---"); return cString::sprintf("---");
} }
cBitStream::cBitStream(const uint8_t *buf, const int len) // --- cFemonBitStream -------------------------------------------------------
: data(buf),
count(len),
index(0)
{
}
cBitStream::~cBitStream() uint32_t cFemonBitStream::GetUeGolomb()
{
}
int cBitStream::getBit()
{
if (index >= count)
return (1); // -> no infinite colomb's ...
int r = (data[index >> 3] >> (7 - (index & 7))) & 1;
++index;
return (r);
}
uint32_t cBitStream::getBits(uint32_t n)
{
uint32_t r = 0;
while (n--)
r = (r | (getBit() << n));
return (r);
}
void cBitStream::skipBits(uint32_t n)
{
index += n;
}
uint32_t cBitStream::getUeGolomb()
{ {
int n = 0; int n = 0;
while (!getBit() && (n < 32)) while (!GetBit() && (n < 32))
n++; 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)); return ((r & 1) ? -(r >> 1) : (r >> 1));
} }
void cBitStream::skipGolomb() void cFemonBitStream::SkipGolomb()
{ {
int n = 0; int n = 0;
while (!getBit() && (n < 32)) while (!GetBit() && (n < 32))
n++; n++;
skipBits(n); SkipBits(n);
}
void cBitStream::skipUeGolomb()
{
skipGolomb();
}
void cBitStream::skipSeGolomb()
{
skipGolomb();
}
void cBitStream::byteAlign()
{
int n = index % 8;
if (n > 0)
skipBits(8 - n);
} }

View File

@@ -10,6 +10,7 @@
#include <stdint.h> #include <stdint.h>
#include <vdr/channels.h> #include <vdr/channels.h>
#include <vdr/dvbdevice.h>
#include <vdr/remux.h> #include <vdr/remux.h>
#include <vdr/tools.h> #include <vdr/tools.h>
@@ -25,15 +26,15 @@
#define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d" #define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d"
cString getFrontendInfo(int cardIndex = 0); cString getFrontendInfo(cDvbDevice *device);
cString getFrontendName(int cardIndex = 0); cString getFrontendName(cDvbDevice *device);
cString getFrontendStatus(int cardIndex = 0); cString getFrontendStatus(cDvbDevice *device);
uint16_t getSNR(int cardIndex = 0); uint16_t getSNR(cDvbDevice *device);
uint16_t getSignal(int cardIndex = 0); uint16_t getSignal(cDvbDevice *device);
uint32_t getBER(int cardIndex = 0); uint32_t getBER(cDvbDevice *device);
uint32_t getUNC(int cardIndex = 0); uint32_t getUNC(cDvbDevice *device);
cString getApids(const cChannel *channel); cString getApids(const cChannel *channel);
cString getDpids(const cChannel *channel); cString getDpids(const cChannel *channel);
@@ -51,7 +52,8 @@ cString getInversion(int value);
cString getHierarchy(int value); cString getHierarchy(int value);
cString getGuard(int value); cString getGuard(int value);
cString getModulation(int value); cString getModulation(int value);
cString getSystem(int value); cString getTerrestrialSystem(int value);
cString getSatelliteSystem(int value);
cString getRollOff(int value); cString getRollOff(int value);
cString getResolution(int width, int height, int scan); cString getResolution(int width, int height, int scan);
cString getAspectRatio(int value); cString getAspectRatio(int value);
@@ -71,35 +73,14 @@ cString getVideoBitrate(double value, double stream);
cString getBitrateMbits(double value); cString getBitrateMbits(double value);
cString getBitrateKbits(double value); cString getBitrateKbits(double value);
class cBitStream { class cFemonBitStream : public cBitStream {
private:
const uint8_t *data;
int count; // in bits
int index; // in bits
public: public:
cBitStream(const uint8_t *buf, const int len); cFemonBitStream(const uint8_t *Data, const int Length) : cBitStream(Data, Length) {}
~cBitStream(); uint32_t GetUeGolomb();
int32_t GetSeGolomb();
int getBit(); void SkipGolomb();
uint32_t getBits(uint32_t n); void SkipUeGolomb() { SkipGolomb(); }
void skipBits(uint32_t n); void SkipSeGolomb() { SkipGolomb(); }
uint32_t getUeGolomb(); };
int32_t getSeGolomb();
void skipGolomb();
void skipUeGolomb();
void skipSeGolomb();
void byteAlign();
void skipBit() { skipBits(1); }
uint32_t getU8() { return getBits(8); }
uint32_t getU16() { return ((getBits(8) << 8) | getBits(8)); }
uint32_t getU24() { return ((getBits(8) << 16) | (getBits(8) << 8) | getBits(8)); }
uint32_t getU32() { return ((getBits(8) << 24) | (getBits(8) << 16) | (getBits(8) << 8) | getBits(8)); }
bool isEOF() { return (index >= count); }
void reset() { index = 0; }
int getIndex() { return (isEOF() ? count : index); }
const uint8_t *getData() { return (isEOF() ? NULL : data + (index / 8)); }
};
#endif // __FEMONTOOLS_H #endif // __FEMONTOOLS_H

View File

@@ -7,7 +7,7 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n" "Project-Id-Version: vdr-femon 1.7.15\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n" "POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n" "PO-Revision-Date: 2010-10-10 10:10+0300\n"

View File

@@ -5,7 +5,7 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n" "Project-Id-Version: vdr-femon 1.7.15\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n" "POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n" "PO-Revision-Date: 2010-10-10 10:10+0300\n"

View File

@@ -5,7 +5,7 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n" "Project-Id-Version: vdr-femon 1.7.15\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n" "POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n" "PO-Revision-Date: 2010-10-10 10:10+0300\n"

View File

@@ -5,7 +5,7 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n" "Project-Id-Version: vdr-femon 1.7.15\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n" "POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n" "PO-Revision-Date: 2010-10-10 10:10+0300\n"

View File

@@ -5,7 +5,7 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n" "Project-Id-Version: vdr-femon 1.7.15\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n" "POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n" "PO-Revision-Date: 2010-10-10 10:10+0300\n"

387
po/hu_HU.po Normal file
View File

@@ -0,0 +1,387 @@
# 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.15\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0200\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 "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 "Stream Information"
msgstr "Adatfolyam inf<6E>"
msgid "Video Stream"
msgstr "Vide<64> adatfolyam"
msgid "Codec"
msgstr "Kodek"
msgid "Bitrate"
msgstr "Bitr<74>ta"
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 "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n" "Project-Id-Version: vdr-femon 1.7.15\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n" "POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n" "PO-Revision-Date: 2010-10-10 10:10+0300\n"

View File

@@ -5,7 +5,7 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n" "Project-Id-Version: vdr-femon 1.7.15\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n" "POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n" "PO-Revision-Date: 2010-10-10 10:10+0300\n"

View File

@@ -5,7 +5,7 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n" "Project-Id-Version: vdr-femon 1.7.15\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n" "POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n" "PO-Revision-Date: 2010-10-10 10:10+0300\n"

View File

@@ -5,7 +5,7 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n" "Project-Id-Version: vdr-femon 1.7.15\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n" "POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n" "PO-Revision-Date: 2010-10-10 10:10+0300\n"

View File

@@ -5,7 +5,7 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-femon 1.7.10\n" "Project-Id-Version: vdr-femon 1.7.15\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n" "POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n" "PO-Revision-Date: 2010-10-10 10:10+0300\n"

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",
"+++++++++++++++++++++++++++++++++++++++++",
"+.......................................+",
"+...++++++++...++++.....++++............+",
"+...++++++++.+++++++...++++++...........+",
"+...++....++.++....++..++..++...........+",
"+.........++.......++.++....++..........+",
"+.........++.......++.++....++..........+",
"+.........++.......++.++....++.++++.....+",
"+........++......+++..++....++.+++++....+",
"+.......+++.....+++...++....++.++..++...+",
"+.......++.....+++....++....++.++..++...+",
"+.......++....+++.....++....++.+++++....+",
"+......+++...+++......++....++.++++.....+",
"+......++....++........++..++..++.......+",
"+......++....++++++++..++++++..++.......+",
"+......++....++++++++...++++...++.......+",
"+.......................................+",
"+++++++++++++++++++++++++++++++++++++++++"};