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

Compare commits

..

37 Commits

Author SHA1 Message Date
Rolf Ahrenberg
3b776594ef Adapted cFemonBitStream for vdr-1.7.22. 2011-12-04 19:30:24 +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
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
Rolf Ahrenberg
a840fc9931 Updated HISTORY. 2011-05-15 11:18:40 +03:00
Rolf Ahrenberg
997ff44b18 Use horizontal scaling only for frontend status symbols. 2011-04-21 10:59:40 +03:00
Rolf Ahrenberg
4dd3c4a184 Changed std::vector to cVector. 2011-04-20 18:09:31 +03:00
Rolf Ahrenberg
de92daf5f0 Added scaling for symbols.
Updated for vdr-1.7.18.
2011-04-20 17:41:17 +03:00
Rolf Ahrenberg
0fd4062c76 Added package name and version to xgettext and made 'dist' target dependent on up to date *.po files.
Updated for vdr-1.7.17.
2011-03-13 19:09:01 +02:00
Rolf Ahrenberg
d9f977e302 Updated HISTORY. 2010-12-27 10:30:43 +02:00
Rolf Ahrenberg
ebfc153940 Added support for LDFLAGS. 2010-12-14 19:25:09 +02:00
Rolf Ahrenberg
f3c52fab6e Tweaked translation files. 2010-12-08 10:47:24 +02:00
Rolf Ahrenberg
b682dbf0fe Updated translation files. 2010-12-04 19:06:15 +02:00
Rolf Ahrenberg
b4673bdece Fixed detection of replaying. 2010-10-29 21:16:01 +03:00
Rolf Ahrenberg
c3b0254b2e Added Makefile depencency for objects. 2010-10-11 23:27:30 +03:00
Rolf Ahrenberg
b8c7fdddb7 Updated for vdr-1.7.16. 2010-09-19 23:19:33 +03:00
Rolf Ahrenberg
23a8a72c38 Modified LATM parser. 2010-06-23 20:12:35 +03:00
Rolf Ahrenberg
f37f428670 Added preliminary support for LATM. 2010-06-23 12:16:17 +03:00
Rolf Ahrenberg
3235c67256 Fixed a crash in femon service (Thanks to Wolfgang Astleitner). 2010-05-31 16:55:19 +03:00
Rolf Ahrenberg
a21ed98163 Updated Italian translation (Thanks to Diego Pierotto). 2010-03-31 14:44:39 +03:00
Rolf Ahrenberg
0b38358442 Fixed a typo. 2010-03-09 15:31:18 +02:00
Rolf Ahrenberg
9c085fea51 Fixed device switching. 2010-03-06 22:01:42 +02:00
Rolf Ahrenberg
dfc66b3d69 Updated the femonclient plugin. 2010-03-04 22:54:45 +02:00
Rolf Ahrenberg
252bd0e479 Added parsing for a missing setup option. 2010-03-04 22:49:19 +02:00
Rolf Ahrenberg
7657d21d5e Updated CXXFLAGS. 2010-03-04 12:58:25 +02:00
Rolf Ahrenberg
7b004e9427 Updated Estonian translation (Thanks to Arthur Konovalov). 2010-03-04 12:55:18 +02:00
Rolf Ahrenberg
a08f9de9d3 Updated for vdr-1.7.13. 2010-02-28 21:42:06 +02:00
Rolf Ahrenberg
513791d5f1 Added a setup option to downscale the OSD size. 2010-02-25 20:33:20 +02:00
Rolf Ahrenberg
60386835dd Updated for vdr-1.7.12. 2010-02-01 13:48:28 +02:00
Rolf Ahrenberg
38f4d3d9b8 Added Lithuanian translation (Thanks to Valdemaras Pipiras). 2009-12-14 16:47:16 +02:00
Rolf Ahrenberg
078f0552fc Fixed a typo. 2009-11-25 16:03:41 +02:00
Rolf Ahrenberg
1fd7c90c3b Updated Estonian translation (Thanks to Arthur Konovalov).
Updated version number.
2009-11-23 15:11:37 +02:00
41 changed files with 1574 additions and 589 deletions

38
HISTORY
View File

@@ -383,3 +383,41 @@ VDR Plugin 'femon' Revision History
- Removed error logging from unimplemented ioctl functions.
- Removed bitstream parsing from Receive() method.
- Added Chinese translation (Thanks to NanFeng).
2010-02-01: Version 1.7.6
- Updated for vdr-1.7.12.
- Updated Estonian translation (Thanks to Arthur Konovalov).
- Added Lithuanian translation (Thanks to Valdemaras Pipiras).
2010-03-05: Version 1.7.7
- Updated for vdr-1.7.13.
- Added a setup option to downscale the OSD size.
- Updated Estonian translation (Thanks to Arthur Konovalov).
2010-06-23: Version 1.7.8
- Fixed device switching.
- Added preliminary support for LATM.
- Updated Italian translation (Thanks to Diego Pierotto).
- Fixed a crash in femon service (Thanks to Wolfgang Astleitner).
2010-12-27: Version 1.7.9
- Updated for vdr-1.7.16.
- Added Makefile depencency for objects.
- Fixed detection of replaying.
- Added support for LDFLAGS.
2011-05-15: Version 1.7.10
- Updated for vdr-1.7.18.
- Added scaling for symbols.
2011-12-04: Version 1.7.11
- Updated for vdr-1.7.22: New API functions for signal strength
and quality used to provide information for the OSD.
- Added cppcheck target into Makefile.
- Refactored bitstream code.

View File

@@ -23,7 +23,8 @@ VERSION = $(shell grep 'static const char VERSION\[\] *=' $(PLUGIN).c | awk '{ p
### The C++ compiler and options:
CXX ?= g++
CXXFLAGS ?= -fPIC -g -O2 -Wall -Wextra -Wswitch-default -Wfloat-equal -Wundef -Wpointer-arith -Wconversion -Wcast-align -Wredundant-decls -Wno-unused-parameter -Woverloaded-virtual -Wno-parentheses
CXXFLAGS ?= -fPIC -g -O3 -Wall -Wextra -Wswitch-default -Wfloat-equal -Wundef -Wpointer-arith -Wconversion -Wcast-align -Wredundant-decls -Wno-unused-parameter -Woverloaded-virtual -Wno-parentheses
LDFLAGS ?= -Wl,--as-needed
### The directory environment:
@@ -31,6 +32,10 @@ VDRDIR = ../../..
LIBDIR = ../../lib
TMPDIR = /tmp
### Make sure that necessary options are included:
-include $(VDRDIR)/Make.global
### Allow user defined options to overwrite defaults:
-include $(VDRDIR)/Make.config
@@ -59,7 +64,7 @@ all-redirect: all
### The object files (add further files here):
OBJS = femon.o femonosd.o femonreceiver.o femoncfg.o femontools.o femonmpeg.o femonac3.o femonaac.o femonh264.o femonsymbol.o
OBJS = femon.o femonosd.o femonreceiver.o femoncfg.o femontools.o femonmpeg.o femonac3.o femonaac.o femonlatm.o femonh264.o femonsymbol.o
### The main target:
@@ -67,7 +72,7 @@ all: libvdr-$(PLUGIN).so i18n
### Implicit rules:
%.o: %.c
%.o: %.c Makefile
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
### Dependencies:
@@ -91,7 +96,7 @@ I18Npot = $(PODIR)/$(PLUGIN).pot
msgfmt -c -o $@ $<
$(I18Npot): $(wildcard *.c)
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='Rolf Ahrenberg' -o $@ $^
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name='vdr-$(PLUGIN)' --package-version='$(VERSION)' --msgid-bugs-address='<see README>' -o $@ `ls $^`
%.po: $(I18Npot)
msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
@@ -107,13 +112,13 @@ i18n: $(I18Nmsgs) $(I18Npot)
### Targets:
libvdr-$(PLUGIN).so: $(OBJS)
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
ifndef FEMON_DEBUG
@$(STRIP) $@
endif
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
dist: clean
dist: $(I18Npo) clean
@-rm -rf $(TMPDIR)/$(ARCHIVE)
@mkdir $(TMPDIR)/$(ARCHIVE)
@cp -a * $(TMPDIR)/$(ARCHIVE)
@@ -123,3 +128,6 @@ dist: clean
clean:
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ $(PODIR)/*.mo $(PODIR)/*.pot
cppcheck: $(OBJS)
@cppcheck --enable=information,style,unusedFunction -v -f $(OBJS:%.o=%.c)

8
README
View File

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

35
femon.c
View File

@@ -7,18 +7,18 @@
#include <vdr/menu.h>
#include <vdr/remote.h>
#include <vdr/menu.h>
#include <vdr/player.h>
#include "femoncfg.h"
#include "femonreceiver.h"
#include "femonosd.h"
#include "femonservice.h"
#include "femontools.h"
#if defined(APIVERSNUM) && APIVERSNUM < 10700
#error "VDR-1.7.0 API version or greater is required!"
#if defined(APIVERSNUM) && APIVERSNUM < 10722
#error "VDR-1.7.22 API version or greater is required!"
#endif
static const char VERSION[] = "1.7.5";
static const char VERSION[] = "1.7.11";
static const char DESCRIPTION[] = trNOOP("DVB Signal Information Monitor (OSD)");
static const char MAINMENUENTRY[] = trNOOP("Signal Information");
@@ -97,7 +97,7 @@ cOsdObject *cPluginFemon::MainMenuAction(void)
{
// Perform the action when selected from the main VDR menu.
debug("%s()\n", __PRETTY_FUNCTION__);
if (cReplayControl::NowReplaying() || (Channels.Count() <= 0))
if (cControl::Control() || (Channels.Count() <= 0))
Skins.Message(mtInfo, tr("Femon not available"));
else
return cFemonOsd::Instance(true);
@@ -112,6 +112,7 @@ bool cPluginFemon::SetupParse(const char *Name, const char *Value)
else if (!strcasecmp(Name, "Position")) femonConfig.position = atoi(Value);
else if (!strcasecmp(Name, "Skin")) femonConfig.skin = atoi(Value);
else if (!strcasecmp(Name, "Theme")) femonConfig.theme = atoi(Value);
else if (!strcasecmp(Name, "Downscale")) femonConfig.downscale = atoi(Value);
else if (!strcasecmp(Name, "RedLimit")) femonConfig.redlimit = atoi(Value);
else if (!strcasecmp(Name, "GreenLimit")) femonConfig.greenlimit = atoi(Value);
else if (!strcasecmp(Name, "UpdateInterval")) femonConfig.updateinterval = atoi(Value);
@@ -132,6 +133,8 @@ bool cPluginFemon::Service(const char *Id, void *Data)
if (strcmp(Id,"FemonService-v1.0") == 0) {
if (Data) {
FemonService_v1_0 *data = (FemonService_v1_0*)Data;
if (!cDevice::ActualDevice())
return false;
int ndx = cDevice::ActualDevice()->CardIndex();
data->fe_name = getFrontendName(ndx);
data->fe_status = getFrontendStatus(ndx);
@@ -150,7 +153,7 @@ bool cPluginFemon::Service(const char *Id, void *Data)
}
const char **cPluginFemon::SVDRPHelpPages(void)
{
{
static const char *HelpPages[] = {
"OPEN\n"
" Open femon plugin.",
@@ -166,10 +169,14 @@ const char **cPluginFemon::SVDRPHelpPages(void)
" Print the current frontend name.",
"STAT\n"
" Print the current frontend status.",
"SGNL\n"
"STRG\n"
" Print the current signal strength.",
"QUAL\n"
" Print the current signal quality.",
"SGNL\n"
" Print the current signal strength from driver.",
"SNRA\n"
" Print the current signal-to-noise ratio.",
" Print the current signal-to-noise ratio from driver.",
"BERA\n"
" Print the current bit error rate.",
"UNCB\n"
@@ -193,7 +200,7 @@ cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int
return cString("Cannot open femon plugin while replaying");
}
if (!cFemonOsd::Instance())
cRemote::CallPlugin("femon");
cRemote::CallPlugin(Name());
return cString("Opening femon plugin");
}
else if (strcasecmp(Command, "QUIT") == 0) {
@@ -222,6 +229,12 @@ cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int
else if (strcasecmp(Command, "STAT") == 0) {
return getFrontendStatus(cDevice::ActualDevice()->CardIndex());
}
else if (strcasecmp(Command, "STRG") == 0) {
return cString::sprintf("%d on device #%d", cDevice::ActualDevice()->SignalStrength(), cDevice::ActualDevice()->CardIndex());
}
else if (strcasecmp(Command, "QUAL") == 0) {
return cString::sprintf("%d on device #%d", cDevice::ActualDevice()->SignalQuality(), cDevice::ActualDevice()->CardIndex());
}
else if (strcasecmp(Command, "SGNL") == 0) {
int value = getSignal(cDevice::ActualDevice()->CardIndex());
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, cDevice::ActualDevice()->CardIndex());
@@ -319,6 +332,9 @@ void cMenuFemonSetup::Setup(void)
Add(new cMenuEditBoolItem(tr("Position"), &data.position, trVDR("bottom"), trVDR("top")));
help.Append(tr("Define the position of OSD."));
Add(new cMenuEditIntItem(tr("Downscale OSD size [%]"), &data.downscale, 0, 20));
help.Append(tr("Define the downscale ratio for OSD size."));
Add(new cMenuEditIntItem(tr("Red limit [%]"), &data.redlimit, 1, 50));
help.Append(tr("Define a limit for red bar, which is used to indicate a bad signal."));
@@ -360,6 +376,7 @@ void cMenuFemonSetup::Store(void)
SetupStore("Skin", femonConfig.skin);
SetupStore("Theme", femonConfig.theme);
SetupStore("Position", femonConfig.position);
SetupStore("Downscale", femonConfig.downscale);
SetupStore("RedLimit", femonConfig.redlimit);
SetupStore("GreenLimit", femonConfig.greenlimit);
SetupStore("UpdateInterval", femonConfig.updateinterval);

View File

@@ -26,7 +26,7 @@ cFemonAAC::~cFemonAAC()
bool cFemonAAC::processAudio(const uint8_t *buf, int len)
{
cBitStream bs(buf, len * 8);
cFemonBitStream bs(buf, len * 8);
if (!m_AudioHandler)
return false;
@@ -48,23 +48,23 @@ bool cFemonAAC::processAudio(const uint8_t *buf, int len)
// skip PES header
if (!PesLongEnough(len))
return false;
bs.skipBits(8 * PesPayloadOffset(buf));
bs.SkipBits(8 * PesPayloadOffset(buf));
// HE-AAC audio detection
if (bs.getBits(12) != 0xFFF) // syncword
if (bs.GetBits(12) != 0xFFF) // syncword
return false;
bs.skipBit(); // id
bs.SkipBit(); // id
// layer must be 0
if (bs.getBits(2)) // layer
if (bs.GetBits(2)) // layer
return false;
bs.skipBit(); // protection_absent
bs.skipBits(2); // profile
int sampling_frequency_index = bs.getBits(4); // sampling_frequency_index
bs.skipBit(); // private pid
int channel_configuration = bs.getBits(3); // channel_configuration
bs.SkipBit(); // protection_absent
bs.SkipBits(2); // profile
int sampling_frequency_index = bs.GetBits(4); // sampling_frequency_index
bs.SkipBit(); // private pid
int channel_configuration = bs.GetBits(3); // channel_configuration
m_AudioHandler->SetAudioCodec(AUDIO_CODEC_HEAAC);
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_RESERVED);

View File

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

View File

@@ -17,7 +17,8 @@ enum eAudioCodec {
AUDIO_CODEC_MPEG2_I,
AUDIO_CODEC_MPEG2_II,
AUDIO_CODEC_MPEG2_III,
AUDIO_CODEC_HEAAC
AUDIO_CODEC_HEAAC,
AUDIO_CODEC_LATM
};
enum eAudioChannelMode {

View File

@@ -17,13 +17,14 @@ cFemonConfig::cFemonConfig(void)
skin = 0;
theme = 0;
position = 1;
downscale = 0;
redlimit = 33;
greenlimit = 66;
updateinterval = 5;
analyzestream = 1;
calcinterval = 20;
usesvdrp = 0;
svdrpport = 2001;
svdrpport = 6419;
strncpy(svdrpip, "0.0.0.0", sizeof(svdrpip));
}

View File

@@ -28,6 +28,7 @@ public:
int skin;
int theme;
int position;
int downscale;
int redlimit;
int greenlimit;
int updateinterval;

Binary file not shown.

View File

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

112
femonlatm.c Normal file
View File

@@ -0,0 +1,112 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#include "femontools.h"
#include "femonlatm.h"
unsigned int cFemonLATM::s_Bitrates[3][16] =
{
{0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, -1}, // MPEG-2 Layer I
{0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1}, // MPEG-2 Layer II/III
{0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1} // MPEG-2 Layer II/III
};
unsigned int cFemonLATM::s_Samplerates[4] =
{
22050, 24000, 16000, -1
};
cFemonLATM::cFemonLATM(cFemonAudioIf *audiohandler)
: m_AudioHandler(audiohandler)
{
}
cFemonLATM::~cFemonLATM()
{
}
bool cFemonLATM::processAudio(const uint8_t *buf, int len)
{
cFemonBitStream bs(buf, len * 8);
if (!m_AudioHandler)
return false;
// skip PES header
if (!PesLongEnough(len))
return false;
bs.SkipBits(8 * PesPayloadOffset(buf));
// MPEG audio detection
if (bs.GetBits(12) != 0x56E) // syncword
return false;
m_AudioHandler->SetAudioCodec(AUDIO_CODEC_LATM);
if (bs.GetBit() == 0) // id: MPEG-1=1, extension to lower sampling frequencies=0
return true; // @todo: lower sampling frequencies support
int layer = 3 - bs.GetBits(2); // layer: I=11, II=10, III=01
bs.SkipBit(); // protection bit
int bit_rate_index = bs.GetBits(4); // bitrate index
int sampling_frequency = bs.GetBits(2); // sampling frequency
bs.SkipBit(); // padding bit
bs.SkipBit(); // private pid
int mode = bs.GetBits(2); // mode
switch (mode) {
case 0:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_STEREO);
break;
case 1:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_JOINT_STEREO);
break;
case 2:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_DUAL);
break;
case 3:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_SINGLE);
break;
default:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_INVALID);
break;
}
if (layer == 3) {
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_FREE);
}
else {
switch (bit_rate_index) {
case 0:
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_FREE);
break;
case 0xF:
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_RESERVED);
break;
default:
m_AudioHandler->SetAudioBitrate(1000 * s_Bitrates[layer][bit_rate_index]);
break;
}
}
switch (sampling_frequency) {
case 3:
m_AudioHandler->SetAudioSamplingFrequency(AUDIO_SAMPLING_FREQUENCY_RESERVED);
break;
default:
m_AudioHandler->SetAudioSamplingFrequency(s_Samplerates[sampling_frequency]);
break;
}
return true;
}

27
femonlatm.h Normal file
View File

@@ -0,0 +1,27 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONLATM_H
#define __FEMONLATM_H
#include "femonaudio.h"
class cFemonLATM {
private:
cFemonAudioIf *m_AudioHandler;
static unsigned int s_Bitrates[3][16];
static unsigned int s_Samplerates[4];
public:
cFemonLATM(cFemonAudioIf *audiohandler);
virtual ~cFemonLATM();
bool processAudio(const uint8_t *buf, int len);
};
#endif //__FEMONLATM_H

View File

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

View File

@@ -6,7 +6,7 @@
*/
#ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#endif
#include <ctype.h>
@@ -25,8 +25,9 @@
#define OSDROWHEIGHT m_Font->Height() // in pixels
#define OSDINFOHEIGHT (OSDROWHEIGHT * 13) // in pixels (13 rows)
#define OSDSTATUSHEIGHT (OSDROWHEIGHT * 6) // in pixels (6 rows)
#define OSDSPACING 5
#define OSDROUNDING 10
#define OSDSYMBOL(id) femonSymbols.Get(id)
#define OSDSPACING femonSymbols.GetSpacing()
#define OSDROUNDING femonSymbols.GetRounding()
#define IS_OSDROUNDING (femonConfig.skin == eFemonSkinElchi)
#define IS_OSDRESOLUTION(r1, r2) (abs(r1 - r2) < 20)
#define OSDINFOWIN_Y(offset) (femonConfig.position ? (OSDHEIGHT - OSDINFOHEIGHT + offset) : offset)
@@ -144,6 +145,7 @@ public:
virtual int Width(const char *s) const { return 50; }
virtual int Height(void) const { return 20; }
virtual void DrawText(cBitmap *Bitmap, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, int Width) const {}
virtual void DrawText(cPixmap *Pixmap, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, int Width) const {}
};
cFemonOsd *cFemonOsd::pInstance = NULL;
@@ -169,6 +171,10 @@ cFemonOsd::cFemonOsd()
m_SvdrpPlugin(NULL),
m_Number(0),
m_OldNumber(0),
m_Quality(0),
m_QualityValid(false),
m_Strength(0),
m_StrengthValid(false),
m_SNR(0),
m_SNRValid(false),
m_Signal(0),
@@ -179,8 +185,10 @@ cFemonOsd::cFemonOsd()
m_UNCValid(false),
m_FrontendStatusValid(false),
m_DisplayMode(femonConfig.displaymode),
m_OsdWidth(cOsd::OsdWidth()),
m_OsdHeight(cOsd::OsdHeight()),
m_OsdWidth(cOsd::OsdWidth() * (100 - femonConfig.downscale) / 100),
m_OsdHeight(cOsd::OsdHeight() * (100 - femonConfig.downscale) / 100),
m_OsdLeft(cOsd::OsdLeft() + (cOsd::OsdWidth() * femonConfig.downscale / 200)),
m_OsdTop(cOsd::OsdTop() + (cOsd::OsdHeight() * femonConfig.downscale / 200)),
m_InputTime(0),
m_Sleep(),
m_Mutex()
@@ -190,12 +198,13 @@ cFemonOsd::cFemonOsd()
memset(&m_FrontendStatus, 0, sizeof(m_FrontendStatus));
memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo));
m_SvdrpConnection.handle = -1;
femonSymbols.Refresh();
m_Font = cFont::CreateFont(Setup.FontSml, min(max(Setup.FontSmlSize, MINFONTSIZE), MAXFONTSIZE));
if (!m_Font || !m_Font->Height()) {
m_Font = new cFemonDummyFont;
error("cFemonOsd::cFemonOsd() cannot create required font.");
}
tmp = 5 * bmSymbol[SYMBOL_LOCK].Width() + 6 * OSDSPACING;
tmp = 5 * OSDSYMBOL(SYMBOL_LOCK).Width() + 6 * OSDSPACING;
if (OSDWIDTH < tmp) {
error("cFemonOsd::cFemonOsd() OSD width (%d) smaller than required (%d).", OSDWIDTH, tmp);
OSDWIDTH = tmp;
@@ -236,102 +245,123 @@ cFemonOsd::~cFemonOsd(void)
void cFemonOsd::DrawStatusWindow(void)
{
cMutexLock lock(&m_Mutex);
cBitmap *bm = NULL;
int offset = 0;
int x = OSDWIDTH - OSDROUNDING;
int y = 0;
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (m_Osd && channel) {
cBitmap *bm = NULL;
int offset = 0;
int x = OSDWIDTH - OSDROUNDING;
int y = 0;
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
OSDDRAWSTATUSTITLEBAR(*cString::sprintf("%d%s %s", m_Number ? m_Number : channel->Number(), m_Number ? "-" : "", channel->ShortName(true)));
if (m_SvdrpFrontend >= 0) {
bm = &bmSymbol[SYMBOL_SVDRP];
bm = &OSDSYMBOL(SYMBOL_SVDRP);
OSDDRAWSTATUSBM(OSDSPACING);
}
switch (cDevice::ActualDevice()->CardIndex()) {
case 1: bm = &bmSymbol[SYMBOL_ONE]; break;
case 2: bm = &bmSymbol[SYMBOL_TWO]; break;
case 3: bm = &bmSymbol[SYMBOL_THREE]; break;
case 4: bm = &bmSymbol[SYMBOL_FOUR]; break;
case 5: bm = &bmSymbol[SYMBOL_FIVE]; break;
case 6: bm = &bmSymbol[SYMBOL_SIX]; break;
case 7: bm = &bmSymbol[SYMBOL_SEVEN]; break;
case 8: bm = &bmSymbol[SYMBOL_EIGHT]; break;
default: bm = &bmSymbol[SYMBOL_ZERO]; break;
case 1: bm = &OSDSYMBOL(SYMBOL_ONE); break;
case 2: bm = &OSDSYMBOL(SYMBOL_TWO); break;
case 3: bm = &OSDSYMBOL(SYMBOL_THREE); break;
case 4: bm = &OSDSYMBOL(SYMBOL_FOUR); break;
case 5: bm = &OSDSYMBOL(SYMBOL_FIVE); break;
case 6: bm = &OSDSYMBOL(SYMBOL_SIX); break;
case 7: bm = &OSDSYMBOL(SYMBOL_SEVEN); break;
case 8: bm = &OSDSYMBOL(SYMBOL_EIGHT); break;
default: bm = &OSDSYMBOL(SYMBOL_ZERO); break;
}
OSDDRAWSTATUSBM(OSDSPACING);
bm = &bmSymbol[SYMBOL_DEVICE];
bm = &OSDSYMBOL(SYMBOL_DEVICE);
OSDDRAWSTATUSBM(0);
if (IS_AUDIO_TRACK(track)) {
switch (int(track - ttAudioFirst)) {
case 1: bm = &bmSymbol[SYMBOL_ONE]; break;
case 2: bm = &bmSymbol[SYMBOL_TWO]; break;
case 3: bm = &bmSymbol[SYMBOL_THREE]; break;
case 4: bm = &bmSymbol[SYMBOL_FOUR]; break;
case 5: bm = &bmSymbol[SYMBOL_FIVE]; break;
case 6: bm = &bmSymbol[SYMBOL_SIX]; break;
case 7: bm = &bmSymbol[SYMBOL_SEVEN]; break;
case 8: bm = &bmSymbol[SYMBOL_EIGHT]; break;
default: bm = &bmSymbol[SYMBOL_ZERO]; break;
case 1: bm = &OSDSYMBOL(SYMBOL_ONE); break;
case 2: bm = &OSDSYMBOL(SYMBOL_TWO); break;
case 3: bm = &OSDSYMBOL(SYMBOL_THREE); break;
case 4: bm = &OSDSYMBOL(SYMBOL_FOUR); break;
case 5: bm = &OSDSYMBOL(SYMBOL_FIVE); break;
case 6: bm = &OSDSYMBOL(SYMBOL_SIX); break;
case 7: bm = &OSDSYMBOL(SYMBOL_SEVEN); break;
case 8: bm = &OSDSYMBOL(SYMBOL_EIGHT); break;
default: bm = &OSDSYMBOL(SYMBOL_ZERO); break;
}
OSDDRAWSTATUSBM(OSDSPACING);
switch (cDevice::PrimaryDevice()->GetAudioChannel()) {
case 1: bm = &bmSymbol[SYMBOL_MONO_LEFT]; break;
case 2: bm = &bmSymbol[SYMBOL_MONO_RIGHT]; break;
default: bm = &bmSymbol[SYMBOL_STEREO]; break;
case 1: bm = &OSDSYMBOL(SYMBOL_MONO_LEFT); break;
case 2: bm = &OSDSYMBOL(SYMBOL_MONO_RIGHT); break;
default: bm = &OSDSYMBOL(SYMBOL_STEREO); break;
}
OSDDRAWSTATUSBM(0);
}
else if (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) {
if (m_Receiver->AC3_5_1()) bm = &bmSymbol[SYMBOL_DD51];
else if (m_Receiver->AC3_2_0()) bm = &bmSymbol[SYMBOL_DD20];
else bm = &bmSymbol[SYMBOL_DD];
if (m_Receiver->AC3_5_1()) bm = &OSDSYMBOL(SYMBOL_DD51);
else if (m_Receiver->AC3_2_0()) bm = &OSDSYMBOL(SYMBOL_DD20);
else bm = &OSDSYMBOL(SYMBOL_DD);
OSDDRAWSTATUSBM(OSDSPACING);
}
if (m_Receiver) {
if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 1080))
bm = &bmSymbol[SYMBOL_FORMAT_1080];
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 720))
bm = &bmSymbol[SYMBOL_FORMAT_720];
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 576))
bm = &bmSymbol[SYMBOL_FORMAT_576];
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 480))
bm = &bmSymbol[SYMBOL_FORMAT_480];
if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 1080)) {
switch (m_Receiver->VideoScan()) {
case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080i); break;
case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080p); break;
default: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080); break;
}
}
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 720)) {
switch (m_Receiver->VideoScan()) {
case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_720i); break;
case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_720p); break;
default: bm = &OSDSYMBOL(SYMBOL_FORMAT_720); break;
}
}
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 576)) {
switch (m_Receiver->VideoScan()) {
case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_576i); break;
case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_576p); break;
default: bm = &OSDSYMBOL(SYMBOL_FORMAT_576); break;
}
}
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 480)) {
switch (m_Receiver->VideoScan()) {
case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_480i); break;
case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_480p); break;
default: bm = &OSDSYMBOL(SYMBOL_FORMAT_480); break;
}
}
else
bm = NULL;
OSDDRAWSTATUSBM(OSDSPACING);
switch (m_Receiver->VideoCodec()) {
case VIDEO_CODEC_MPEG2: bm = &bmSymbol[SYMBOL_MPEG2]; break;
case VIDEO_CODEC_H264: bm = &bmSymbol[SYMBOL_H264]; break;
default: bm = NULL; break;
case VIDEO_CODEC_MPEG2: bm = &OSDSYMBOL(SYMBOL_MPEG2); break;
case VIDEO_CODEC_H264: bm = &OSDSYMBOL(SYMBOL_H264); break;
default: bm = NULL; break;
}
OSDDRAWSTATUSBM(OSDSPACING);
switch (m_Receiver->VideoFormat()) {
case VIDEO_FORMAT_PAL: bm = &bmSymbol[SYMBOL_PAL]; break;
case VIDEO_FORMAT_NTSC: bm = &bmSymbol[SYMBOL_NTSC]; break;
default: bm = NULL; break;
case VIDEO_FORMAT_PAL: bm = &OSDSYMBOL(SYMBOL_PAL); break;
case VIDEO_FORMAT_NTSC: bm = &OSDSYMBOL(SYMBOL_NTSC); break;
default: bm = NULL; break;
}
OSDDRAWSTATUSBM(OSDSPACING);
switch (m_Receiver->VideoAspectRatio()) {
case VIDEO_ASPECT_RATIO_1_1: bm = &bmSymbol[SYMBOL_AR_1_1]; break;
case VIDEO_ASPECT_RATIO_4_3: bm = &bmSymbol[SYMBOL_AR_4_3]; break;
case VIDEO_ASPECT_RATIO_16_9: bm = &bmSymbol[SYMBOL_AR_16_9]; break;
case VIDEO_ASPECT_RATIO_2_21_1: bm = &bmSymbol[SYMBOL_AR_2_21_1]; break;
default: bm = NULL; break;
case VIDEO_ASPECT_RATIO_1_1: bm = &OSDSYMBOL(SYMBOL_AR_1_1); break;
case VIDEO_ASPECT_RATIO_4_3: bm = &OSDSYMBOL(SYMBOL_AR_4_3); break;
case VIDEO_ASPECT_RATIO_16_9: bm = &OSDSYMBOL(SYMBOL_AR_16_9); break;
case VIDEO_ASPECT_RATIO_2_21_1: bm = &OSDSYMBOL(SYMBOL_AR_2_21_1); break;
default: bm = NULL; break;
}
OSDDRAWSTATUSBM(OSDSPACING);
}
if (channel->Ca() > 0xFF) {
bm = &bmSymbol[SYMBOL_ENCRYPTED];
bm = &OSDSYMBOL(SYMBOL_ENCRYPTED);
OSDDRAWSTATUSBM(OSDSPACING);
}
offset += OSDROWHEIGHT;
if (m_SignalValid)
OSDDRAWSTATUSBAR(m_Signal / 655);
if (m_StrengthValid)
OSDDRAWSTATUSBAR(m_Strength);
offset += OSDROWHEIGHT;
if (m_SNRValid)
OSDDRAWSTATUSBAR(m_SNR / 655);
if (m_QualityValid)
OSDDRAWSTATUSBAR(m_Quality);
offset += OSDROWHEIGHT;
OSDDRAWSTATUSVALUES("STR:", m_SignalValid ? *cString::sprintf("%04x", m_Signal) : "", m_SignalValid ? *cString::sprintf("(%2d%%)", m_Signal / 655) : "",
"BER:", m_BERValid ? *cString::sprintf("%08x", m_BER) : "", *cString::sprintf("%s:", tr("Video")),
@@ -342,14 +372,14 @@ void cFemonOsd::DrawStatusWindow(void)
*cString::sprintf("%s:", (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) ? tr("AC-3") : tr("Audio")),
*getBitrateKbits(m_Receiver ? ((m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) ? m_Receiver->AC3Bitrate() : m_Receiver->AudioBitrate()) : (m_SvdrpFrontend >= 0 ? m_SvdrpAudioBitrate : -1.0)));
offset += OSDROWHEIGHT;
x = bmSymbol[SYMBOL_LOCK].Width();
y = (OSDROWHEIGHT - bmSymbol[SYMBOL_LOCK].Height()) / 2;
x = OSDSYMBOL(SYMBOL_LOCK).Width();
y = (OSDROWHEIGHT - OSDSYMBOL(SYMBOL_LOCK).Height()) / 2;
if (m_FrontendStatusValid) {
OSDDRAWSTATUSFRONTEND(1, bmSymbol[SYMBOL_LOCK], FE_HAS_LOCK);
OSDDRAWSTATUSFRONTEND(2, bmSymbol[SYMBOL_SIGNAL], FE_HAS_SIGNAL);
OSDDRAWSTATUSFRONTEND(3, bmSymbol[SYMBOL_CARRIER], FE_HAS_CARRIER);
OSDDRAWSTATUSFRONTEND(4, bmSymbol[SYMBOL_VITERBI], FE_HAS_VITERBI);
OSDDRAWSTATUSFRONTEND(5, bmSymbol[SYMBOL_SYNC], FE_HAS_SYNC);
OSDDRAWSTATUSFRONTEND(1, OSDSYMBOL(SYMBOL_LOCK), FE_HAS_LOCK);
OSDDRAWSTATUSFRONTEND(2, OSDSYMBOL(SYMBOL_SIGNAL), FE_HAS_SIGNAL);
OSDDRAWSTATUSFRONTEND(3, OSDSYMBOL(SYMBOL_CARRIER), FE_HAS_CARRIER);
OSDDRAWSTATUSFRONTEND(4, OSDSYMBOL(SYMBOL_VITERBI), FE_HAS_VITERBI);
OSDDRAWSTATUSFRONTEND(5, OSDSYMBOL(SYMBOL_SYNC), FE_HAS_SYNC);
}
OSDDRAWSTATUSBOTTOMBAR();
m_Osd->Flush();
@@ -359,11 +389,13 @@ void cFemonOsd::DrawStatusWindow(void)
void cFemonOsd::DrawInfoWindow(void)
{
cMutexLock lock(&m_Mutex);
int offset = 0;
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
if (m_Osd && channel) {
int offset = 0;
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
cDvbTransponderParameters dtp(channel->Parameters());
switch (m_DisplayMode) {
case eFemonModeTransponder:
OSDDRAWINFOTITLEBAR(tr("Transponder Information"));
@@ -393,13 +425,13 @@ void cFemonOsd::DrawInfoWindow(void)
OSDDRAWINFORIGHT(trVDR("Source"), *cSource::ToString(channel->Source()));
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Srate"), *cString::sprintf("%d", channel->Srate()));
OSDDRAWINFORIGHT(trVDR("Polarization"), *cString::sprintf("%c", toupper(channel->Polarization())));
OSDDRAWINFORIGHT(trVDR("Polarization"), *cString::sprintf("%c", toupper(dtp.Polarization())));
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(channel->Inversion()));
OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(channel->CoderateH()));
OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(dtp.Inversion()));
OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(dtp.CoderateH()));
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("System"), *getSystem(channel->System()));
OSDDRAWINFORIGHT(trVDR("RollOff"), *getRollOff(channel->RollOff()));
OSDDRAWINFOLEFT( trVDR("System"), *getSystem(dtp.System()));
OSDDRAWINFORIGHT(trVDR("RollOff"), *getRollOff(dtp.RollOff()));
break;
case cSource::stCable:
@@ -409,26 +441,26 @@ void cFemonOsd::DrawInfoWindow(void)
OSDDRAWINFORIGHT(trVDR("Source"), *cSource::ToString(channel->Source()));
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Srate"), *cString::sprintf("%d", channel->Srate()));
OSDDRAWINFORIGHT(trVDR("Modulation"), *getModulation(channel->Modulation()));
OSDDRAWINFORIGHT(trVDR("Modulation"), *getModulation(dtp.Modulation()));
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(channel->Inversion()));
OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(channel->CoderateH()));
OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(dtp.Inversion()));
OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(dtp.CoderateH()));
break;
case cSource::stTerr:
OSDDRAWINFOLINE(*cString::sprintf("DVB-T #%d - %s", (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name));
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency()));
OSDDRAWINFORIGHT(trVDR("Transmission"), *getTransmission(channel->Transmission()));
OSDDRAWINFORIGHT(trVDR("Transmission"), *getTransmission(dtp.Transmission()));
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Bandwidth"), *getBandwidth(channel->Bandwidth()));
OSDDRAWINFORIGHT(trVDR("Modulation"), *getModulation(channel->Modulation()));
OSDDRAWINFOLEFT( trVDR("Bandwidth"), *getBandwidth(dtp.Bandwidth()));
OSDDRAWINFORIGHT(trVDR("Modulation"), *getModulation(dtp.Modulation()));
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(channel->Inversion()));
OSDDRAWINFORIGHT(tr ("Coderate"), *cString::sprintf("%s (H) %s (L)", *getCoderate(channel->CoderateH()), *getCoderate(channel->CoderateL())));
OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(dtp.Inversion()));
OSDDRAWINFORIGHT(tr ("Coderate"), *cString::sprintf("%s (H) %s (L)", *getCoderate(dtp.CoderateH()), *getCoderate(dtp.CoderateL())));
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Hierarchy"), *getHierarchy(channel->Hierarchy()));
OSDDRAWINFORIGHT(trVDR("Guard"), *getGuard(channel->Guard()));
OSDDRAWINFOLEFT( trVDR("Hierarchy"), *getHierarchy(dtp.Hierarchy()));
OSDDRAWINFORIGHT(trVDR("Guard"), *getGuard(dtp.Guard()));
break;
default:
@@ -513,6 +545,10 @@ void cFemonOsd::Action(void)
m_SvdrpVideoBitrate = -1.0;
m_SvdrpAudioBitrate = -1.0;
if (m_Frontend != -1) {
m_Quality = cDevice::ActualDevice()->SignalQuality();
m_QualityValid = (m_Quality >= 0);
m_Strength = cDevice::ActualDevice()->SignalStrength();
m_StrengthValid = (m_Strength >= 0);
m_FrontendStatusValid = (ioctl(m_Frontend, FE_READ_STATUS, &m_FrontendStatus) >= 0);
m_SignalValid = (ioctl(m_Frontend, FE_READ_SIGNAL_STRENGTH, &m_Signal) >= 0);
m_SNRValid = (ioctl(m_Frontend, FE_READ_SNR, &m_SNR) >= 0);
@@ -525,6 +561,8 @@ void cFemonOsd::Action(void)
cmd.handle = m_SvdrpConnection.handle;
m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd);
if (cmd.responseCode == 900) {
m_StrengthValid = false;
m_QualityValid = false;
m_FrontendStatusValid = false;
m_SignalValid = false;
m_SNRValid = false;
@@ -534,6 +572,14 @@ void cFemonOsd::Action(void)
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)) {
@@ -575,8 +621,6 @@ void cFemonOsd::Action(void)
void cFemonOsd::Show(void)
{
debug("%s()\n", __PRETTY_FUNCTION__);
int apid[2] = {0, 0};
int dpid[2] = {0, 0};
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
cString dev = cString::sprintf(FRONTEND_DEVICE, cDevice::ActualDevice()->CardIndex(), 0);
m_Frontend = open(dev, O_RDONLY | O_NONBLOCK);
@@ -599,7 +643,7 @@ void cFemonOsd::Show(void)
return;
}
m_Osd = cOsdProvider::NewOsd(cOsd::OsdLeft(), cOsd::OsdTop());
m_Osd = cOsdProvider::NewOsd(m_OsdLeft, m_OsdTop);
if (m_Osd) {
tArea Areas1[] = { { 0, 0, OSDWIDTH - 1, OSDHEIGHT - 1, 8 } };
if (Setup.AntiAlias && m_Osd->CanHandleAreas(Areas1, sizeof(Areas1) / sizeof(tArea)) == oeOk) {
@@ -621,9 +665,7 @@ void cFemonOsd::Show(void)
if (femonConfig.analyzestream) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (channel) {
IS_AUDIO_TRACK(track) ? apid[0] = channel->Apid(int(track - ttAudioFirst)) : apid[0] = channel->Apid(0);
IS_DOLBY_TRACK(track) ? dpid[0] = channel->Dpid(int(track - ttDolbyFirst)) : dpid[0] = channel->Dpid(0);
m_Receiver = new cFemonReceiver(channel->GetChannelID(), channel->Ca(), channel->Vtype(), channel->Vpid(), apid, dpid);
m_Receiver = new cFemonReceiver(channel->Vtype(), channel->Vpid(), channel->Apid(IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0), channel->Dpid(IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0));
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
}
@@ -634,8 +676,6 @@ void cFemonOsd::Show(void)
void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
{
debug("%s(%d,%d)\n", __PRETTY_FUNCTION__, device->DeviceNumber(), channelNumber);
int apid[2] = {0, 0};
int dpid[2] = {0, 0};
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
if (!device->IsPrimaryDevice() || !channelNumber || cDevice::PrimaryDevice()->CurrentChannel() != channelNumber)
return;
@@ -668,9 +708,7 @@ void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
if (femonConfig.analyzestream) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (channel) {
IS_AUDIO_TRACK(track) ? apid[0] = channel->Apid(int(track - ttAudioFirst)) : apid[0] = channel->Apid(0);
IS_DOLBY_TRACK(track) ? dpid[0] = channel->Dpid(int(track - ttDolbyFirst)) : dpid[0] = channel->Dpid(0);
m_Receiver = new cFemonReceiver(channel->GetChannelID(), channel->Ca(), channel->Vtype(), channel->Vpid(), apid, dpid);
m_Receiver = new cFemonReceiver(channel->Vtype(), channel->Vpid(), channel->Apid(IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0), channel->Dpid(IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0));
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
}
@@ -679,8 +717,6 @@ void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
void cFemonOsd::SetAudioTrack(int Index, const char * const *Tracks)
{
debug("%s()\n", __PRETTY_FUNCTION__);
int apid[2] = {0, 0};
int dpid[2] = {0, 0};
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
if (m_Receiver) {
m_Receiver->Deactivate();
@@ -689,9 +725,7 @@ void cFemonOsd::SetAudioTrack(int Index, const char * const *Tracks)
if (femonConfig.analyzestream) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (channel) {
IS_AUDIO_TRACK(track) ? apid[0] = channel->Apid(int(track - ttAudioFirst)) : apid[0] = channel->Apid(0);
IS_DOLBY_TRACK(track) ? dpid[0] = channel->Dpid(int(track - ttDolbyFirst)) : dpid[0] = channel->Dpid(0);
m_Receiver = new cFemonReceiver(channel->GetChannelID(), channel->Ca(), channel->Vtype(), channel->Vpid(), apid, dpid);
m_Receiver = new cFemonReceiver(channel->Vtype(), channel->Vpid(), channel->Apid(IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0), channel->Dpid(IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0));
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
}
@@ -706,7 +740,7 @@ bool cFemonOsd::DeviceSwitch(int direction)
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (channel) {
for (int i = 0; i < cDevice::NumDevices() - 1; i++) {
if (direction) {
if (direction >= 0) {
if (++device >= cDevice::NumDevices())
device = 0;
}
@@ -721,7 +755,7 @@ bool cFemonOsd::DeviceSwitch(int direction)
cDevice::GetDevice(device)->SwitchChannel(channel, true);
if (cDevice::GetDevice(device) == cDevice::PrimaryDevice())
cDevice::GetDevice(device)->ForceTransferMode();
cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel->GetChannelID(), channel->Vpid(), channel->Apids(), channel->Dpids(), channel->Spids()));
cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel));
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), channel->Number());
return (true);
}
@@ -817,7 +851,7 @@ eOSState cFemonOsd::ProcessKey(eKeys Key)
{
eOSState state = cOsdObject::ProcessKey(Key);
if (state == osUnknown) {
switch (Key) {
switch (int(Key)) {
case k0:
if ((m_Number == 0) && (m_OldNumber != 0)) {
m_Number = m_OldNumber;

View File

@@ -36,6 +36,10 @@ private:
cPlugin *m_SvdrpPlugin;
int m_Number;
int m_OldNumber;
int m_Quality;
bool m_QualityValid;
int m_Strength;
bool m_StrengthValid;
uint16_t m_SNR;
bool m_SNRValid;
uint16_t m_Signal;
@@ -50,6 +54,8 @@ private:
int m_DisplayMode;
int m_OsdWidth;
int m_OsdHeight;
int m_OsdLeft;
int m_OsdTop;
cFont *m_Font;
cTimeMs m_InputTime;
cCondWait m_Sleep;

View File

@@ -10,15 +10,15 @@
#include "femoncfg.h"
#include "femonreceiver.h"
cFemonReceiver::cFemonReceiver(tChannelID ChannelID, int Ca, int Vtype, int Vpid, int Apid[], int Dpid[])
: cReceiver(ChannelID, -1, Vpid, Apid, Dpid, NULL),
cThread("femon receiver"),
cFemonReceiver::cFemonReceiver(int Vtype, int Vpid, int Apid, int Dpid)
: cThread("femon receiver"),
m_Mutex(),
m_Sleep(),
m_Active(false),
m_DetectH264(this),
m_DetectMPEG(this, this),
m_DetectAAC(this),
m_DetectLATM(this),
m_DetectAC3(this),
m_VideoBuffer(KILOBYTE(512), TS_SIZE, false, "Femon video"),
m_VideoType(Vtype),
@@ -27,18 +27,22 @@ cFemonReceiver::cFemonReceiver(tChannelID ChannelID, int Ca, int Vtype, int Vpid
m_VideoBitrate(0.0),
m_VideoValid(false),
m_AudioBuffer(KILOBYTE(256), TS_SIZE, false, "Femon audio"),
m_AudioPid(Apid[0]),
m_AudioPid(Apid),
m_AudioPacketCount(0),
m_AudioBitrate(0.0),
m_AudioValid(false),
m_AC3Buffer(KILOBYTE(256), TS_SIZE, false, "Femon AC3"),
m_AC3Pid(Dpid[0]),
m_AC3Pid(Dpid),
m_AC3PacketCount(0),
m_AC3Bitrate(0),
m_AC3Valid(false)
{
debug("%s()\n", __PRETTY_FUNCTION__);
AddPid(m_VideoPid);
AddPid(m_AudioPid);
AddPid(m_AC3Pid);
m_VideoBuffer.SetTimeouts(0, 100);
m_AudioBuffer.SetTimeouts(0, 100);
m_AC3Buffer.SetTimeouts(0, 100);
@@ -141,7 +145,7 @@ void cFemonReceiver::Action(void)
while (Data = m_VideoBuffer.Get(Length)) {
if (!m_Active || (Length < TS_SIZE))
break;
Length = TS_SIZE;
Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) {
@@ -178,7 +182,7 @@ void cFemonReceiver::Action(void)
while (Data = m_AudioBuffer.Get(Length)) {
if (!m_Active || (Length < TS_SIZE))
break;
Length = TS_SIZE;
Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) {
@@ -191,7 +195,7 @@ void cFemonReceiver::Action(void)
}
processed = true;
if (const uint8_t *p = m_AudioAssembler.GetPes(len)) {
if (m_DetectAAC.processAudio(p, len) || m_DetectMPEG.processAudio(p, len))
if (m_DetectAAC.processAudio(p, len) || m_DetectLATM.processAudio(p, len) || m_DetectMPEG.processAudio(p, len))
m_AudioValid = true;
m_AudioAssembler.Reset();
}
@@ -203,7 +207,7 @@ void cFemonReceiver::Action(void)
while (Data = m_AC3Buffer.Get(Length)) {
if (!m_Active || (Length < TS_SIZE))
break;
Length = TS_SIZE;
Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) {

View File

@@ -14,6 +14,7 @@
#include "femonh264.h"
#include "femonmpeg.h"
#include "femonaac.h"
#include "femonlatm.h"
#include "femonac3.h"
#include "femonaudio.h"
#include "femonvideo.h"
@@ -28,6 +29,7 @@ private:
cFemonH264 m_DetectH264;
cFemonMPEG m_DetectMPEG;
cFemonAAC m_DetectAAC;
cFemonLATM m_DetectLATM;
cFemonAC3 m_DetectAC3;
cRingBufferLinear m_VideoBuffer;
@@ -106,7 +108,7 @@ public:
m_AC3Info.lfe = onoff; }
public:
cFemonReceiver(tChannelID ChannelID, int Ca, int Vtype, int Vpid, int Apid[], int Dpid[]);
cFemonReceiver(int Vtype, int Vpid, int Apid, int Dpid);
virtual ~cFemonReceiver();
void Deactivate(void);

View File

@@ -5,6 +5,8 @@
*
*/
#include <vdr/device.h>
#include "femontools.h"
#include "femonsymbol.h"
#include "symbols/stereo.xpm"
@@ -39,45 +41,168 @@
#include "symbols/seven.xpm"
#include "symbols/eight.xpm"
#include "symbols/format1080.xpm"
#include "symbols/format1080i.xpm"
#include "symbols/format1080p.xpm"
#include "symbols/format720.xpm"
#include "symbols/format720i.xpm"
#include "symbols/format720p.xpm"
#include "symbols/format576.xpm"
#include "symbols/format576i.xpm"
#include "symbols/format576p.xpm"
#include "symbols/format480.xpm"
#include "symbols/format480i.xpm"
#include "symbols/format480p.xpm"
cBitmap bmSymbol[SYMBOL_MAX_COUNT] =
static cBitmap bmStereo(stereo_xpm);
static cBitmap bmMonoLeft(monoleft_xpm);
static cBitmap bmMonoRight(monoright_xpm);
static cBitmap bmDolbyDigital(dolbydigital_xpm);
static cBitmap bmDolbyDigital20(dolbydigital20_xpm);
static cBitmap bmDolbyDigital51(dolbydigital51_xpm);
static cBitmap bmMpeg2(mpeg2_xpm);
static cBitmap bmH264(h264_xpm);
static cBitmap bmPal(pal_xpm);
static cBitmap bmNtsc(ntsc_xpm);
static cBitmap bmEncrypted(encrypted_xpm);
static cBitmap bmSvdrp(svdrp_xpm);
static cBitmap bmLock(lock_xpm);
static cBitmap bmSignal(signal_xpm);
static cBitmap bmCarrier(carrier_xpm);
static cBitmap bmViterbi(viterbi_xpm);
static cBitmap bmSync(sync_xpm);
static cBitmap bmAspectRatio11(ar11_xpm);
static cBitmap bmAspectRatio169(ar169_xpm);
static cBitmap bmAspectRatio2211(ar2211_xpm);
static cBitmap bmAspectRatio43(ar43_xpm);
static cBitmap bmDevice(device_xpm);
static cBitmap bmZero(zero_xpm);
static cBitmap bmOne(one_xpm);
static cBitmap bmTwo(two_xpm);
static cBitmap bmThree(three_xpm);
static cBitmap bmFour(four_xpm);
static cBitmap bmFive(five_xpm);
static cBitmap bmSix(six_xpm);
static cBitmap bmSeven(seven_xpm);
static cBitmap bmEight(eight_xpm);
static cBitmap bmFormat1080(format1080_xpm);
static cBitmap bmFormat1080i(format1080i_xpm);
static cBitmap bmFormat1080p(format1080p_xpm);
static cBitmap bmFormat720(format720_xpm);
static cBitmap bmFormat720i(format720i_xpm);
static cBitmap bmFormat720p(format720p_xpm);
static cBitmap bmFormat576(format576_xpm);
static cBitmap bmFormat576i(format576i_xpm);
static cBitmap bmFormat576p(format576p_xpm);
static cBitmap bmFormat480(format480_xpm);
static cBitmap bmFormat480i(format480i_xpm);
static cBitmap bmFormat480p(format480p_xpm);
cFemonSymbolCache femonSymbols;
cFemonSymbolCache::cFemonSymbolCache()
: xFactorM(1.0),
yFactorM(1.0),
antiAliasM(false)
{
cBitmap(stereo_xpm), // SYMBOL_STEREO
cBitmap(monoleft_xpm), // SYMBOL_MONO_LEFT
cBitmap(monoright_xpm), // SYMBOL_MONO_RIGHT
cBitmap(dolbydigital_xpm), // SYMBOL_DD
cBitmap(dolbydigital20_xpm), // SYMBOL_DD20
cBitmap(dolbydigital51_xpm), // SYMBOL_DD51
cBitmap(mpeg2_xpm), // SYMBOL_MPEG2
cBitmap(h264_xpm), // SYMBOL_H264
cBitmap(pal_xpm), // SYMBOL_PAL
cBitmap(ntsc_xpm), // SYMBOL_NTSC
cBitmap(encrypted_xpm), // SYMBOL_ENCRYPTED
cBitmap(svdrp_xpm), // SYMBOL_SVDRP
cBitmap(lock_xpm), // SYMBOL_LOCK
cBitmap(signal_xpm), // SYMBOL_SIGNAL
cBitmap(carrier_xpm), // SYMBOL_CARRIER
cBitmap(viterbi_xpm), // SYMBOL_VITERBI
cBitmap(sync_xpm), // SYMBOL_SYNC
cBitmap(ar11_xpm), // SYMBOL_AR_1_1
cBitmap(ar169_xpm), // SYMBOL_AR_16_9
cBitmap(ar2211_xpm), // SYMBOL_AR_2_21_1
cBitmap(ar43_xpm), // SYMBOL_AR_4_3
cBitmap(device_xpm), // SYMBOL_DEVICE
cBitmap(zero_xpm), // SYMBOL_ZERO
cBitmap(one_xpm), // SYMBOL_ONE
cBitmap(two_xpm), // SYMBOL_TWO
cBitmap(three_xpm), // SYMBOL_THREE
cBitmap(four_xpm), // SYMBOL_FOUR
cBitmap(five_xpm), // SYMBOL_FIVE
cBitmap(six_xpm), // SYMBOL_SIX
cBitmap(seven_xpm), // SYMBOL_SEVEN
cBitmap(eight_xpm), // SYMBOL_EIGHT
cBitmap(format1080_xpm), // SYMBOL_FORMAT_1080
cBitmap(format720_xpm), // SYMBOL_FORMAT_720
cBitmap(format576_xpm), // SYMBOL_FORMAT_576
cBitmap(format480_xpm) // SYMBOL_FORMAT_480
};
Populate();
}
cFemonSymbolCache::~cFemonSymbolCache()
{
Flush();
}
void cFemonSymbolCache::Refresh()
{
int width, height;
double aspect, xfactor, yfactor;
cDevice::PrimaryDevice()->GetOsdSize(width, height, aspect);
debug("%s(): %dx%d\n", __PRETTY_FUNCTION__, width, height);
xfactor = (double)width / DEFAULT_WIDTH;
yfactor = (double)height / DEFAULT_HEIGHT;
if (!DoubleEqual(xfactor, xFactorM) || !DoubleEqual(yfactor, yFactorM)) {
xFactorM = xfactor;
yFactorM = yfactor;
Populate();
}
}
bool cFemonSymbolCache::Populate(void)
{
debug("%s(): %.02fx%.02f\n", __PRETTY_FUNCTION__, xFactorM, yFactorM);
if (!DoubleEqual(0.0, xFactorM) || !DoubleEqual(0.0, yFactorM)) {
Flush();
// pushing order must follow the enumeration - keep original proportions except for frontend status ones
cacheM.Append(bmStereo.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_STEREO
cacheM.Append(bmMonoLeft.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_MONO_LEFT
cacheM.Append(bmMonoRight.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_MONO_RIGHT
cacheM.Append(bmDolbyDigital.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_DD
cacheM.Append(bmDolbyDigital20.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_DD20
cacheM.Append(bmDolbyDigital51.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_DD51
cacheM.Append(bmMpeg2.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_MPEG2
cacheM.Append(bmH264.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_H264
cacheM.Append(bmPal.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_PAL
cacheM.Append(bmNtsc.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_NTSC
cacheM.Append(bmEncrypted.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_ENCRYPTED
cacheM.Append(bmSvdrp.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_SVDRP
cacheM.Append(bmLock.Scaled(xFactorM, yFactorM, antiAliasM)); // SYMBOL_LOCK
cacheM.Append(bmSignal.Scaled(xFactorM, yFactorM, antiAliasM)); // SYMBOL_SIGNAL
cacheM.Append(bmCarrier.Scaled(xFactorM, yFactorM, antiAliasM)); // SYMBOL_CARRIER
cacheM.Append(bmViterbi.Scaled(xFactorM, yFactorM, antiAliasM)); // SYMBOL_VITERBI
cacheM.Append(bmSync.Scaled(xFactorM, yFactorM, antiAliasM)); // SYMBOL_SYNC
cacheM.Append(bmAspectRatio11.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_AR_1_1
cacheM.Append(bmAspectRatio169.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_AR_16_9
cacheM.Append(bmAspectRatio2211.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_AR_2_21_1
cacheM.Append(bmAspectRatio43.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_AR_4_3
cacheM.Append(bmDevice.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_DEVICE
cacheM.Append(bmZero.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_ZERO
cacheM.Append(bmOne.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_ONE
cacheM.Append(bmTwo.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_TWO
cacheM.Append(bmThree.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_THREE
cacheM.Append(bmFour.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FOUR
cacheM.Append(bmFive.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FIVE
cacheM.Append(bmSix.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_SIX
cacheM.Append(bmSeven.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_SEVEN
cacheM.Append(bmEight.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_EIGHT
cacheM.Append(bmFormat1080.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_1080
cacheM.Append(bmFormat1080i.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_1080i
cacheM.Append(bmFormat1080p.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_1080p
cacheM.Append(bmFormat720.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_720
cacheM.Append(bmFormat720i.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_720i
cacheM.Append(bmFormat720p.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_720p
cacheM.Append(bmFormat576.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_576
cacheM.Append(bmFormat576i.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_576i
cacheM.Append(bmFormat576p.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_576p
cacheM.Append(bmFormat480.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_480
cacheM.Append(bmFormat480i.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_480i
cacheM.Append(bmFormat480p.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_480p
return true;
}
return false;
}
bool cFemonSymbolCache::Flush(void)
{
debug("%s()\n", __PRETTY_FUNCTION__);
for (int i = 0; i < cacheM.Size(); ++i) {
cBitmap *bmp = cacheM[i];
DELETENULL(bmp);
}
cacheM.Clear();
return true;
}
cBitmap& cFemonSymbolCache::Get(eSymbols symbolP)
{
cBitmap *bitmapM = NULL;
if (symbolP < cacheM.Size())
bitmapM = cacheM[symbolP];
else
error("%s(): Invalid symbol %d\n", __PRETTY_FUNCTION__, symbolP);
return *bitmapM;
}

View File

@@ -8,6 +8,7 @@
#ifndef __FEMONSYMBOL_H
#define __FEMONSYMBOL_H
#include <vdr/tools.h>
#include <vdr/osd.h>
enum eSymbols {
@@ -43,12 +44,43 @@ enum eSymbols {
SYMBOL_SEVEN,
SYMBOL_EIGHT,
SYMBOL_FORMAT_1080,
SYMBOL_FORMAT_1080i,
SYMBOL_FORMAT_1080p,
SYMBOL_FORMAT_720,
SYMBOL_FORMAT_720i,
SYMBOL_FORMAT_720p,
SYMBOL_FORMAT_576,
SYMBOL_FORMAT_576i,
SYMBOL_FORMAT_576p,
SYMBOL_FORMAT_480,
SYMBOL_FORMAT_480i,
SYMBOL_FORMAT_480p,
SYMBOL_MAX_COUNT
};
extern cBitmap bmSymbol[SYMBOL_MAX_COUNT];
class cFemonSymbolCache {
private:
enum {
DEFAULT_SPACING = 5,
DEFAULT_ROUNDING = 10,
DEFAULT_HEIGHT = 576,
DEFAULT_WIDTH = 720
};
double xFactorM;
double yFactorM;
bool antiAliasM;
cVector<cBitmap*> cacheM;
bool Populate(void);
bool Flush(void);
public:
cFemonSymbolCache();
~cFemonSymbolCache();
void Refresh();
cBitmap& Get(eSymbols symbolP);
int GetSpacing() { return yFactorM * DEFAULT_SPACING; }
int GetRounding() { return yFactorM * DEFAULT_ROUNDING; }
};
extern cFemonSymbolCache femonSymbols;
#endif // __FEMONSYMBOL_H

View File

@@ -65,9 +65,9 @@ static cString getCA(int value)
return cString::sprintf("%X", value);
}
static const char *getUserString(int Value, const tChannelParameterMap *Map)
static const char *getUserString(int Value, const tDvbParameterMap *Map)
{
const tChannelParameterMap *map = Map;
const tDvbParameterMap *map = Map;
while (map && map->userValue != -1) {
if (map->driverValue == Value)
return map->userString ? trVDR(map->userString) : "---";
@@ -92,7 +92,7 @@ cString getFrontendInfo(int cardIndex)
if (fe < 0)
return NULL;
info = cString::sprintf("CARD:%d", cardIndex);
info = cString::sprintf("CARD:%d\nSTRG:%d\nQUAL:%d", cardIndex, cDevice::ActualDevice()->SignalStrength(), cDevice::ActualDevice()->SignalQuality());
if (ioctl(fe, FE_GET_INFO, &value) >= 0)
info = cString::sprintf("%s\nTYPE:%d\nNAME:%s", *info, value.type, value.name);
@@ -294,6 +294,7 @@ cString getAudioCodec(int value)
case AUDIO_CODEC_MPEG2_II: return cString::sprintf("%s", tr("MPEG-2 Layer II"));
case AUDIO_CODEC_MPEG2_III: return cString::sprintf("%s", tr("MPEG-2 Layer III"));
case AUDIO_CODEC_HEAAC: return cString::sprintf("%s", tr("HE-AAC"));
case AUDIO_CODEC_LATM: return cString::sprintf("%s", tr("LATM"));
default: break;
}
return cString::sprintf("---");
@@ -541,84 +542,31 @@ cString getBitrateKbits(double value)
return cString::sprintf("---");
}
cBitStream::cBitStream(const uint8_t *buf, const int len)
: data(buf),
count(len),
index(0)
{
}
// --- cFemonBitStream -------------------------------------------------------
cBitStream::~cBitStream()
{
}
int cBitStream::getBit()
{
if (index >= count)
return (1); // -> no infinite colomb's ...
int r = (data[index >> 3] >> (7 - (index & 7))) & 1;
++index;
return (r);
}
uint32_t cBitStream::getBits(uint32_t n)
{
uint32_t r = 0;
while (n--)
r = (r | (getBit() << n));
return (r);
}
void cBitStream::skipBits(uint32_t n)
{
index += n;
}
uint32_t cBitStream::getUeGolomb()
uint32_t cFemonBitStream::GetUeGolomb()
{
int n = 0;
while (!getBit() && (n < 32))
while (!GetBit() && (n < 32))
n++;
return (n ? ((1 << n) - 1) + getBits(n) : 0);
return (n ? ((1 << n) - 1) + GetBits(n) : 0);
}
int32_t cBitStream::getSeGolomb()
int32_t cFemonBitStream::GetSeGolomb()
{
uint32_t r = getUeGolomb() + 1;
uint32_t r = GetUeGolomb() + 1;
return ((r & 1) ? -(r >> 1) : (r >> 1));
}
void cBitStream::skipGolomb()
void cFemonBitStream::SkipGolomb()
{
int n = 0;
while (!getBit() && (n < 32))
while (!GetBit() && (n < 32))
n++;
skipBits(n);
}
void cBitStream::skipUeGolomb()
{
skipGolomb();
}
void cBitStream::skipSeGolomb()
{
skipGolomb();
}
void cBitStream::byteAlign()
{
int n = index % 8;
if (n > 0)
skipBits(8 - n);
SkipBits(n);
}

View File

@@ -71,35 +71,14 @@ cString getVideoBitrate(double value, double stream);
cString getBitrateMbits(double value);
cString getBitrateKbits(double value);
class cBitStream {
private:
const uint8_t *data;
int count; // in bits
int index; // in bits
class cFemonBitStream : public cBitStream {
public:
cBitStream(const uint8_t *buf, const int len);
~cBitStream();
int getBit();
uint32_t getBits(uint32_t n);
void skipBits(uint32_t n);
uint32_t getUeGolomb();
int32_t getSeGolomb();
void skipGolomb();
void skipUeGolomb();
void skipSeGolomb();
void byteAlign();
void skipBit() { skipBits(1); }
uint32_t getU8() { return getBits(8); }
uint32_t getU16() { return ((getBits(8) << 8) | getBits(8)); }
uint32_t getU24() { return ((getBits(8) << 16) | (getBits(8) << 8) | getBits(8)); }
uint32_t getU32() { return ((getBits(8) << 24) | (getBits(8) << 16) | (getBits(8) << 8) | getBits(8)); }
bool isEOF() { return (index >= count); }
void reset() { index = 0; }
int getIndex() { return (isEOF() ? count : index); }
const uint8_t *getData() { return (isEOF() ? NULL : data + (index / 8)); }
};
cFemonBitStream(const uint8_t *Data, const int Length) : cBitStream(Data, Length) {}
uint32_t GetUeGolomb();
int32_t GetSeGolomb();
void SkipGolomb();
void SkipUeGolomb() { SkipGolomb(); }
void SkipSeGolomb() { SkipGolomb(); }
};
#endif // __FEMONTOOLS_H

View File

@@ -7,12 +7,13 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Project-Id-Version: vdr-femon 1.7.10\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
"Last-Translator: Christian Wieninger\n"
"Language-Team: <vdr@linuxtv.org>\n"
"Language-Team: German <vdr@linuxtv.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-15\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -89,6 +90,12 @@ msgstr "Position"
msgid "Define the position of OSD."
msgstr ""
msgid "Downscale OSD size [%]"
msgstr ""
msgid "Define the downscale ratio for OSD size."
msgstr ""
msgid "Red limit [%]"
msgstr "Grenze Rot [%]"
@@ -260,6 +267,9 @@ msgstr ""
msgid "HE-AAC"
msgstr ""
msgid "LATM"
msgstr ""
msgid "stereo"
msgstr ""

View File

@@ -5,12 +5,13 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Project-Id-Version: vdr-femon 1.7.10\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
"Last-Translator: Luis Palacios\n"
"Language-Team: <vdr@linuxtv.org>\n"
"Language-Team: Spanish <vdr@linuxtv.org>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-15\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -87,6 +88,12 @@ msgstr "Posici
msgid "Define the position of OSD."
msgstr ""
msgid "Downscale OSD size [%]"
msgstr ""
msgid "Define the downscale ratio for OSD size."
msgstr ""
msgid "Red limit [%]"
msgstr "L<>mite de rojo [%s]"
@@ -258,6 +265,9 @@ msgstr ""
msgid "HE-AAC"
msgstr ""
msgid "LATM"
msgstr ""
msgid "stereo"
msgstr ""

View File

@@ -5,12 +5,13 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Project-Id-Version: vdr-femon 1.7.10\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
"Last-Translator: Arthur Konovalov\n"
"Language-Team: <vdr@linuxtv.org>\n"
"Language-Team: Estonian <vdr@linuxtv.org>\n"
"Language: et\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-13\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -22,7 +23,7 @@ msgid "Signal Information"
msgstr "Signaaliinfo"
msgid "Femon not available"
msgstr ""
msgstr "Femon ei ole k<>ttesaadav"
msgid "basic"
msgstr "standard"
@@ -37,7 +38,7 @@ msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "Klassikaline"
msgstr "Classic"
msgid "Elchi"
msgstr "Elchi"
@@ -64,79 +65,85 @@ msgid "SilverGreen"
msgstr "SilverGreen"
msgid "Hide main menu entry"
msgstr "Peida valik peamen<65><6E>s"
msgstr "Peita valik peamen<65><6E>s"
msgid "Define whether the main menu entry is hidden."
msgstr ""
msgstr "Valiku peamen<65><6E>s peitmise m<><6D>ritlemine."
msgid "Default display mode"
msgstr "Vaikimisi displei moodus"
msgstr "Vaikemoodus"
msgid "Define the default display mode at startup."
msgstr ""
msgstr "K<EFBFBD>ivitamisel vaikemooduse m<><6D>ritlemine."
msgid "Define the used OSD skin."
msgstr ""
msgstr "Kasutatava ekraanikesta m<><6D>ritlemine."
msgid "Define the used OSD theme."
msgstr ""
msgstr "Kasutatava teema m<><6D>ritlemine."
msgid "Position"
msgstr "Positsioon"
msgid "Define the position of OSD."
msgstr ""
msgstr "Ekraaniinfo positsiooni m<><6D>ritlemine."
msgid "Downscale OSD size [%]"
msgstr "Ekraanimen<65><6E> v<>hendamine [%]"
msgid "Define the downscale ratio for OSD size."
msgstr "Ekraanimen<65><6E> suuruse v<>hendamise m<><6D>ritlemine"
msgid "Red limit [%]"
msgstr "Punase limiit [%]"
msgid "Define a limit for red bar, which is used to indicate a bad signal."
msgstr ""
msgstr "Seaded punasele limiidile. Iseloomustab kehva signaali."
msgid "Green limit [%]"
msgstr "Rohelise limiit [%]"
msgid "Define a limit for green bar, which is used to indicate a good signal."
msgstr ""
msgstr "Seaded rohelisele limiidile. Iseloomustab head signaali."
msgid "OSD update interval [0.1s]"
msgstr "Uuendusintervall [0,1s]"
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
msgstr ""
msgstr "Ekraaniinfo uuendamise intervalli m<><6D>ritlemine. V<>iksem intervall- suurem CPU koormus."
msgid "Analyze stream"
msgstr "Voo anal<61><6C>s"
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
msgstr ""
msgstr "DVB voo bitikiiruse rehkendamise m<><6D>ritlemine."
msgid "Calculation interval [0.1s]"
msgstr "Kalkulatsiooni intervall [0,1s]"
msgstr "Arvutamise intervall [0,1s]"
msgid "Define an interval for calculation. The bigger interval generates more stable values."
msgstr ""
msgstr "Arvutamise intervalli m<><6D>ritlemine. Suurem intervall annab stabiilsemaid tulemusi."
msgid "Use SVDRP service"
msgstr ""
msgstr "SVDRP teenus"
msgid "Define whether the SVDRP service is used in client/server setups."
msgstr ""
msgstr "SVDRP teenuse klient/server seadete m<><6D>ritlemine."
msgid "SVDRP service port"
msgstr ""
msgstr "SVDRP port"
msgid "Define the port number of SVDRP service."
msgstr ""
msgstr "SVDRP teenuse pordi m<><6D>ritlemine."
msgid "SVDRP service IP"
msgstr ""
msgstr "SVDRP IP"
msgid "Define the IP address of SVDRP service."
msgstr ""
msgstr "SVDRP teenuse IP aadressi m<><6D>ritlemine."
msgid "Help"
msgstr ""
msgstr "Abi"
msgid "Video"
msgstr "Video"
@@ -169,13 +176,13 @@ msgid "Coderate"
msgstr "Coderate"
msgid "Stream Information"
msgstr "Voo info"
msgstr "Vooinfo"
msgid "Video Stream"
msgstr "Videovoog"
msgid "Codec"
msgstr ""
msgstr "Koodek"
msgid "Bitrate"
msgstr "Bitikiirus"
@@ -196,7 +203,7 @@ msgid "Audio Stream"
msgstr "Audiovoog"
msgid "Channel Mode"
msgstr ""
msgstr "Kanalimoodus"
msgid "Sampling Frequency"
msgstr "S<>mplimissagedus"
@@ -229,64 +236,67 @@ msgid "Fixed"
msgstr "Fikseeritud"
msgid "Analog"
msgstr ""
msgstr "Analoog"
msgid "MPEG-2"
msgstr ""
msgstr "MPEG-2"
msgid "H.264"
msgstr ""
msgstr "H.264"
msgid "MPEG-1 Layer I"
msgstr ""
msgstr "MPEG-1 Layet I"
msgid "MPEG-1 Layer II"
msgstr ""
msgstr "MPEG-1 Layer II"
msgid "MPEG-1 Layer III"
msgstr ""
msgstr "MPEG-1 Layer III"
msgid "MPEG-2 Layer I"
msgstr ""
msgstr "MPEG-2 Layer I"
msgid "MPEG-2 Layer II"
msgstr ""
msgstr "MPEG-2 Layer II"
msgid "MPEG-2 Layer III"
msgstr ""
msgstr "MPEG-2 Layer III"
msgid "HE-AAC"
msgstr ""
msgstr "HE-AAC"
msgid "LATM"
msgstr "LATM"
msgid "stereo"
msgstr ""
msgstr "stereo"
msgid "joint Stereo"
msgstr ""
msgstr "joint stereo"
msgid "dual"
msgstr ""
msgstr "duaalne"
msgid "mono"
msgstr ""
msgstr "mono"
msgid "interlaced"
msgstr ""
msgstr "<EFBFBD>lerealaotus"
msgid "progressive"
msgstr ""
msgstr "progressiivne"
msgid "reserved"
msgstr "reserveeritud"
msgstr "reserv."
msgid "extended"
msgstr ""
msgstr "laiendatud"
msgid "unknown"
msgstr "tundmatu"
msgid "component"
msgstr ""
msgstr "komponentne"
msgid "PAL"
msgstr "PAL"
@@ -295,10 +305,10 @@ msgid "NTSC"
msgstr "NTSC"
msgid "SECAM"
msgstr ""
msgstr "SECAM"
msgid "MAC"
msgstr ""
msgstr "MAC"
msgid "Hz"
msgstr "Hz"
@@ -331,10 +341,10 @@ msgid "Karaoke"
msgstr "Karaoke"
msgid "Ch1"
msgstr "Kan. 1"
msgstr "Kan.1"
msgid "Ch2"
msgstr "Kan. 2"
msgstr "Kan.2"
msgid "C"
msgstr "C"

View File

@@ -5,12 +5,13 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Project-Id-Version: vdr-femon 1.7.10\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
"Last-Translator: Rolf Ahrenberg\n"
"Language-Team: <vdr@linuxtv.org>\n"
"Language-Team: Finnish <vdr@linuxtv.org>\n"
"Language: fi\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -87,6 +88,12 @@ msgstr "Sijainti"
msgid "Define the position of OSD."
msgstr "Määrittele näytön sijainti."
msgid "Downscale OSD size [%]"
msgstr "Pienennä näytön kokoa [%]"
msgid "Define the downscale ratio for OSD size."
msgstr "Määrittele näytön pienennyssuhde."
msgid "Red limit [%]"
msgstr "Punaisen taso [%]"
@@ -258,6 +265,9 @@ msgstr "MPEG-2 kerros III"
msgid "HE-AAC"
msgstr "HE-AAC"
msgid "LATM"
msgstr "LATM"
msgid "stereo"
msgstr "stereo"

View File

@@ -5,12 +5,13 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2008-01-26 09:59+0100\n"
"Project-Id-Version: vdr-femon 1.7.10\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
"Last-Translator: NIVAL Micha<68>l <mnival@club-internet.fr>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"Language-Team: French <vdr@linuxtv.org>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -87,6 +88,12 @@ msgstr "Position"
msgid "Define the position of OSD."
msgstr "D<>finit la position de l'OSD."
msgid "Downscale OSD size [%]"
msgstr ""
msgid "Define the downscale ratio for OSD size."
msgstr ""
msgid "Red limit [%]"
msgstr "Limite du rouge (%)"
@@ -258,6 +265,9 @@ msgstr ""
msgid "HE-AAC"
msgstr ""
msgid "LATM"
msgstr ""
msgid "stereo"
msgstr ""

View File

@@ -6,15 +6,19 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2008-11-10 23:37+0100\n"
"Project-Id-Version: vdr-femon 1.7.10\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"Language-Team: Italian <vdr@linuxtv.org>\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-15\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-Language: Italian\n"
"X-Poedit-Country: ITALY\n"
"X-Poedit-SourceCharset: utf-8\n"
msgid "DVB Signal Information Monitor (OSD)"
msgstr "Mostra info segnale DVB (OSD)"
@@ -68,13 +72,13 @@ msgid "Hide main menu entry"
msgstr "Nascondi voce menu principale"
msgid "Define whether the main menu entry is hidden."
msgstr "Definisci se la voce del menu principale <EFBFBD> nascosta."
msgstr "Definisci se la voce del menu principale è nascosta."
msgid "Default display mode"
msgstr "Modalit<EFBFBD> visualizz. predefinita"
msgstr "Modalità visualizz. predefinita"
msgid "Define the default display mode at startup."
msgstr "Definisci la modalit<EFBFBD> di visualizz. predefinita all'avvio."
msgstr "Definisci la modalità di visualizz. predefinita all'avvio."
msgid "Define the used OSD skin."
msgstr "Definisci lo stile interfaccia OSD utilizzato."
@@ -88,6 +92,12 @@ msgstr "Posizione"
msgid "Define the position of OSD."
msgstr "Definisci la posizione dell'OSD."
msgid "Downscale OSD size [%]"
msgstr "Riduci dimensione OSD [%]"
msgid "Define the downscale ratio for OSD size."
msgstr "Definisci il rapporto di riduzione della dimensione OSD."
msgid "Red limit [%]"
msgstr "Limite rosso [%]"
@@ -104,19 +114,19 @@ msgid "OSD update interval [0.1s]"
msgstr "Intervallo agg. OSD [0.1s]"
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
msgstr "Definisci un intervallo per gli agg. OSD. Pi<EFBFBD> piccolo <EFBFBD> l'intervallo maggiore sar<EFBFBD> l'uso di CPU."
msgstr "Definisci un intervallo per gli agg. OSD. Più piccolo è l'intervallo maggiore sarà l'uso di CPU."
msgid "Analyze stream"
msgstr "Analizza flusso"
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
msgstr "Definisci se il flusso DVB <EFBFBD> analizzato e i bitrate calcolati."
msgstr "Definisci se il flusso DVB è analizzato e i bitrate calcolati."
msgid "Calculation interval [0.1s]"
msgstr "Intervallo di calcolo [0.1s]"
msgid "Define an interval for calculation. The bigger interval generates more stable values."
msgstr "Definisci un intervallo di calcolo. L'intervallo pi<EFBFBD> grande genera valori pi<EFBFBD> stabili."
msgstr "Definisci un intervallo di calcolo. L'intervallo più grande genera valori più stabili."
msgid "Use SVDRP service"
msgstr "Utilizza servizio SVDRP"
@@ -197,7 +207,7 @@ msgid "Audio Stream"
msgstr "Flusso audio"
msgid "Channel Mode"
msgstr "Modalit<EFBFBD> canale"
msgstr "Modalità canale"
msgid "Sampling Frequency"
msgstr "Frequenza campionamento"
@@ -206,10 +216,10 @@ msgid "AC-3 Stream"
msgstr "Flusso AC-3"
msgid "Bit Stream Mode"
msgstr "Modalit<EFBFBD> bitstream"
msgstr "Modalità bitstream"
msgid "Audio Coding Mode"
msgstr "Modalit<EFBFBD> codifica audio"
msgstr "Modalità codifica audio"
msgid "Center Mix Level"
msgstr "Livello sonoro centrale"
@@ -218,7 +228,7 @@ msgid "Surround Mix Level"
msgstr "Livello sonoro surround"
msgid "Dolby Surround Mode"
msgstr "Modalit<EFBFBD> Dolby Surround"
msgstr "Modalità Dolby Surround"
msgid "Low Frequency Effects"
msgstr "Effetti bassa frequenza"
@@ -259,6 +269,9 @@ msgstr "MPEG-2 Layer III"
msgid "HE-AAC"
msgstr "HE-AAC"
msgid "LATM"
msgstr "LATM"
msgid "stereo"
msgstr "stereo"

383
po/lt_LT.po Normal file
View File

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

View File

@@ -5,12 +5,13 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Project-Id-Version: vdr-femon 1.7.10\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
"Last-Translator: Vyacheslav Dikonov\n"
"Language-Team: <vdr@linuxtv.org>\n"
"Language-Team: Russian <vdr@linuxtv.org>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-5\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -87,6 +88,12 @@ msgstr "
msgid "Define the position of OSD."
msgstr ""
msgid "Downscale OSD size [%]"
msgstr ""
msgid "Define the downscale ratio for OSD size."
msgstr ""
msgid "Red limit [%]"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> (%)"
@@ -258,6 +265,9 @@ msgstr ""
msgid "HE-AAC"
msgstr ""
msgid "LATM"
msgstr ""
msgid "stereo"
msgstr ""

View File

@@ -5,12 +5,13 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2009-09-21 21:36+0800\n"
"Project-Id-Version: vdr-femon 1.7.10\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
"Last-Translator: NanFeng <nfgx@21cn.com>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -87,6 +88,12 @@ msgstr "位置"
msgid "Define the position of OSD."
msgstr "确定菜单的位置."
msgid "Downscale OSD size [%]"
msgstr ""
msgid "Define the downscale ratio for OSD size."
msgstr ""
msgid "Red limit [%]"
msgstr "红限制[ ]"
@@ -258,6 +265,9 @@ msgstr "MPEG-2 Layer III"
msgid "HE-AAC"
msgstr "HE-AAC"
msgid "LATM"
msgstr "LATM"
msgid "stereo"
msgstr "立体声"

View File

@@ -5,12 +5,13 @@
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2009-09-21 21:36+0800\n"
"Project-Id-Version: vdr-femon 1.7.10\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
"Last-Translator: NanFeng <nfgx@21cn.com>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"Language-Team: Chinese (traditional) <vdr@linuxtv.org>\n"
"Language: zh_TW\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -87,6 +88,12 @@ msgstr "位置"
msgid "Define the position of OSD."
msgstr "確定菜單的位置."
msgid "Downscale OSD size [%]"
msgstr ""
msgid "Define the downscale ratio for OSD size."
msgstr ""
msgid "Red limit [%]"
msgstr "紅限制[ ]"
@@ -258,6 +265,9 @@ msgstr "MPEG-2 Layer III"
msgid "HE-AAC"
msgstr "HE-AAC"
msgid "LATM"
msgstr "LATM"
msgid "stereo"
msgstr "立體聲"

23
symbols/format1080i.xpm Normal file
View File

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

23
symbols/format1080p.xpm Normal file
View File

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

23
symbols/format480i.xpm Normal file
View File

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

23
symbols/format480p.xpm Normal file
View File

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

23
symbols/format576i.xpm Normal file
View File

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

23
symbols/format576p.xpm Normal file
View File

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

23
symbols/format720i.xpm Normal file
View File

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

23
symbols/format720p.xpm Normal file
View File

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