mirror of
https://github.com/rofafor/vdr-plugin-femon.git
synced 2023-10-10 13:36:53 +02:00
Compare commits
No commits in common. "master" and "v2.2.1" have entirely different histories.
26
HISTORY
26
HISTORY
@ -525,29 +525,3 @@ VDR Plugin 'femon' Revision History
|
|||||||
- Got rid of FEMON_DEBUG.
|
- Got rid of FEMON_DEBUG.
|
||||||
- Added support for tracing modes.
|
- Added support for tracing modes.
|
||||||
- Removed the 'femonclient' plugin.
|
- Removed the 'femonclient' plugin.
|
||||||
|
|
||||||
|
|
||||||
===================================
|
|
||||||
VDR Plugin 'femon' Revision History
|
|
||||||
===================================
|
|
||||||
|
|
||||||
2017-06-24: Version 2.3.0
|
|
||||||
|
|
||||||
- Updated for vdr-2.3.7.
|
|
||||||
- Added support for H.265 video codec.
|
|
||||||
- Fixed frontend handling during a device switch.
|
|
||||||
- Added Polish translation (Thanks to Tomasz Nowak).
|
|
||||||
- Updated German translation (Thanks to Andreas Brachold).
|
|
||||||
|
|
||||||
|
|
||||||
===================================
|
|
||||||
VDR Plugin 'femon' Revision History
|
|
||||||
===================================
|
|
||||||
|
|
||||||
2018-04-15: Version 2.4.0
|
|
||||||
|
|
||||||
- Updated for vdr-2.4.0.
|
|
||||||
|
|
||||||
2019-xx-xx: Version 2.4.1
|
|
||||||
|
|
||||||
- Added signal level units (Thanks to Winfried).
|
|
||||||
|
29
Makefile
29
Makefile
@ -61,7 +61,7 @@ all-redirect: all
|
|||||||
|
|
||||||
### The object files (add further files here):
|
### The object files (add further files here):
|
||||||
|
|
||||||
OBJS = $(PLUGIN).o aac.o ac3.o config.o h264.o h265.o latm.o mpeg.o osd.o receiver.o setup.o symbol.o tools.o
|
OBJS = $(PLUGIN).o aac.o ac3.o config.o h264.o latm.o mpeg.o osd.o receiver.o setup.o symbol.o tools.o
|
||||||
|
|
||||||
### The main target:
|
### The main target:
|
||||||
|
|
||||||
@ -70,15 +70,14 @@ all: $(SOFILE) i18n
|
|||||||
### Implicit rules:
|
### Implicit rules:
|
||||||
|
|
||||||
%.o: %.c
|
%.o: %.c
|
||||||
@echo CC $@
|
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
|
||||||
|
|
||||||
### Dependencies:
|
### Dependencies:
|
||||||
|
|
||||||
MAKEDEP = $(CXX) -MM -MG
|
MAKEDEP = $(CXX) -MM -MG
|
||||||
DEPFILE = .dependencies
|
DEPFILE = .dependencies
|
||||||
$(DEPFILE): Makefile
|
$(DEPFILE): Makefile
|
||||||
$(Q)$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||||
|
|
||||||
-include $(DEPFILE)
|
-include $(DEPFILE)
|
||||||
|
|
||||||
@ -91,21 +90,17 @@ I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLU
|
|||||||
I18Npot = $(PODIR)/$(PLUGIN).pot
|
I18Npot = $(PODIR)/$(PLUGIN).pot
|
||||||
|
|
||||||
%.mo: %.po
|
%.mo: %.po
|
||||||
@echo MO $@
|
msgfmt -c -o $@ $<
|
||||||
$(Q)msgfmt -c -o $@ $<
|
|
||||||
|
|
||||||
$(I18Npot): $(wildcard *.c)
|
$(I18Npot): $(wildcard *.c)
|
||||||
@echo GT $@
|
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
|
||||||
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
|
|
||||||
|
|
||||||
%.po: $(I18Npot)
|
%.po: $(I18Npot)
|
||||||
@echo PO $@
|
msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
||||||
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
|
||||||
@touch $@
|
@touch $@
|
||||||
|
|
||||||
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
||||||
@echo IN $@
|
install -D -m644 $< $@
|
||||||
$(Q)install -D -m644 $< $@
|
|
||||||
|
|
||||||
.PHONY: i18n
|
.PHONY: i18n
|
||||||
i18n: $(I18Nmo) $(I18Npot)
|
i18n: $(I18Nmo) $(I18Npot)
|
||||||
@ -115,13 +110,11 @@ install-i18n: $(I18Nmsgs)
|
|||||||
### Targets:
|
### Targets:
|
||||||
|
|
||||||
$(SOFILE): $(OBJS)
|
$(SOFILE): $(OBJS)
|
||||||
@echo LD $@
|
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
@$(STRIP) $@
|
||||||
$(Q)$(STRIP) $@
|
|
||||||
|
|
||||||
install-lib: $(SOFILE)
|
install-lib: $(SOFILE)
|
||||||
@echo IN $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||||
$(Q)install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
|
||||||
|
|
||||||
install: install-lib install-i18n
|
install: install-lib install-i18n
|
||||||
|
|
||||||
@ -139,4 +132,4 @@ clean:
|
|||||||
|
|
||||||
.PHONY: cppcheck
|
.PHONY: cppcheck
|
||||||
cppcheck:
|
cppcheck:
|
||||||
$(Q)cppcheck --language=c++ --enable=all -v -f $(OBJS:%.o=%.c)
|
@cppcheck --language=c++ --enable=all -v -f $(OBJS:%.o=%.c)
|
||||||
|
11
README
11
README
@ -34,14 +34,15 @@ Terminology:
|
|||||||
|## Channel Name ################### [SVDRP][AR][VF][A/DD][D]|
|
|## Channel Name ################### [SVDRP][AR][VF][A/DD][D]|
|
||||||
|[=====Signal Strength ===================|=================]|
|
|[=====Signal Strength ===================|=================]|
|
||||||
|[=====Signal Quality ================|=====================]|
|
|[=====Signal Quality ================|=====================]|
|
||||||
| STR: 0 CNR: 0 BER: 0 PER: 0 Video: 0 Audio: 0 |
|
| STR: #0000 (0%) BER: #00000000 Video: 0 Mbit/s |
|
||||||
|
| SNR: #0000 (0%) UNC: #00000000 Audio: 0 kbit/s |
|
||||||
| [LOCK] [SIGNAL] [CARRIER] [VITERBI] [SYNC] |
|
| [LOCK] [SIGNAL] [CARRIER] [VITERBI] [SYNC] |
|
||||||
--------------------------------------------------------------
|
--------------------------------------------------------------
|
||||||
|
|
||||||
STR - Signal strength in dBm/dBuV/dbV
|
STR - Signal strength from driver
|
||||||
CNR - Signal-to-noise ratio of the main carrier in dB
|
SNR - Signal-to-noise ratio from driver
|
||||||
BER - Bit error rate after the forward error correction (FEC) done by inner code block
|
BER - Bit error rate
|
||||||
PER - Block error rate after the outer forward error correction coding
|
UNC - Uncorrected blocks
|
||||||
Video - Calculated video bitrate in Mbit/s
|
Video - Calculated video bitrate in Mbit/s
|
||||||
Audio - Calculated audio / AC-3 bitrate in kbit/s
|
Audio - Calculated audio / AC-3 bitrate in kbit/s
|
||||||
|
|
||||||
|
1
config.c
1
config.c
@ -20,7 +20,6 @@ cFemonConfig::cFemonConfig()
|
|||||||
themeM(0),
|
themeM(0),
|
||||||
positionM(1),
|
positionM(1),
|
||||||
downscaleM(0),
|
downscaleM(0),
|
||||||
signalUnitM(0),
|
|
||||||
redLimitM(33),
|
redLimitM(33),
|
||||||
greenLimitM(66),
|
greenLimitM(66),
|
||||||
updateIntervalM(5),
|
updateIntervalM(5),
|
||||||
|
11
config.h
11
config.h
@ -19,14 +19,6 @@ enum eFemonModes
|
|||||||
eFemonModeMaxNumber
|
eFemonModeMaxNumber
|
||||||
};
|
};
|
||||||
|
|
||||||
enum eFemonSignalUnit
|
|
||||||
{
|
|
||||||
eFemonSignalUnitdBm,
|
|
||||||
eFemonSignalUnitdBuV,
|
|
||||||
eFemonSignalUnitdBV,
|
|
||||||
eFemonSignalUnitMaxNumber
|
|
||||||
};
|
|
||||||
|
|
||||||
class cFemonConfig
|
class cFemonConfig
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
@ -37,7 +29,6 @@ private:
|
|||||||
int themeM;
|
int themeM;
|
||||||
int positionM;
|
int positionM;
|
||||||
int downscaleM;
|
int downscaleM;
|
||||||
int signalUnitM;
|
|
||||||
int redLimitM;
|
int redLimitM;
|
||||||
int greenLimitM;
|
int greenLimitM;
|
||||||
int updateIntervalM;
|
int updateIntervalM;
|
||||||
@ -77,7 +68,6 @@ public:
|
|||||||
int GetTheme(void) const { return themeM; }
|
int GetTheme(void) const { return themeM; }
|
||||||
int GetPosition(void) const { return positionM; }
|
int GetPosition(void) const { return positionM; }
|
||||||
int GetDownscale(void) const { return downscaleM; }
|
int GetDownscale(void) const { return downscaleM; }
|
||||||
int GetSignalUnit(void) const { return signalUnitM; }
|
|
||||||
int GetRedLimit(void) const { return redLimitM; }
|
int GetRedLimit(void) const { return redLimitM; }
|
||||||
int GetGreenLimit(void) const { return greenLimitM; }
|
int GetGreenLimit(void) const { return greenLimitM; }
|
||||||
int GetUpdateInterval(void) const { return updateIntervalM; }
|
int GetUpdateInterval(void) const { return updateIntervalM; }
|
||||||
@ -94,7 +84,6 @@ public:
|
|||||||
void SetTheme(int themeP) { themeM = themeP; }
|
void SetTheme(int themeP) { themeM = themeP; }
|
||||||
void SetPosition(int positionP) { positionM = positionP; }
|
void SetPosition(int positionP) { positionM = positionP; }
|
||||||
void SetDownscale(int downscaleP) { downscaleM = downscaleP; }
|
void SetDownscale(int downscaleP) { downscaleM = downscaleP; }
|
||||||
void SetSignalUnit(int signalUnitP) { signalUnitM = signalUnitP; }
|
|
||||||
void SetRedLimit(int redLimitP) { redLimitM = redLimitP; }
|
void SetRedLimit(int redLimitP) { redLimitM = redLimitP; }
|
||||||
void SetGreenLimit(int greenLimitP) { greenLimitM = greenLimitP; }
|
void SetGreenLimit(int greenLimitP) { greenLimitM = greenLimitP; }
|
||||||
void SetUpdateInterval(int updateIntervalP) { updateIntervalM = updateIntervalP; }
|
void SetUpdateInterval(int updateIntervalP) { updateIntervalM = updateIntervalP; }
|
||||||
|
51
femon.c
51
femon.c
@ -17,15 +17,15 @@
|
|||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
|
|
||||||
#if defined(APIVERSNUM) && APIVERSNUM < 20400
|
#if defined(APIVERSNUM) && APIVERSNUM < 20200
|
||||||
#error "VDR-2.4.0 API version or greater is required!"
|
#error "VDR-2.2.0 API version or greater is required!"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef GITVERSION
|
#ifndef GITVERSION
|
||||||
#define GITVERSION ""
|
#define GITVERSION ""
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static const char VERSION[] = "2.4.1" GITVERSION;
|
static const char VERSION[] = "2.2.1" GITVERSION;
|
||||||
static const char DESCRIPTION[] = trNOOP("DVB Signal Information Monitor (OSD)");
|
static const char DESCRIPTION[] = trNOOP("DVB Signal Information Monitor (OSD)");
|
||||||
static const char MAINMENUENTRY[] = trNOOP("Signal Information");
|
static const char MAINMENUENTRY[] = trNOOP("Signal Information");
|
||||||
|
|
||||||
@ -120,8 +120,7 @@ cOsdObject *cPluginFemon::MainMenuAction(void)
|
|||||||
{
|
{
|
||||||
// Perform the action when selected from the main VDR menu.
|
// Perform the action when selected from the main VDR menu.
|
||||||
debug1("%s", __PRETTY_FUNCTION__);
|
debug1("%s", __PRETTY_FUNCTION__);
|
||||||
LOCK_CHANNELS_READ;
|
if (cControl::Control() || (Channels.Count() <= 0))
|
||||||
if (cControl::Control() || (Channels->Count() <= 0))
|
|
||||||
Skins.Message(mtInfo, tr("Femon not available"));
|
Skins.Message(mtInfo, tr("Femon not available"));
|
||||||
else
|
else
|
||||||
return cFemonOsd::Instance(true);
|
return cFemonOsd::Instance(true);
|
||||||
@ -165,8 +164,6 @@ bool cPluginFemon::SetupParse(const char *nameP, const char *valueP)
|
|||||||
FemonConfig.SetSvdrpPort(atoi(valueP));
|
FemonConfig.SetSvdrpPort(atoi(valueP));
|
||||||
else if (!strcasecmp(nameP, "ServerIp"))
|
else if (!strcasecmp(nameP, "ServerIp"))
|
||||||
FemonConfig.SetSvdrpIp(valueP);
|
FemonConfig.SetSvdrpIp(valueP);
|
||||||
else if (!strcasecmp(nameP, "SignalUnit"))
|
|
||||||
FemonConfig.SetSignalUnit(atoi(valueP));
|
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -175,18 +172,18 @@ bool cPluginFemon::SetupParse(const char *nameP, const char *valueP)
|
|||||||
|
|
||||||
bool cPluginFemon::Service(const char *idP, void *dataP)
|
bool cPluginFemon::Service(const char *idP, void *dataP)
|
||||||
{
|
{
|
||||||
if (strcmp(idP, "FemonService-v1.1") == 0) {
|
if (strcmp(idP, "FemonService-v1.0") == 0) {
|
||||||
if (dataP) {
|
if (dataP) {
|
||||||
FemonService_v1_1 *data = reinterpret_cast<FemonService_v1_1*>(dataP);
|
FemonService_v1_0 *data = reinterpret_cast<FemonService_v1_0*>(dataP);
|
||||||
cDevice *dev = cDevice::ActualDevice();
|
if (!cDevice::ActualDevice())
|
||||||
if (!dev)
|
|
||||||
return false;
|
return false;
|
||||||
|
cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice());
|
||||||
data->fe_name = getFrontendName(dev);
|
data->fe_name = getFrontendName(dev);
|
||||||
data->fe_status = getFrontendStatus(dev);
|
data->fe_status = getFrontendStatus(dev);
|
||||||
data->fe_cnr = getCNR(dev);
|
data->fe_snr = getSNR(dev);
|
||||||
data->fe_signal = getSignal(dev);
|
data->fe_signal = getSignal(dev);
|
||||||
data->fe_ber = getBER(dev);
|
data->fe_ber = getBER(dev);
|
||||||
data->fe_per = getPER(dev);
|
data->fe_unc = getUNC(dev);
|
||||||
data->video_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetVideoBitrate() : 0.0;
|
data->video_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetVideoBitrate() : 0.0;
|
||||||
data->audio_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetAudioBitrate() : 0.0;
|
data->audio_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetAudioBitrate() : 0.0;
|
||||||
data->dolby_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetDolbyBitrate() : 0.0;
|
data->dolby_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetDolbyBitrate() : 0.0;
|
||||||
@ -220,12 +217,12 @@ const char **cPluginFemon::SVDRPHelpPages(void)
|
|||||||
" Print the signal quality.",
|
" Print the signal quality.",
|
||||||
"SGNL <card index>\n"
|
"SGNL <card index>\n"
|
||||||
" Print the signal strength from driver.",
|
" Print the signal strength from driver.",
|
||||||
"CNRA <card index>\n"
|
"SNRA <card index>\n"
|
||||||
" Print the carrier-to-noise ratio from driver.",
|
" Print the signal-to-noise ratio from driver.",
|
||||||
"BERA <card index>\n"
|
"BERA <card index>\n"
|
||||||
" Print the bit error rate from driver.",
|
" Print the bit error rate.",
|
||||||
"PERA <card index>\n"
|
"UNCB <card index>\n"
|
||||||
" Print the packet error rate from driver.",
|
" Print the uncorrected blocks rate.",
|
||||||
"VIBR\n"
|
"VIBR\n"
|
||||||
" Print the current video bitrate [Mbit/s].",
|
" Print the current video bitrate [Mbit/s].",
|
||||||
"AUBR\n"
|
"AUBR\n"
|
||||||
@ -241,14 +238,14 @@ const char **cPluginFemon::SVDRPHelpPages(void)
|
|||||||
|
|
||||||
cString cPluginFemon::SVDRPCommand(const char *commandP, const char *optionP, int &replyCodeP)
|
cString cPluginFemon::SVDRPCommand(const char *commandP, const char *optionP, int &replyCodeP)
|
||||||
{
|
{
|
||||||
cDevice *dev = cDevice::ActualDevice();
|
cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice());
|
||||||
if (strcasecmp(commandP, "TRAC") == 0) {
|
if (strcasecmp(commandP, "TRAC") == 0) {
|
||||||
if (optionP && *optionP)
|
if (optionP && *optionP)
|
||||||
FemonConfig.SetTraceMode(strtol(optionP, NULL, 0));
|
FemonConfig.SetTraceMode(strtol(optionP, NULL, 0));
|
||||||
return cString::sprintf("Tracing mode: 0x%04X\n", FemonConfig.GetTraceMode());
|
return cString::sprintf("Tracing mode: 0x%04X\n", FemonConfig.GetTraceMode());
|
||||||
}
|
}
|
||||||
if (*optionP && isnumber(optionP)) {
|
if (*optionP && isnumber(optionP)) {
|
||||||
cDevice *dev2 = cDevice::GetDevice(int(strtol(optionP, NULL, 10)));
|
cDvbDevice *dev2 = dynamic_cast<cDvbDevice*>(cDevice::GetDevice(int(strtol(optionP, NULL, 10))));
|
||||||
if (dev2)
|
if (dev2)
|
||||||
dev = dev2;
|
dev = dev2;
|
||||||
}
|
}
|
||||||
@ -294,16 +291,18 @@ cString cPluginFemon::SVDRPCommand(const char *commandP, const char *optionP, in
|
|||||||
return cString::sprintf("%d on device #%d", dev->SignalQuality(), dev->CardIndex());
|
return cString::sprintf("%d on device #%d", dev->SignalQuality(), dev->CardIndex());
|
||||||
}
|
}
|
||||||
else if (strcasecmp(commandP, "SGNL") == 0) {
|
else if (strcasecmp(commandP, "SGNL") == 0) {
|
||||||
return cString::sprintf("%s on device #%d", *getSignalStrength(getSignal(dev)), dev->CardIndex());
|
int value = getSignal(dev);
|
||||||
|
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, dev->CardIndex());
|
||||||
}
|
}
|
||||||
else if (strcasecmp(commandP, "CNRA") == 0) {
|
else if (strcasecmp(commandP, "SNRA") == 0) {
|
||||||
return cString::sprintf("%.2f dB on device #%d", getCNR(dev), dev->CardIndex());
|
int value = getSNR(dev);
|
||||||
|
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, dev->CardIndex());
|
||||||
}
|
}
|
||||||
else if (strcasecmp(commandP, "BERA") == 0) {
|
else if (strcasecmp(commandP, "BERA") == 0) {
|
||||||
return cString::sprintf("%.0f on device #%d", getBER(dev), dev->CardIndex());
|
return cString::sprintf("%08X on device #%d", getBER(dev), dev->CardIndex());
|
||||||
}
|
}
|
||||||
else if (strcasecmp(commandP, "PERA") == 0) {
|
else if (strcasecmp(commandP, "UNCB") == 0) {
|
||||||
return cString::sprintf("%.0f on device #%d", getPER(dev), dev->CardIndex());
|
return cString::sprintf("%08X on device #%d", getUNC(dev), dev->CardIndex());
|
||||||
}
|
}
|
||||||
else if (strcasecmp(commandP, "VIBR") == 0) {
|
else if (strcasecmp(commandP, "VIBR") == 0) {
|
||||||
if (cFemonOsd::Instance())
|
if (cFemonOsd::Instance())
|
||||||
|
@ -8,13 +8,15 @@
|
|||||||
#ifndef __FEMONSERVICE_H
|
#ifndef __FEMONSERVICE_H
|
||||||
#define __FEMONSERVICE_H
|
#define __FEMONSERVICE_H
|
||||||
|
|
||||||
struct FemonService_v1_1 {
|
#include <linux/dvb/frontend.h>
|
||||||
|
|
||||||
|
struct FemonService_v1_0 {
|
||||||
cString fe_name;
|
cString fe_name;
|
||||||
cString fe_status;
|
cString fe_status;
|
||||||
double fe_cnr;
|
uint16_t fe_snr;
|
||||||
double fe_signal;
|
uint16_t fe_signal;
|
||||||
double fe_ber;
|
uint32_t fe_ber;
|
||||||
double fe_per;
|
uint32_t fe_unc;
|
||||||
double video_bitrate;
|
double video_bitrate;
|
||||||
double audio_bitrate;
|
double audio_bitrate;
|
||||||
double dolby_bitrate;
|
double dolby_bitrate;
|
||||||
|
24
h264.c
24
h264.c
@ -203,19 +203,21 @@ int cFemonH264::nalUnescape(uint8_t *dstP, const uint8_t *srcP, int lenP)
|
|||||||
{
|
{
|
||||||
int s = 0, d = 0;
|
int s = 0, d = 0;
|
||||||
|
|
||||||
while (s < lenP - 3) {
|
while (s < lenP) {
|
||||||
if (!srcP[s] && !srcP[s + 1] && srcP[s + 2] == 3) {
|
if (!srcP[s] && !srcP[s + 1]) {
|
||||||
dstP[d++] = srcP[s++];
|
// hit 00 00 xx
|
||||||
dstP[d++] = srcP[s++];
|
dstP[d] = dstP[d + 1] = 0;
|
||||||
s++; // skip emulation_prevention_three_byte
|
s += 2;
|
||||||
|
d += 2;
|
||||||
|
if (srcP[s] == 3) {
|
||||||
|
s++; // 00 00 03 xx --> 00 00 xx
|
||||||
|
if (s >= lenP)
|
||||||
|
return d;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
dstP[d++] = srcP[s++];
|
dstP[d++] = srcP[s++];
|
||||||
}
|
}
|
||||||
|
|
||||||
while (s < lenP)
|
|
||||||
dstP[d++] = srcP[s++];
|
|
||||||
|
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -551,7 +553,7 @@ int cFemonH264::parseSPS(const uint8_t *bufP, int lenP)
|
|||||||
if (bs.GetBit()) { // video_signal_type_present_flag
|
if (bs.GetBit()) { // video_signal_type_present_flag
|
||||||
uint32_t video_format;
|
uint32_t video_format;
|
||||||
video_format = bs.GetBits(3); // video_format
|
video_format = bs.GetBits(3); // video_format
|
||||||
if (video_format < ELEMENTS(videoFormatS)) {
|
if (video_format < sizeof(videoFormatS) / sizeof(videoFormatS[0])) {
|
||||||
format = videoFormatS[video_format];
|
format = videoFormatS[video_format];
|
||||||
debug2("%s video_format=%d", __PRETTY_FUNCTION__, format);
|
debug2("%s video_format=%d", __PRETTY_FUNCTION__, format);
|
||||||
}
|
}
|
||||||
@ -666,7 +668,7 @@ int cFemonH264::parseSEI(const uint8_t *bufP, int lenP)
|
|||||||
if (picStructPresentFlagM) { // pic_struct_present_flag
|
if (picStructPresentFlagM) { // pic_struct_present_flag
|
||||||
uint32_t pic_struct, ct_type = 0, i = 0;
|
uint32_t pic_struct, ct_type = 0, i = 0;
|
||||||
pic_struct = bs.GetBits(4); // pic_struct
|
pic_struct = bs.GetBits(4); // pic_struct
|
||||||
if (pic_struct >= ELEMENTS(seiNumClockTsTableS))
|
if (pic_struct >= (sizeof(seiNumClockTsTableS)) / sizeof(seiNumClockTsTableS[0]))
|
||||||
return 0;
|
return 0;
|
||||||
if (frameMbsOnlyFlagM && !mbAdaptiveFrameFieldFlagM)
|
if (frameMbsOnlyFlagM && !mbAdaptiveFrameFieldFlagM)
|
||||||
scan = VIDEO_SCAN_PROGRESSIVE;
|
scan = VIDEO_SCAN_PROGRESSIVE;
|
||||||
|
715
h265.c
715
h265.c
@ -1,715 +0,0 @@
|
|||||||
/*
|
|
||||||
* h265.c: Frontend Status Monitor plugin for the Video Disk Recorder
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "log.h"
|
|
||||||
#include "tools.h"
|
|
||||||
#include "h265.h"
|
|
||||||
|
|
||||||
const cFemonH265::t_DAR cFemonH265::darS[] =
|
|
||||||
{
|
|
||||||
{ VIDEO_ASPECT_RATIO_1_1, 100 },
|
|
||||||
{ VIDEO_ASPECT_RATIO_4_3, 133 },
|
|
||||||
{ VIDEO_ASPECT_RATIO_16_9, 177 },
|
|
||||||
{ VIDEO_ASPECT_RATIO_2_21_1, 221 },
|
|
||||||
{ VIDEO_ASPECT_RATIO_12_11, 109 },
|
|
||||||
{ VIDEO_ASPECT_RATIO_10_11, 90 },
|
|
||||||
{ VIDEO_ASPECT_RATIO_16_11, 145 },
|
|
||||||
{ VIDEO_ASPECT_RATIO_40_33, 121 },
|
|
||||||
{ VIDEO_ASPECT_RATIO_24_11, 218 },
|
|
||||||
{ VIDEO_ASPECT_RATIO_20_11, 181 },
|
|
||||||
{ VIDEO_ASPECT_RATIO_32_11, 290 },
|
|
||||||
{ VIDEO_ASPECT_RATIO_80_33, 242 },
|
|
||||||
{ VIDEO_ASPECT_RATIO_18_11, 163 },
|
|
||||||
{ VIDEO_ASPECT_RATIO_15_11, 136 },
|
|
||||||
{ VIDEO_ASPECT_RATIO_64_33, 193 },
|
|
||||||
{ VIDEO_ASPECT_RATIO_160_99, 161 },
|
|
||||||
{ VIDEO_ASPECT_RATIO_3_2, 150 },
|
|
||||||
{ VIDEO_ASPECT_RATIO_2_1, 200 }
|
|
||||||
};
|
|
||||||
|
|
||||||
const cFemonH265::t_SAR cFemonH265::sarS[] =
|
|
||||||
{
|
|
||||||
{ 0, 0 }, // VIDEO_ASPECT_RATIO_INVALID
|
|
||||||
{ 1, 1 }, // VIDEO_ASPECT_RATIO_1_1
|
|
||||||
{ 12, 11 }, // VIDEO_ASPECT_RATIO_12_11
|
|
||||||
{ 10, 11 }, // VIDEO_ASPECT_RATIO_10_11
|
|
||||||
{ 16, 11 }, // VIDEO_ASPECT_RATIO_16_11
|
|
||||||
{ 40, 33 }, // VIDEO_ASPECT_RATIO_40_33
|
|
||||||
{ 24, 11 }, // VIDEO_ASPECT_RATIO_24_11
|
|
||||||
{ 20, 11 }, // VIDEO_ASPECT_RATIO_20_11
|
|
||||||
{ 32, 11 }, // VIDEO_ASPECT_RATIO_32_11
|
|
||||||
{ 80, 33 }, // VIDEO_ASPECT_RATIO_80_33
|
|
||||||
{ 18, 11 }, // VIDEO_ASPECT_RATIO_18_11
|
|
||||||
{ 15, 11 }, // VIDEO_ASPECT_RATIO_15_11
|
|
||||||
{ 64, 33 }, // VIDEO_ASPECT_RATIO_64_33
|
|
||||||
{ 160, 99 }, // VIDEO_ASPECT_RATIO_160_99
|
|
||||||
{ 4, 3 }, // VIDEO_ASPECT_RATIO_4_3
|
|
||||||
{ 3, 2 }, // VIDEO_ASPECT_RATIO_3_2
|
|
||||||
{ 2, 1 } // VIDEO_ASPECT_RATIO_2_1
|
|
||||||
};
|
|
||||||
|
|
||||||
const eVideoFormat cFemonH265::videoFormatS[] =
|
|
||||||
{
|
|
||||||
VIDEO_FORMAT_COMPONENT,
|
|
||||||
VIDEO_FORMAT_PAL,
|
|
||||||
VIDEO_FORMAT_NTSC,
|
|
||||||
VIDEO_FORMAT_SECAM,
|
|
||||||
VIDEO_FORMAT_MAC,
|
|
||||||
VIDEO_FORMAT_UNKNOWN,
|
|
||||||
VIDEO_FORMAT_RESERVED,
|
|
||||||
VIDEO_FORMAT_RESERVED
|
|
||||||
};
|
|
||||||
|
|
||||||
cFemonH265::cFemonH265(cFemonVideoIf *videoHandlerP)
|
|
||||||
: videoHandlerM(videoHandlerP),
|
|
||||||
widthM(0),
|
|
||||||
heightM(0),
|
|
||||||
aspectRatioM(VIDEO_ASPECT_RATIO_INVALID),
|
|
||||||
formatM(VIDEO_FORMAT_INVALID),
|
|
||||||
frameRateM(0),
|
|
||||||
bitRateM(0),
|
|
||||||
scanM(VIDEO_SCAN_INVALID),
|
|
||||||
frameFieldInfoPresentFlagM(false)
|
|
||||||
{
|
|
||||||
reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
cFemonH265::~cFemonH265()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
bool cFemonH265::processVideo(const uint8_t *bufP, int lenP)
|
|
||||||
{
|
|
||||||
uint8_t nal_data[lenP];
|
|
||||||
bool aud_found = false, sps_found = false, sei_found = true; // SEI temporarily disabled!
|
|
||||||
const uint8_t *buf = bufP;
|
|
||||||
const uint8_t *start = buf;
|
|
||||||
const uint8_t *end = start + lenP;
|
|
||||||
|
|
||||||
if (!videoHandlerM)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// skip PES header
|
|
||||||
if (!PesLongEnough(lenP))
|
|
||||||
return false;
|
|
||||||
buf += PesPayloadOffset(buf);
|
|
||||||
start = buf;
|
|
||||||
|
|
||||||
reset();
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
int consumed = 0;
|
|
||||||
|
|
||||||
buf = nextStartCode(buf, end);
|
|
||||||
if (buf >= end)
|
|
||||||
break;
|
|
||||||
|
|
||||||
switch ((buf[3] >> 1) & 0x3F) {
|
|
||||||
case NAL_AUD:
|
|
||||||
if (!aud_found) {
|
|
||||||
debug2("%s Found NAL AUD at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP);
|
|
||||||
aud_found = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NAL_SPS:
|
|
||||||
if (!sps_found) {
|
|
||||||
debug2("%s Found NAL SPS at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP);
|
|
||||||
int nal_len = nalUnescape(nal_data, buf + 5, int(end - buf - 5));
|
|
||||||
consumed = parseSPS(nal_data, nal_len);
|
|
||||||
if (consumed > 0)
|
|
||||||
sps_found = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case NAL_SEI:
|
|
||||||
if (!sei_found) {
|
|
||||||
debug2("%s Found NAL SEI at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP);
|
|
||||||
int nal_len = nalUnescape(nal_data, buf + 5, int(end - buf - 5));
|
|
||||||
consumed = parseSEI(nal_data, nal_len);
|
|
||||||
if (consumed > 0)
|
|
||||||
sei_found = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aud_found && sps_found && sei_found)
|
|
||||||
break;
|
|
||||||
|
|
||||||
buf += consumed + 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aud_found) {
|
|
||||||
videoHandlerM->SetVideoCodec(VIDEO_CODEC_H265);
|
|
||||||
if (sps_found) {
|
|
||||||
debug2("%s width=%d height=%d, aspect=%d format=%d bitrate=%.0f", __PRETTY_FUNCTION__, widthM, heightM, aspectRatioM, formatM, bitRateM);
|
|
||||||
videoHandlerM->SetVideoSize(widthM, heightM);
|
|
||||||
videoHandlerM->SetVideoFormat(formatM);
|
|
||||||
videoHandlerM->SetVideoAspectRatio(aspectRatioM);
|
|
||||||
videoHandlerM->SetVideoBitrate(bitRateM);
|
|
||||||
}
|
|
||||||
if (sps_found || sei_found) {
|
|
||||||
debug2("%s scan=%d framerate=%.2f", __PRETTY_FUNCTION__, scanM, frameRateM);
|
|
||||||
videoHandlerM->SetVideoScan(scanM);
|
|
||||||
videoHandlerM->SetVideoFramerate(frameRateM);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return sps_found;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cFemonH265::reset()
|
|
||||||
{
|
|
||||||
frameFieldInfoPresentFlagM = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const uint8_t *cFemonH265::nextStartCode(const uint8_t *startP, const uint8_t *endP)
|
|
||||||
{
|
|
||||||
for (endP -= 3; startP < endP; ++startP) {
|
|
||||||
if ((startP[0] == 0x00) && (startP[1] == 0x00) && (startP[2] == 0x01))
|
|
||||||
return startP;
|
|
||||||
}
|
|
||||||
return (endP + 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
int cFemonH265::nalUnescape(uint8_t *dstP, const uint8_t *srcP, int lenP)
|
|
||||||
{
|
|
||||||
int s = 0, d = 0;
|
|
||||||
|
|
||||||
while (s < lenP - 3) {
|
|
||||||
if (!srcP[s] && !srcP[s + 1] && srcP[s + 2] == 3) {
|
|
||||||
dstP[d++] = srcP[s++];
|
|
||||||
dstP[d++] = srcP[s++];
|
|
||||||
s++; // skip emulation_prevention_three_byte
|
|
||||||
}
|
|
||||||
else
|
|
||||||
dstP[d++] = srcP[s++];
|
|
||||||
}
|
|
||||||
|
|
||||||
while (s < lenP)
|
|
||||||
dstP[d++] = srcP[s++];
|
|
||||||
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
int cFemonH265::parseSPS(const uint8_t *bufP, int lenP)
|
|
||||||
{
|
|
||||||
cFemonBitStream bs(bufP, lenP);
|
|
||||||
|
|
||||||
uint32_t width = widthM;
|
|
||||||
uint32_t height = heightM;
|
|
||||||
eVideoFormat format = formatM;
|
|
||||||
eVideoAspectRatio aspect_ratio = aspectRatioM;
|
|
||||||
eVideoScan scan = scanM;
|
|
||||||
double frame_rate = frameRateM;
|
|
||||||
double bit_rate = bitRateM;
|
|
||||||
bool frame_field_info_present_flag = frameFieldInfoPresentFlagM;
|
|
||||||
|
|
||||||
const char *profile_name = NULL;
|
|
||||||
bool general_tier_flag, conformance_window_flag, sps_sub_layer_ordering_info_present_flag, profilePresentFlag = true;
|
|
||||||
bool general_max_12bit_constraint_flag = false, general_max_10bit_constraint_flag = false, general_max_8bit_constraint_flag = false;
|
|
||||||
bool general_max_422chroma_constraint_flag = false, general_max_420chroma_constraint_flag = false, general_max_monochrome_constraint_flag = false;
|
|
||||||
bool general_intra_constraint_flag = false, general_one_picture_only_constraint_flag = false, general_lower_bit_rate_constraint_flag = false;
|
|
||||||
bool general_progressive_source_flag, general_interlaced_source_flag, general_profile_compatibility_flag[32];
|
|
||||||
uint32_t chroma_format_idc, log2_max_pic_order_cnt_lsb_minus4, num_short_term_ref_pic_sets, num_long_term_ref_pics_sps;
|
|
||||||
uint8_t sps_max_sub_layers_minus1, sub_layer_profile_present_flag[8], sub_layer_level_present_flag[8], general_profile_idc, general_level_idc;
|
|
||||||
|
|
||||||
bs.SkipBits(4); // sps_video_parameter_set_id
|
|
||||||
sps_max_sub_layers_minus1 = bs.GetBits(3); // sps_max_sub_layers_minus1
|
|
||||||
bs.SkipBit(); // sps_temporal_id_nesting_flag
|
|
||||||
// start of profile_tier_level(1, sps_max_sub_layers_minus1)
|
|
||||||
if (profilePresentFlag) {
|
|
||||||
bs.SkipBits(2); // general_profile_space
|
|
||||||
general_tier_flag = bs.GetBit(); // general_tier_flag
|
|
||||||
general_profile_idc = bs.GetBits(5); // general_profile_idc
|
|
||||||
for (int i = 0; i < 32; ++i) {
|
|
||||||
general_profile_compatibility_flag[i] = bs.GetBit(); // general_profile_compatibility_flag[i]
|
|
||||||
}
|
|
||||||
general_progressive_source_flag = bs.GetBit(); // general_progressive_source_flag
|
|
||||||
general_interlaced_source_flag = bs.GetBit(); // general_interlaced_source_flag
|
|
||||||
if (general_progressive_source_flag && !general_interlaced_source_flag)
|
|
||||||
scan = VIDEO_SCAN_PROGRESSIVE;
|
|
||||||
else if (!general_progressive_source_flag && general_interlaced_source_flag)
|
|
||||||
scan = VIDEO_SCAN_INTERLACED;
|
|
||||||
else if (!general_progressive_source_flag && !general_interlaced_source_flag)
|
|
||||||
scan = VIDEO_SCAN_UNKNOWN;
|
|
||||||
else
|
|
||||||
scan = VIDEO_SCAN_INVALID;
|
|
||||||
debug2("%s general_progressive_source_flag=%d general_interlaced_source_flag=%d scan_type=%d", __PRETTY_FUNCTION__, general_progressive_source_flag, general_interlaced_source_flag, scan);
|
|
||||||
bs.SkipBit(); // general_non_packed_constraint_flag
|
|
||||||
bs.SkipBit(); // general_frame_only_constraint_flag
|
|
||||||
if (general_profile_idc == 4 || general_profile_compatibility_flag[4] ||
|
|
||||||
general_profile_idc == 5 || general_profile_compatibility_flag[5] ||
|
|
||||||
general_profile_idc == 6 || general_profile_compatibility_flag[6] ||
|
|
||||||
general_profile_idc == 7 || general_profile_compatibility_flag[7]) {
|
|
||||||
// the number of bits in this syntax structure is not affected by this condition
|
|
||||||
general_max_12bit_constraint_flag = bs.GetBit(); // general_max_12bit_constraint_flag
|
|
||||||
general_max_10bit_constraint_flag = bs.GetBit(); // general_max_10bit_constraint_flag
|
|
||||||
general_max_8bit_constraint_flag = bs.GetBit(); // general_max_8bit_constraint_flag
|
|
||||||
debug2("%s general_max_12bit_constraint_flag=%d general_max_10bit_constraint_flag=%d general_max_8bit_constraint_flag=%d", __PRETTY_FUNCTION__, general_max_12bit_constraint_flag, general_max_10bit_constraint_flag, general_max_8bit_constraint_flag);
|
|
||||||
general_max_422chroma_constraint_flag = bs.GetBit(); // general_max_422chroma_constraint_flag
|
|
||||||
general_max_420chroma_constraint_flag = bs.GetBit(); // general_max_420chroma_constraint_flag
|
|
||||||
general_max_monochrome_constraint_flag = bs.GetBit(); // general_max_monochrome_constraint_flag
|
|
||||||
debug2("%s general_max_422chroma_constraint_flag=%d general_max_420chroma_constraint_flag=%d general_max_monochrome_constraint_flag=%d", __PRETTY_FUNCTION__, general_max_422chroma_constraint_flag, general_max_420chroma_constraint_flag, general_max_monochrome_constraint_flag);
|
|
||||||
general_intra_constraint_flag = bs.GetBit(); // general_intra_constraint_flag
|
|
||||||
general_one_picture_only_constraint_flag = bs.GetBit(); // general_one_picture_only_constraint_flag
|
|
||||||
general_lower_bit_rate_constraint_flag = bs.GetBit(); // general_lower_bit_rate_constraint_flag
|
|
||||||
debug2("%s general_intra_constraint_flag=%d general_one_picture_only_constraint_flag=%d general_lower_bit_rate_constraint_flag=%d", __PRETTY_FUNCTION__, general_intra_constraint_flag, general_one_picture_only_constraint_flag, general_lower_bit_rate_constraint_flag);
|
|
||||||
bs.SkipBits(34); // general_reserved_zero_34bits
|
|
||||||
}
|
|
||||||
else
|
|
||||||
bs.SkipBits(43); // general_reserved_zero_43bits
|
|
||||||
// the number of bits in this syntax structure is not affected by this condition
|
|
||||||
bs.SkipBit(); // general_reserved_zero_bit
|
|
||||||
}
|
|
||||||
general_level_idc = bs.GetBits(8); // general_level_idc
|
|
||||||
debug2("%s general_profile_idc=%d general_tier_flag=%d general_level_idc=%d", __PRETTY_FUNCTION__, general_profile_idc, general_tier_flag, general_level_idc);
|
|
||||||
switch (general_profile_idc) {
|
|
||||||
default:
|
|
||||||
case 0:
|
|
||||||
profile_name = "None";
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
profile_name = "Main";
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
profile_name = "Main 10";
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
profile_name = "Main Still Picture";
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
profile_name = "Format Range Extensions";
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
profile_name = "Format Range Extensions High Throughput";
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (general_profile_idc == 1 || general_profile_idc == 2)
|
|
||||||
switch (general_level_idc) {
|
|
||||||
case 30: // level 1
|
|
||||||
bit_rate = general_tier_flag ? 0 : 128000;
|
|
||||||
break;
|
|
||||||
case 60: // level 2
|
|
||||||
bit_rate = general_tier_flag ? 0 : 1500000;
|
|
||||||
break;
|
|
||||||
case 63: // level 2.1
|
|
||||||
bit_rate = general_tier_flag ? 0 : 3000000;
|
|
||||||
break;
|
|
||||||
case 90: // level 3
|
|
||||||
bit_rate = general_tier_flag ? 0 : 6000000;
|
|
||||||
break;
|
|
||||||
case 93: // level 3
|
|
||||||
bit_rate = general_tier_flag ? 0 : 10000000;
|
|
||||||
break;
|
|
||||||
case 120: // level 4
|
|
||||||
bit_rate = general_tier_flag ? 30000000 : 12000000;
|
|
||||||
break;
|
|
||||||
case 123: // level 4.1
|
|
||||||
bit_rate = general_tier_flag ? 50000000 : 20000000;
|
|
||||||
break;
|
|
||||||
case 150: // level 5
|
|
||||||
bit_rate = general_tier_flag ? 100000000 : 25000000;
|
|
||||||
break;
|
|
||||||
case 153: // level 5.1
|
|
||||||
bit_rate = general_tier_flag ? 160000000 : 40000000;
|
|
||||||
break;
|
|
||||||
case 156: // level 5.2
|
|
||||||
bit_rate = general_tier_flag ? 240000000 : 60000000;
|
|
||||||
break;
|
|
||||||
case 180: // level 6
|
|
||||||
bit_rate = general_tier_flag ? 240000000 : 60000000;
|
|
||||||
break;
|
|
||||||
case 183: // level 6.1
|
|
||||||
bit_rate = general_tier_flag ? 480000000 : 120000000;
|
|
||||||
break;
|
|
||||||
case 186: // level 6.2
|
|
||||||
bit_rate = general_tier_flag ? 800000000 : 240000000;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
bit_rate = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
bit_rate = 0;
|
|
||||||
debug2("%s profile=\"%s@L%.1f@%s\" bit_rate=%.f", __PRETTY_FUNCTION__, profile_name, (double)general_level_idc / 30, general_tier_flag ? "High" : "Main", bit_rate);
|
|
||||||
for (int i = 0; i < sps_max_sub_layers_minus1; ++i) {
|
|
||||||
sub_layer_profile_present_flag[i] = bs.GetBit(); // sub_layer_profile_present_flag[i]
|
|
||||||
sub_layer_level_present_flag[i] = bs.GetBit(); // sub_layer_level_present_flag[i]
|
|
||||||
}
|
|
||||||
if (sps_max_sub_layers_minus1 > 0) {
|
|
||||||
for (int i = sps_max_sub_layers_minus1; i < 8; ++i)
|
|
||||||
bs.SkipBits(2); // reserved_zero_2bits[i]
|
|
||||||
}
|
|
||||||
for (int i = 0; i < sps_max_sub_layers_minus1; ++i) {
|
|
||||||
if (sub_layer_profile_present_flag[i]) {
|
|
||||||
bs.SkipBits(2); // sub_layer_profile_space[i]
|
|
||||||
bs.SkipBit(); // sub_layer_tier_flag[i]
|
|
||||||
bs.SkipBits(5); // sub_layer_profile_idc[i]
|
|
||||||
bs.SkipBits(32); // sub_layer_profile_compatibility_flag[i][0-31]
|
|
||||||
bs.SkipBit(); // sub_layer_progressive_source_flag[i]
|
|
||||||
bs.SkipBit(); // sub_layer_interlaced_source_flag[i]
|
|
||||||
bs.SkipBit(); // sub_layer_non_packed_constraint_flag[i]
|
|
||||||
bs.SkipBit(); // sub_layer_frame_only_constraint_flag[i]
|
|
||||||
// the number of bits in this syntax structure is not affected by this condition
|
|
||||||
bs.SkipBits(43); // sub_layer_reserved_zero_43bits[i]
|
|
||||||
// the number of bits in this syntax structure is not affected by this condition
|
|
||||||
bs.SkipBit(); // sub_layer_reserved_zero_bit[i]
|
|
||||||
}
|
|
||||||
if (sub_layer_level_present_flag[i])
|
|
||||||
bs.SkipBits(8); // sub_layer_level_idc[i]
|
|
||||||
}
|
|
||||||
// end of profile_tier_level
|
|
||||||
bs.SkipUeGolomb(); // sps_seq_parameter_set_id
|
|
||||||
chroma_format_idc = bs.GetUeGolomb(); // chroma_format_idc
|
|
||||||
if (chroma_format_idc == 3)
|
|
||||||
bs.SkipBit(); // separate_colour_plane_flag
|
|
||||||
width = bs.GetUeGolomb(); // pic_width_in_luma_samples
|
|
||||||
height = bs.GetUeGolomb(); // pic_height_in_luma_samples
|
|
||||||
|
|
||||||
conformance_window_flag = bs.GetBit(); // conformance_window_flag
|
|
||||||
if (conformance_window_flag) {
|
|
||||||
bs.SkipUeGolomb(); // conf_win_left_offset
|
|
||||||
bs.SkipUeGolomb(); // conf_win_right_offset
|
|
||||||
bs.SkipUeGolomb(); // conf_win_top_offset
|
|
||||||
bs.SkipUeGolomb(); // conf_win_bottom_offset
|
|
||||||
}
|
|
||||||
bs.SkipUeGolomb(); // bit_depth_luma_minus8
|
|
||||||
bs.SkipUeGolomb(); // bit_depth_chroma_minus8
|
|
||||||
log2_max_pic_order_cnt_lsb_minus4 = bs.GetUeGolomb(); // log2_max_pic_order_cnt_lsb_minus4
|
|
||||||
sps_sub_layer_ordering_info_present_flag = bs.GetBit(); // sps_sub_layer_ordering_info_present_flag
|
|
||||||
for (int i = (sps_sub_layer_ordering_info_present_flag ? 0 : sps_max_sub_layers_minus1); i <= sps_max_sub_layers_minus1; ++i) {
|
|
||||||
bs.SkipUeGolomb(); // sps_max_dec_pic_buffering_minus1[i]
|
|
||||||
bs.SkipUeGolomb(); // sps_max_num_reorder_pics[i]
|
|
||||||
bs.SkipUeGolomb(); // sps_max_latency_increase_plus1[i]
|
|
||||||
}
|
|
||||||
bs.SkipUeGolomb(); // log2_min_luma_coding_block_size_minus3
|
|
||||||
bs.SkipUeGolomb(); // log2_diff_max_min_luma_coding_block_size
|
|
||||||
bs.SkipUeGolomb(); // log2_min_luma_transform_block_size_minus2
|
|
||||||
bs.SkipUeGolomb(); // log2_diff_max_min_luma_transform_block_size
|
|
||||||
bs.SkipUeGolomb(); // max_transform_hierarchy_depth_inter
|
|
||||||
bs.SkipUeGolomb(); // max_transform_hierarchy_depth_intra
|
|
||||||
if (bs.GetBit()) { // scaling_list_enabled_flag
|
|
||||||
if (bs.GetBit()) { // sps_scaling_list_data_present_flag
|
|
||||||
// start of scaling_list_data()
|
|
||||||
for (int sizeId = 0; sizeId < 4; ++sizeId) {
|
|
||||||
for (int matrixId = 0; matrixId < 6; matrixId += (sizeId == 3) ? 3 : 1) {
|
|
||||||
if (!bs.GetBit()) // scaling_list_pred_mode_flag[sizeId][matrixId]
|
|
||||||
bs.SkipUeGolomb(); // scaling_list_pred_matrix_id_delta[sizeId][matrixId]
|
|
||||||
else {
|
|
||||||
int coefNum = min(64, (1 << (4 + (sizeId << 1))));
|
|
||||||
if (sizeId > 1)
|
|
||||||
bs.SkipSeGolomb(); // scaling_list_dc_coef_minus8[sizeId−2][matrixId]
|
|
||||||
for (int i = 0; i < coefNum; ++i)
|
|
||||||
bs.SkipSeGolomb(); // scaling_list_delta_coef
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// end of scaling_list_data()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bs.SkipBit(); // amp_enabled_flag
|
|
||||||
bs.SkipBit(); // sample_adaptive_offset_enabled_flag
|
|
||||||
if (bs.GetBit()) { // pcm_enabled_flag
|
|
||||||
bs.SkipBits(4); // pcm_sample_bit_depth_luma_minus1
|
|
||||||
bs.SkipBits(4); // pcm_sample_bit_depth_chroma_minus1
|
|
||||||
bs.SkipUeGolomb(); // log2_min_pcm_luma_coding_block_size_minus3
|
|
||||||
bs.SkipUeGolomb(); // log2_diff_max_min_pcm_luma_coding_block_size
|
|
||||||
bs.SkipBit(); // pcm_loop_filter_disabled_flag
|
|
||||||
}
|
|
||||||
num_short_term_ref_pic_sets = bs.GetUeGolomb(); // num_short_term_ref_pic_sets
|
|
||||||
uint32_t NumDeltaPocs[num_short_term_ref_pic_sets];
|
|
||||||
for (uint32_t stRpsIdx = 0; stRpsIdx < num_short_term_ref_pic_sets; ++stRpsIdx) {
|
|
||||||
// start of st_ref_pic_set(stRpsIdx)
|
|
||||||
bool inter_ref_pic_set_prediction_flag = false;
|
|
||||||
if (stRpsIdx != 0)
|
|
||||||
inter_ref_pic_set_prediction_flag = bs.GetBit(); // inter_ref_pic_set_prediction_flag
|
|
||||||
if (inter_ref_pic_set_prediction_flag) {
|
|
||||||
uint32_t RefRpsIdx, delta_idx_minus1 = 0;
|
|
||||||
if (stRpsIdx == num_short_term_ref_pic_sets)
|
|
||||||
delta_idx_minus1 = bs.GetUeGolomb(); // delta_idx_minus1
|
|
||||||
bs.SkipBit(); // delta_rps_sign
|
|
||||||
bs.SkipUeGolomb(); // abs_delta_rps_minus1
|
|
||||||
RefRpsIdx = stRpsIdx - (delta_idx_minus1 + 1);
|
|
||||||
NumDeltaPocs[stRpsIdx] = 0;
|
|
||||||
for (uint32_t j = 0; j <= NumDeltaPocs[RefRpsIdx]; ++j) {
|
|
||||||
if (!bs.GetBit()) { // used_by_curr_pic_flag[j]
|
|
||||||
if (bs.GetBit()) // use_delta_flag[j]
|
|
||||||
NumDeltaPocs[stRpsIdx]++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
NumDeltaPocs[stRpsIdx]++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
uint32_t num_negative_pics = bs.GetUeGolomb(); // num_negative_pics
|
|
||||||
uint32_t num_positive_pics = bs.GetUeGolomb(); // num_positive_pics
|
|
||||||
for (uint32_t j = 0; j < num_negative_pics; ++j) {
|
|
||||||
bs.SkipUeGolomb(); // delta_poc_s0_minus1[i]
|
|
||||||
bs.SkipBit(); // used_by_curr_pic_s0_flag[i]
|
|
||||||
}
|
|
||||||
for (uint32_t j = 0; j < num_positive_pics; ++j) {
|
|
||||||
bs.SkipUeGolomb(); // delta_poc_s1_minus1[i]
|
|
||||||
bs.SkipBit(); // delta_poc_s1_minus1[i]
|
|
||||||
}
|
|
||||||
NumDeltaPocs[stRpsIdx] = num_negative_pics + num_positive_pics;
|
|
||||||
}
|
|
||||||
// end of st_ref_pic_set(stRpsIdx)
|
|
||||||
}
|
|
||||||
if (bs.GetBit()) { // long_term_ref_pics_present_flag
|
|
||||||
num_long_term_ref_pics_sps = bs.GetUeGolomb(); // num_long_term_ref_pics_sps
|
|
||||||
for (uint32_t i = 0; i < num_long_term_ref_pics_sps; ++i) {
|
|
||||||
bs.SkipBits(log2_max_pic_order_cnt_lsb_minus4 + 4); // lt_ref_pic_poc_lsb_sps[i]
|
|
||||||
bs.SkipBit(); // used_by_curr_pic_lt_sps_flag[i]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bs.SkipBit(); // sps_temporal_mvp_enabled_flag
|
|
||||||
bs.SkipBit(); // strong_intra_smoothing_enabled_flag
|
|
||||||
if (bs.GetBit()) { // vui_parameters_present_flag
|
|
||||||
// start of vui_parameters()
|
|
||||||
if (bs.GetBit()) { // aspect_ratio_info_present_flag
|
|
||||||
uint32_t sar_width = 0, sar_height = 0;
|
|
||||||
uint8_t aspect_ratio_idc = bs.GetBits(8); // aspect_ratio_idc
|
|
||||||
debug2("%s aspect_ratio_idc=%d", __PRETTY_FUNCTION__, aspect_ratio_idc);
|
|
||||||
if (aspect_ratio_idc == 255) { // EXTENDED_SAR
|
|
||||||
sar_width = bs.GetBits(16); // sar_width
|
|
||||||
sar_height = bs.GetBits(16); // sar_height
|
|
||||||
}
|
|
||||||
else if (aspect_ratio_idc < ELEMENTS(sarS)) {
|
|
||||||
sar_width = sarS[aspect_ratio_idc].w;
|
|
||||||
sar_height = sarS[aspect_ratio_idc].h;
|
|
||||||
}
|
|
||||||
if (sar_width && sar_height) {
|
|
||||||
int index = -1, ratio = int(100.0L * sar_width * width / sar_height / height);
|
|
||||||
for (unsigned int i = 0; i < ELEMENTS(darS); ++i) {
|
|
||||||
if (darS[i].ratio == ratio) {
|
|
||||||
index = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (index < 0) {
|
|
||||||
if (aspect_ratio_idc == 255)
|
|
||||||
aspect_ratio = VIDEO_ASPECT_RATIO_EXTENDED;
|
|
||||||
else
|
|
||||||
aspect_ratio = VIDEO_ASPECT_RATIO_INVALID;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
aspect_ratio = darS[index].dar;
|
|
||||||
debug2("%s sar_width=%d sar_height=%d aspect_ratio=%d", __PRETTY_FUNCTION__, sar_width, sar_height, aspect_ratio);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (bs.GetBit()) // overscan_info_present_flag
|
|
||||||
bs.SkipBit(); // overscan_appropriate_flag
|
|
||||||
if (bs.GetBit()) { // video_signal_type_present_flag
|
|
||||||
uint32_t video_format = bs.GetBits(3); // video_format
|
|
||||||
if (video_format < ELEMENTS(videoFormatS)) {
|
|
||||||
format = videoFormatS[video_format];
|
|
||||||
debug2("%s video_format=%d format=%d", __PRETTY_FUNCTION__, video_format, 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_coeffs
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (bs.GetBit()) { // chroma_loc_info_present_flag
|
|
||||||
bs.SkipUeGolomb(); // chroma_sample_loc_type_top_field
|
|
||||||
bs.SkipUeGolomb(); // chroma_sample_loc_type_bottom_field
|
|
||||||
}
|
|
||||||
bs.SkipBit(); // neutral_chroma_indication_flag
|
|
||||||
bs.SkipBit(); // field_seq_flag
|
|
||||||
frame_field_info_present_flag = bs.GetBit(); // frame_field_info_present_flag
|
|
||||||
debug2("%s frame_field_info_present_flag=%d", __PRETTY_FUNCTION__, frame_field_info_present_flag);
|
|
||||||
if (bs.GetBit()) { // default_display_window_flag
|
|
||||||
bs.SkipUeGolomb(); // def_disp_win_left_offset
|
|
||||||
bs.SkipUeGolomb(); // def_disp_win_right_offset
|
|
||||||
bs.SkipUeGolomb(); // def_disp_win_top_offset
|
|
||||||
bs.SkipUeGolomb(); // def_disp_win_bottom_offset
|
|
||||||
}
|
|
||||||
if (bs.GetBit()) { // vui_timing_info_present_flag
|
|
||||||
uint32_t vui_num_units_in_tick = bs.GetBits(32); // vui_num_units_in_tick
|
|
||||||
uint32_t vui_time_scale = bs.GetBits(32); // vui_time_scale
|
|
||||||
if (vui_num_units_in_tick > 0) {
|
|
||||||
frame_rate = (double)vui_time_scale / vui_num_units_in_tick;
|
|
||||||
debug2("%s frame_rate = vui_time_scale(%d) / vui_num_units_in_tick(%d) = %.f", __PRETTY_FUNCTION__, vui_time_scale, vui_num_units_in_tick, frame_rate);
|
|
||||||
}
|
|
||||||
if (bs.GetBit()) // vui_poc_proportional_to_timing_flag
|
|
||||||
bs.SkipUeGolomb(); // vui_num_ticks_poc_diff_one_minus1
|
|
||||||
if (bs.GetBit()) { // vui_hrd_parameters_present_flag
|
|
||||||
// start of hrd_parameters(1, sps_max_sub_layers_minus1)
|
|
||||||
uint32_t bit_rate_scale = 0;
|
|
||||||
bool commonInfPresentFlag = true, nal_hrd_parameters_present_flag = false, vcl_hrd_parameters_present_flag = false, sub_pic_hrd_params_present_flag = false;
|
|
||||||
if (commonInfPresentFlag) {
|
|
||||||
nal_hrd_parameters_present_flag = bs.GetBit(); // nal_hrd_parameters_present_flag
|
|
||||||
vcl_hrd_parameters_present_flag = bs.GetBit(); // vcl_hrd_parameters_present_flag
|
|
||||||
if (nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag) {
|
|
||||||
sub_pic_hrd_params_present_flag = bs.GetBit(); // sub_pic_hrd_params_present_flag
|
|
||||||
if (sub_pic_hrd_params_present_flag) {
|
|
||||||
bs.SkipBits(8); // tick_divisor_minus2
|
|
||||||
bs.SkipBits(5); // du_cpb_removal_delay_increment_length_minus1
|
|
||||||
bs.SkipBit(); // sub_pic_cpb_params_in_pic_timing_sei_flag
|
|
||||||
bs.SkipBits(5); // dpb_output_delay_du_length_minus1
|
|
||||||
}
|
|
||||||
bit_rate_scale = bs.GetBits(4); // bit_rate_scale
|
|
||||||
bs.SkipBits(4); // cpb_size_scale
|
|
||||||
if (sub_pic_hrd_params_present_flag)
|
|
||||||
bs.SkipBits(4); // cpb_size_du_scale
|
|
||||||
bs.SkipBits(5); // initial_cpb_removal_delay_length_minus1
|
|
||||||
bs.SkipBits(5); // au_cpb_removal_delay_length_minus1
|
|
||||||
bs.SkipBits(5); // dpb_output_delay_length_minus1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (uint32_t i = 0; i <= sps_max_sub_layers_minus1; ++i) {
|
|
||||||
bool fixed_pic_rate_within_cvs_flag = false, low_delay_hrd_flag = false;
|
|
||||||
uint32_t cpb_cnt_minus1 = 0;
|
|
||||||
if (!bs.GetBit()) // fixed_pic_rate_general_flag[i]
|
|
||||||
fixed_pic_rate_within_cvs_flag = bs.GetBit(); // fixed_pic_rate_within_cvs_flag[i]
|
|
||||||
if (fixed_pic_rate_within_cvs_flag)
|
|
||||||
bs.SkipUeGolomb(); // elemental_duration_in_tc_minus1[i]
|
|
||||||
else
|
|
||||||
low_delay_hrd_flag = bs.GetBit(); // low_delay_hrd_flag[i]
|
|
||||||
if (!low_delay_hrd_flag)
|
|
||||||
cpb_cnt_minus1 = bs.GetUeGolomb(); // cpb_cnt_minus1[i]
|
|
||||||
if (nal_hrd_parameters_present_flag) {
|
|
||||||
// start of sub_layer_hrd_parameters(i)
|
|
||||||
for (uint32_t i = 0; i <= cpb_cnt_minus1; ++i) {
|
|
||||||
uint32_t bit_rate_value_minus1;
|
|
||||||
bit_rate_value_minus1 = bs.GetUeGolomb(); // bit_rate_value_minus1[i]
|
|
||||||
bs.SkipUeGolomb(); // cpb_size_value_minus1[i]
|
|
||||||
if (sub_pic_hrd_params_present_flag) {
|
|
||||||
bs.SkipUeGolomb(); // cpb_size_du_value_minus1[i]
|
|
||||||
bs.SkipUeGolomb(); // bit_rate_du_value_minus1[i]
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
double bitrate = (double)((bit_rate_value_minus1 + 1) * pow(2.0, 6 + bit_rate_scale));
|
|
||||||
debug2("%s bit_rate_value_minus1(%u) + 1 * 2 ^ (6 + bit_rate_scale(%u)) = %.f", __PRETTY_FUNCTION__, bit_rate_value_minus1, bit_rate_scale, bitrate);
|
|
||||||
}
|
|
||||||
bs.SkipBit(); // cbr_flag[i]
|
|
||||||
}
|
|
||||||
// end of sub_layer_hrd_parameters(i)
|
|
||||||
}
|
|
||||||
if (vcl_hrd_parameters_present_flag) {
|
|
||||||
// start of sub_layer_hrd_parameters(i)
|
|
||||||
for (uint32_t i = 0; i <= cpb_cnt_minus1; ++i) {
|
|
||||||
bs.SkipUeGolomb(); // bit_rate_value_minus1[i]
|
|
||||||
bs.SkipUeGolomb(); // cpb_size_value_minus1[i]
|
|
||||||
if (sub_pic_hrd_params_present_flag) {
|
|
||||||
bs.SkipUeGolomb(); // cpb_size_du_value_minus1[i]
|
|
||||||
bs.SkipUeGolomb(); // bit_rate_du_value_minus1[i]
|
|
||||||
}
|
|
||||||
bs.SkipBit(); // cbr_flag[i]
|
|
||||||
}
|
|
||||||
// end of sub_layer_hrd_parameters(i)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// end of hrd_parameters(1, sps_max_sub_layers_minus1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (bs.GetBit()) { // bitstream_restriction_flag
|
|
||||||
bs.SkipBit(); // tiles_fixed_structure_flag
|
|
||||||
bs.SkipBit(); // motion_vectors_over_pic_boundaries_flag
|
|
||||||
bs.SkipBit(); // restricted_ref_pic_lists_flag
|
|
||||||
bs.SkipUeGolomb(); // min_spatial_segmentation_idc
|
|
||||||
bs.SkipUeGolomb(); // max_bytes_per_pic_denom
|
|
||||||
bs.SkipUeGolomb(); // max_bits_per_min_cu_denom
|
|
||||||
bs.SkipUeGolomb(); // log2_max_mv_length_horizontal
|
|
||||||
bs.SkipUeGolomb(); // log2_max_mv_length_vertical
|
|
||||||
}
|
|
||||||
// end of vui_parameters()
|
|
||||||
}
|
|
||||||
if (bs.GetBit()) { // sps_extension_present_flag
|
|
||||||
bs.SkipBit(); // sps_range_extension_flag
|
|
||||||
bs.SkipBit(); // sps_multilayer_extension_flag
|
|
||||||
bs.SkipBit(); // sps_3d_extension_flag
|
|
||||||
bs.SkipBits(5); // sps_extension_5bits
|
|
||||||
}
|
|
||||||
|
|
||||||
widthM = width;
|
|
||||||
heightM = height;
|
|
||||||
formatM = format;
|
|
||||||
aspectRatioM = aspect_ratio;
|
|
||||||
scanM = scan;
|
|
||||||
frameRateM = frame_rate;
|
|
||||||
bitRateM = bit_rate;
|
|
||||||
frameFieldInfoPresentFlagM = frame_field_info_present_flag;
|
|
||||||
|
|
||||||
return (bs.Index() / 8);
|
|
||||||
}
|
|
||||||
|
|
||||||
int cFemonH265::parseSEI(const uint8_t *bufP, int lenP)
|
|
||||||
{
|
|
||||||
cFemonBitStream bs(bufP, lenP);
|
|
||||||
|
|
||||||
eVideoScan scan = scanM;
|
|
||||||
|
|
||||||
while ((bs.Index() * 8 + 16) < lenP) { // sei_message
|
|
||||||
int len, lastByte, payloadSize = 0, payloadType = 0;
|
|
||||||
|
|
||||||
do {
|
|
||||||
lastByte = bs.GetBits(8) & 0xFF;
|
|
||||||
payloadType += lastByte;
|
|
||||||
} while (lastByte == 0xFF); // last_payload_type_byte
|
|
||||||
|
|
||||||
do {
|
|
||||||
lastByte = bs.GetBits(8) & 0xFF;
|
|
||||||
payloadSize += lastByte;
|
|
||||||
} while (lastByte == 0xFF); // last_payload_size_byte
|
|
||||||
|
|
||||||
switch (payloadType) { // sei_payload
|
|
||||||
case 1: // pic_timing
|
|
||||||
len = payloadSize * 8;
|
|
||||||
if (frameFieldInfoPresentFlagM) {
|
|
||||||
uint8_t pic_struct = bs.GetBits(4); // pic_struct
|
|
||||||
switch (pic_struct) {
|
|
||||||
case 0: // frame
|
|
||||||
case 7: // frame doubling
|
|
||||||
case 8: // frame tripling
|
|
||||||
scan = VIDEO_SCAN_PROGRESSIVE;
|
|
||||||
break;
|
|
||||||
case 1: // top
|
|
||||||
case 2: // bottom
|
|
||||||
case 3: // top bottom
|
|
||||||
case 4: // bottom top
|
|
||||||
case 5: // top bottom top
|
|
||||||
case 6: // bottom top bottom
|
|
||||||
case 9: // top paired with previous bottom
|
|
||||||
case 10: // bottom paired with previous top
|
|
||||||
case 11: // top paired with next bottom
|
|
||||||
case 12: // bottom paired with next top
|
|
||||||
scan = VIDEO_SCAN_INTERLACED;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
scan = VIDEO_SCAN_RESERVED;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
debug2("%s pic_struct=%d scan_type=%d", __PRETTY_FUNCTION__, pic_struct, scan);
|
|
||||||
bs.SkipBits(2); // source_scan_type
|
|
||||||
bs.SkipBit(); // duplicate_flag
|
|
||||||
len -= 7;
|
|
||||||
}
|
|
||||||
bs.SkipBits(len);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
bs.SkipBits(payloadSize * 8);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// force byte align
|
|
||||||
bs.ByteAlign();
|
|
||||||
}
|
|
||||||
|
|
||||||
scanM = scan;
|
|
||||||
|
|
||||||
return (bs.Index() / 8);
|
|
||||||
}
|
|
62
h265.h
62
h265.h
@ -1,62 +0,0 @@
|
|||||||
/*
|
|
||||||
* h265.h: Frontend Status Monitor plugin for the Video Disk Recorder
|
|
||||||
*
|
|
||||||
* See the README file for copyright information and how to reach the author.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __FEMON_H265_H
|
|
||||||
#define __FEMON_H265_H
|
|
||||||
|
|
||||||
#include "video.h"
|
|
||||||
|
|
||||||
class cFemonH265 {
|
|
||||||
private:
|
|
||||||
enum {
|
|
||||||
NAL_VPS = 32, // Video Parameter Set
|
|
||||||
NAL_SPS = 33, // Sequence Parameter Set
|
|
||||||
NAL_PPS = 34, // Picture Parameter Set
|
|
||||||
NAL_AUD = 35, // Access Unit Delimiter
|
|
||||||
NAL_EOS = 36, // End of Sequence
|
|
||||||
NAL_EOB = 37, // End of Bitstream
|
|
||||||
NAL_SEI = 39, // Prefix Supplemental Enchancement Information
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct DAR {
|
|
||||||
eVideoAspectRatio dar;
|
|
||||||
int ratio;
|
|
||||||
} t_DAR;
|
|
||||||
|
|
||||||
typedef struct SAR {
|
|
||||||
int w;
|
|
||||||
int h;
|
|
||||||
} t_SAR;
|
|
||||||
|
|
||||||
cFemonVideoIf *videoHandlerM;
|
|
||||||
uint32_t widthM;
|
|
||||||
uint32_t heightM;
|
|
||||||
eVideoAspectRatio aspectRatioM;
|
|
||||||
eVideoFormat formatM;
|
|
||||||
double frameRateM;
|
|
||||||
double bitRateM;
|
|
||||||
eVideoScan scanM;
|
|
||||||
bool frameFieldInfoPresentFlagM;
|
|
||||||
|
|
||||||
void reset();
|
|
||||||
const uint8_t *nextStartCode(const uint8_t *start, const uint8_t *end);
|
|
||||||
int nalUnescape(uint8_t *dst, const uint8_t *src, int len);
|
|
||||||
int parseSPS(const uint8_t *buf, int len);
|
|
||||||
int parseSEI(const uint8_t *buf, int len);
|
|
||||||
|
|
||||||
static const t_SAR sarS[];
|
|
||||||
static const t_DAR darS[];
|
|
||||||
static const eVideoFormat videoFormatS[];
|
|
||||||
|
|
||||||
public:
|
|
||||||
cFemonH265(cFemonVideoIf *videoHandlerP);
|
|
||||||
virtual ~cFemonH265();
|
|
||||||
|
|
||||||
bool processVideo(const uint8_t *bufP, int lenP);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif //__FEMON_H265_H
|
|
322
osd.c
322
osd.c
@ -27,7 +27,7 @@
|
|||||||
#define OSDHEIGHT osdHeightM // in pixels
|
#define OSDHEIGHT osdHeightM // in pixels
|
||||||
#define OSDROWHEIGHT fontM->Height() // in pixels
|
#define OSDROWHEIGHT fontM->Height() // in pixels
|
||||||
#define OSDINFOHEIGHT (OSDROWHEIGHT * 14) // in pixels (14 rows)
|
#define OSDINFOHEIGHT (OSDROWHEIGHT * 14) // in pixels (14 rows)
|
||||||
#define OSDSTATUSHEIGHT (OSDROWHEIGHT * 5) // in pixels (5 rows)
|
#define OSDSTATUSHEIGHT (OSDROWHEIGHT * 6) // in pixels (6 rows)
|
||||||
#define OSDSYMBOL(id) femonSymbols.Get(id)
|
#define OSDSYMBOL(id) femonSymbols.Get(id)
|
||||||
#define OSDSPACING femonSymbols.GetSpacing()
|
#define OSDSPACING femonSymbols.GetSpacing()
|
||||||
#define OSDROUNDING femonSymbols.GetRounding()
|
#define OSDROUNDING femonSymbols.GetRounding()
|
||||||
@ -39,11 +39,12 @@
|
|||||||
(col == 2) ? int(round(OSDWIDTH * 0.26)) : \
|
(col == 2) ? int(round(OSDWIDTH * 0.26)) : \
|
||||||
int(round(OSDWIDTH * 0.025)))
|
int(round(OSDWIDTH * 0.025)))
|
||||||
#define OSDSTATUSWIN_Y(offset) (FemonConfig.GetPosition() ? offset : (OSDHEIGHT - OSDSTATUSHEIGHT + offset))
|
#define OSDSTATUSWIN_Y(offset) (FemonConfig.GetPosition() ? offset : (OSDHEIGHT - OSDSTATUSHEIGHT + offset))
|
||||||
#define OSDSTATUSWIN_X(col) ((col == 6) ? int(round(OSDWIDTH * 0.84)) : \
|
#define OSDSTATUSWIN_X(col) ((col == 7) ? int(round(OSDWIDTH * 0.79)) : \
|
||||||
(col == 5) ? int(round(OSDWIDTH * 0.66)) : \
|
(col == 6) ? int(round(OSDWIDTH * 0.68)) : \
|
||||||
(col == 4) ? int(round(OSDWIDTH * 0.50)) : \
|
(col == 5) ? int(round(OSDWIDTH * 0.46)) : \
|
||||||
(col == 3) ? int(round(OSDWIDTH * 0.35)) : \
|
(col == 4) ? int(round(OSDWIDTH * 0.37)) : \
|
||||||
(col == 2) ? int(round(OSDWIDTH * 0.19)) : \
|
(col == 3) ? int(round(OSDWIDTH * 0.21)) : \
|
||||||
|
(col == 2) ? int(round(OSDWIDTH * 0.12)) : \
|
||||||
int(round(OSDWIDTH * 0.025)))
|
int(round(OSDWIDTH * 0.025)))
|
||||||
#define OSDSTATUSWIN_XSYMBOL(c,w) (c * ((OSDWIDTH - (5 * w)) / 6) + ((c - 1) * w))
|
#define OSDSTATUSWIN_XSYMBOL(c,w) (c * ((OSDWIDTH - (5 * w)) / 6) + ((c - 1) * w))
|
||||||
#define OSDBARWIDTH(x) (OSDWIDTH * x / 100)
|
#define OSDBARWIDTH(x) (OSDWIDTH * x / 100)
|
||||||
@ -59,13 +60,14 @@
|
|||||||
#define OSDDRAWSTATUSFRONTEND(column, bitmap, status) \
|
#define OSDDRAWSTATUSFRONTEND(column, bitmap, status) \
|
||||||
osdM->DrawBitmap(OSDSTATUSWIN_XSYMBOL(column, x), OSDSTATUSWIN_Y(offset) + y, bitmap, (frontendStatusM & status) ? FemonTheme[FemonConfig.GetTheme()].clrActiveText : FemonTheme[FemonConfig.GetTheme()].clrRed, FemonTheme[FemonConfig.GetTheme()].clrBackground)
|
osdM->DrawBitmap(OSDSTATUSWIN_XSYMBOL(column, x), OSDSTATUSWIN_Y(offset) + y, bitmap, (frontendStatusM & status) ? FemonTheme[FemonConfig.GetTheme()].clrActiveText : FemonTheme[FemonConfig.GetTheme()].clrRed, FemonTheme[FemonConfig.GetTheme()].clrBackground)
|
||||||
|
|
||||||
#define OSDDRAWSTATUSVALUES(label1, label2, label3, label4, label5, label6) \
|
#define OSDDRAWSTATUSVALUES(label1, label2, label3, label4, label5, label6, label7) \
|
||||||
osdM->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), label1, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \
|
osdM->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), label1, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \
|
||||||
osdM->DrawText(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), label2, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \
|
osdM->DrawText(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), label2, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \
|
||||||
osdM->DrawText(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), label3, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \
|
osdM->DrawText(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), label3, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \
|
||||||
osdM->DrawText(OSDSTATUSWIN_X(4), OSDSTATUSWIN_Y(offset), label4, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \
|
osdM->DrawText(OSDSTATUSWIN_X(4), OSDSTATUSWIN_Y(offset), label4, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \
|
||||||
osdM->DrawText(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), label5, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \
|
osdM->DrawText(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), label5, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \
|
||||||
osdM->DrawText(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), label6, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM)
|
osdM->DrawText(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), label6, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM); \
|
||||||
|
osdM->DrawText(OSDSTATUSWIN_X(7), OSDSTATUSWIN_Y(offset), label7, FemonTheme[FemonConfig.GetTheme()].clrInactiveText, FemonTheme[FemonConfig.GetTheme()].clrBackground, fontM)
|
||||||
|
|
||||||
#define OSDDRAWSTATUSBAR(value) \
|
#define OSDDRAWSTATUSBAR(value) \
|
||||||
if (value > 0) { \
|
if (value > 0) { \
|
||||||
@ -142,7 +144,6 @@
|
|||||||
|
|
||||||
class cFemonDummyFont : public cFont {
|
class cFemonDummyFont : public cFont {
|
||||||
public:
|
public:
|
||||||
virtual int Width(void) const { return 10; }
|
|
||||||
virtual int Width(uint cP) const { return 10; }
|
virtual int Width(uint cP) const { return 10; }
|
||||||
virtual int Width(const char *sP) const { return 50; }
|
virtual int Width(const char *sP) const { return 50; }
|
||||||
virtual int Height(void) const { return 20; }
|
virtual int Height(void) const { return 20; }
|
||||||
@ -166,6 +167,7 @@ cFemonOsd::cFemonOsd()
|
|||||||
: cOsdObject(true), cThread("femon osd"),
|
: cOsdObject(true), cThread("femon osd"),
|
||||||
osdM(NULL),
|
osdM(NULL),
|
||||||
receiverM(NULL),
|
receiverM(NULL),
|
||||||
|
frontendM(-1),
|
||||||
svdrpFrontendM(-1),
|
svdrpFrontendM(-1),
|
||||||
svdrpVideoBitRateM(-1),
|
svdrpVideoBitRateM(-1),
|
||||||
svdrpAudioBitRateM(-1),
|
svdrpAudioBitRateM(-1),
|
||||||
@ -176,17 +178,15 @@ cFemonOsd::cFemonOsd()
|
|||||||
qualityValidM(false),
|
qualityValidM(false),
|
||||||
strengthM(0),
|
strengthM(0),
|
||||||
strengthValidM(false),
|
strengthValidM(false),
|
||||||
cnrM(0),
|
snrM(0),
|
||||||
cnrValidM(false),
|
snrValidM(false),
|
||||||
signalM(0),
|
signalM(0),
|
||||||
signalValidM(false),
|
signalValidM(false),
|
||||||
berM(0),
|
berM(0),
|
||||||
berValidM(false),
|
berValidM(false),
|
||||||
perM(0),
|
uncM(0),
|
||||||
perValidM(false),
|
uncValidM(false),
|
||||||
frontendNameM(""),
|
frontendNameM(""),
|
||||||
frontendTypeM(""),
|
|
||||||
frontendStatusM(DTV_STAT_HAS_NONE),
|
|
||||||
frontendStatusValidM(false),
|
frontendStatusValidM(false),
|
||||||
deviceSourceM(DEVICESOURCE_DVBAPI),
|
deviceSourceM(DEVICESOURCE_DVBAPI),
|
||||||
displayModeM(FemonConfig.GetDisplayMode()),
|
displayModeM(FemonConfig.GetDisplayMode()),
|
||||||
@ -200,6 +200,8 @@ cFemonOsd::cFemonOsd()
|
|||||||
{
|
{
|
||||||
int tmp;
|
int tmp;
|
||||||
debug1("%s", __PRETTY_FUNCTION__);
|
debug1("%s", __PRETTY_FUNCTION__);
|
||||||
|
memset(&frontendStatusM, 0, sizeof(frontendStatusM));
|
||||||
|
memset(&frontendInfoM, 0, sizeof(frontendInfoM));
|
||||||
svdrpConnectionM.handle = -1;
|
svdrpConnectionM.handle = -1;
|
||||||
femonSymbols.Refresh();
|
femonSymbols.Refresh();
|
||||||
fontM = cFont::CreateFont(Setup.FontSml, constrain(Setup.FontSmlSize, MINFONTSIZE, MAXFONTSIZE));
|
fontM = cFont::CreateFont(Setup.FontSml, constrain(Setup.FontSmlSize, MINFONTSIZE, MAXFONTSIZE));
|
||||||
@ -238,14 +240,17 @@ cFemonOsd::~cFemonOsd(void)
|
|||||||
DELETENULL(osdM);
|
DELETENULL(osdM);
|
||||||
if (fontM)
|
if (fontM)
|
||||||
DELETENULL(fontM);
|
DELETENULL(fontM);
|
||||||
|
if (frontendM >= 0) {
|
||||||
|
close(frontendM);
|
||||||
|
frontendM = -1;
|
||||||
|
}
|
||||||
pInstanceS = NULL;
|
pInstanceS = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void cFemonOsd::DrawStatusWindow(void)
|
void cFemonOsd::DrawStatusWindow(void)
|
||||||
{
|
{
|
||||||
cMutexLock lock(&mutexM);
|
cMutexLock lock(&mutexM);
|
||||||
LOCK_CHANNELS_READ;
|
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||||
const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
|
|
||||||
|
|
||||||
if (osdM && channel) {
|
if (osdM && channel) {
|
||||||
cBitmap *bm = NULL;
|
cBitmap *bm = NULL;
|
||||||
@ -300,14 +305,7 @@ void cFemonOsd::DrawStatusWindow(void)
|
|||||||
OSDDRAWSTATUSBM(OSDSPACING);
|
OSDDRAWSTATUSBM(OSDSPACING);
|
||||||
}
|
}
|
||||||
if (receiverM) {
|
if (receiverM) {
|
||||||
if (IS_OSDRESOLUTION(receiverM->VideoVerticalSize(), 2160)) {
|
if (IS_OSDRESOLUTION(receiverM->VideoVerticalSize(), 1080)) {
|
||||||
switch (receiverM->VideoScan()) {
|
|
||||||
case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_2160i); break;
|
|
||||||
case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_2160p); break;
|
|
||||||
default: bm = &OSDSYMBOL(SYMBOL_FORMAT_2160); break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (IS_OSDRESOLUTION(receiverM->VideoVerticalSize(), 1080)) {
|
|
||||||
switch (receiverM->VideoScan()) {
|
switch (receiverM->VideoScan()) {
|
||||||
case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080i); break;
|
case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080i); break;
|
||||||
case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080p); break;
|
case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080p); break;
|
||||||
@ -341,7 +339,6 @@ void cFemonOsd::DrawStatusWindow(void)
|
|||||||
switch (receiverM->VideoCodec()) {
|
switch (receiverM->VideoCodec()) {
|
||||||
case VIDEO_CODEC_MPEG2: bm = &OSDSYMBOL(SYMBOL_MPEG2); break;
|
case VIDEO_CODEC_MPEG2: bm = &OSDSYMBOL(SYMBOL_MPEG2); break;
|
||||||
case VIDEO_CODEC_H264: bm = &OSDSYMBOL(SYMBOL_H264); break;
|
case VIDEO_CODEC_H264: bm = &OSDSYMBOL(SYMBOL_H264); break;
|
||||||
case VIDEO_CODEC_H265: bm = &OSDSYMBOL(SYMBOL_H265); break;
|
|
||||||
default: bm = NULL; break;
|
default: bm = NULL; break;
|
||||||
}
|
}
|
||||||
OSDDRAWSTATUSBM(OSDSPACING);
|
OSDDRAWSTATUSBM(OSDSPACING);
|
||||||
@ -371,22 +368,23 @@ void cFemonOsd::DrawStatusWindow(void)
|
|||||||
if (qualityValidM)
|
if (qualityValidM)
|
||||||
OSDDRAWSTATUSBAR(qualityM);
|
OSDDRAWSTATUSBAR(qualityM);
|
||||||
offset += OSDROWHEIGHT;
|
offset += OSDROWHEIGHT;
|
||||||
OSDDRAWSTATUSVALUES(signalValidM ? *cString::sprintf("STR: %s", *getSignalStrength(signalM)) : "STR: ---",
|
OSDDRAWSTATUSVALUES("STR:", signalValidM ? *cString::sprintf("%04x", signalM) : "", signalValidM ? *cString::sprintf("(%2d%%)", signalM / 655) : "",
|
||||||
cnrValidM ? *cString::sprintf("CNR: %.2f dB", cnrM) : "CNR: ---",
|
"BER:", berValidM ? *cString::sprintf("%08x", berM) : "", *cString::sprintf("%s:", tr("Video")),
|
||||||
berValidM ? *cString::sprintf("BER: %.0f", berM) : "BER: ---",
|
*getBitrateMbits(receiverM ? receiverM->VideoBitrate() : (svdrpFrontendM >= 0 ? svdrpVideoBitRateM : -1.0)));
|
||||||
perValidM ? *cString::sprintf("PER: %.0f", perM) : "PER: ---",
|
offset += OSDROWHEIGHT;
|
||||||
*cString::sprintf("%s: %s", tr("Video"), *getBitrateMbits(receiverM ? receiverM->VideoBitrate() : (svdrpFrontendM >= 0 ? svdrpVideoBitRateM : -1.0))),
|
OSDDRAWSTATUSVALUES("SNR:", snrValidM ? *cString::sprintf("%04x", snrM) : "", snrValidM ? *cString::sprintf("(%2d%%)", snrM / 655) : "",
|
||||||
*cString::sprintf("%s: %s", (receiverM && receiverM->AC3Valid() && IS_DOLBY_TRACK(track)) ? tr("AC-3") : tr("Audio"), *getBitrateKbits(receiverM ? ((receiverM->AC3Valid() && IS_DOLBY_TRACK(track)) ? receiverM->AC3Bitrate() : receiverM->AudioBitrate()) : (svdrpFrontendM >= 0 ? svdrpAudioBitRateM : -1.0)))
|
"UNC:", uncValidM ? *cString::sprintf("%08x", uncM) : "",
|
||||||
);
|
*cString::sprintf("%s:", (receiverM && receiverM->AC3Valid() && IS_DOLBY_TRACK(track)) ? tr("AC-3") : tr("Audio")),
|
||||||
|
*getBitrateKbits(receiverM ? ((receiverM->AC3Valid() && IS_DOLBY_TRACK(track)) ? receiverM->AC3Bitrate() : receiverM->AudioBitrate()) : (svdrpFrontendM >= 0 ? svdrpAudioBitRateM : -1.0)));
|
||||||
offset += OSDROWHEIGHT;
|
offset += OSDROWHEIGHT;
|
||||||
x = OSDSYMBOL(SYMBOL_LOCK).Width();
|
x = OSDSYMBOL(SYMBOL_LOCK).Width();
|
||||||
y = (OSDROWHEIGHT - OSDSYMBOL(SYMBOL_LOCK).Height()) / 2;
|
y = (OSDROWHEIGHT - OSDSYMBOL(SYMBOL_LOCK).Height()) / 2;
|
||||||
if (frontendStatusValidM) {
|
if (frontendStatusValidM) {
|
||||||
OSDDRAWSTATUSFRONTEND(1, OSDSYMBOL(SYMBOL_LOCK), DTV_STAT_HAS_LOCK);
|
OSDDRAWSTATUSFRONTEND(1, OSDSYMBOL(SYMBOL_LOCK), FE_HAS_LOCK);
|
||||||
OSDDRAWSTATUSFRONTEND(2, OSDSYMBOL(SYMBOL_SIGNAL), DTV_STAT_HAS_SIGNAL);
|
OSDDRAWSTATUSFRONTEND(2, OSDSYMBOL(SYMBOL_SIGNAL), FE_HAS_SIGNAL);
|
||||||
OSDDRAWSTATUSFRONTEND(3, OSDSYMBOL(SYMBOL_CARRIER), DTV_STAT_HAS_CARRIER);
|
OSDDRAWSTATUSFRONTEND(3, OSDSYMBOL(SYMBOL_CARRIER), FE_HAS_CARRIER);
|
||||||
OSDDRAWSTATUSFRONTEND(4, OSDSYMBOL(SYMBOL_VITERBI), DTV_STAT_HAS_VITERBI);
|
OSDDRAWSTATUSFRONTEND(4, OSDSYMBOL(SYMBOL_VITERBI), FE_HAS_VITERBI);
|
||||||
OSDDRAWSTATUSFRONTEND(5, OSDSYMBOL(SYMBOL_SYNC), DTV_STAT_HAS_SYNC);
|
OSDDRAWSTATUSFRONTEND(5, OSDSYMBOL(SYMBOL_SYNC), FE_HAS_SYNC);
|
||||||
}
|
}
|
||||||
OSDDRAWSTATUSBOTTOMBAR();
|
OSDDRAWSTATUSBOTTOMBAR();
|
||||||
osdM->Flush();
|
osdM->Flush();
|
||||||
@ -396,8 +394,7 @@ void cFemonOsd::DrawStatusWindow(void)
|
|||||||
void cFemonOsd::DrawInfoWindow(void)
|
void cFemonOsd::DrawInfoWindow(void)
|
||||||
{
|
{
|
||||||
cMutexLock lock(&mutexM);
|
cMutexLock lock(&mutexM);
|
||||||
LOCK_CHANNELS_READ;
|
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||||
const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
|
|
||||||
|
|
||||||
if (osdM && channel) {
|
if (osdM && channel) {
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
@ -593,16 +590,16 @@ void cFemonOsd::Action(void)
|
|||||||
strengthM = cDevice::ActualDevice()->SignalStrength();
|
strengthM = cDevice::ActualDevice()->SignalStrength();
|
||||||
strengthValidM = (strengthM >= 0);
|
strengthValidM = (strengthM >= 0);
|
||||||
frontendNameM = cDevice::ActualDevice()->DeviceName();
|
frontendNameM = cDevice::ActualDevice()->DeviceName();
|
||||||
frontendStatusM = strengthValidM ? (DTV_STAT_HAS_SIGNAL | DTV_STAT_HAS_CARRIER | DTV_STAT_HAS_VITERBI | DTV_STAT_HAS_SYNC | DTV_STAT_HAS_LOCK) : DTV_STAT_HAS_NONE;
|
frontendStatusM = (fe_status_t)(strengthValidM ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0);
|
||||||
frontendStatusValidM = strengthValidM;
|
frontendStatusValidM = strengthValidM;
|
||||||
signalM = strengthM;
|
signalM = uint16_t(strengthM * 0xFFFF / 100);
|
||||||
signalValidM = strengthValidM;
|
signalValidM = strengthValidM;
|
||||||
cnrM = 0;
|
snrM = 0;
|
||||||
cnrValidM = false;
|
snrValidM = false;
|
||||||
berM = 0;
|
berM = 0;
|
||||||
berValidM = false;
|
berValidM = false;
|
||||||
perM = 0;
|
uncM = 0;
|
||||||
perValidM = false;
|
uncValidM = false;
|
||||||
break;
|
break;
|
||||||
case DEVICESOURCE_IPTV:
|
case DEVICESOURCE_IPTV:
|
||||||
qualityM = cDevice::ActualDevice()->SignalQuality();
|
qualityM = cDevice::ActualDevice()->SignalQuality();
|
||||||
@ -610,20 +607,49 @@ void cFemonOsd::Action(void)
|
|||||||
strengthM = cDevice::ActualDevice()->SignalStrength();
|
strengthM = cDevice::ActualDevice()->SignalStrength();
|
||||||
strengthValidM = (strengthM >= 0);
|
strengthValidM = (strengthM >= 0);
|
||||||
frontendNameM = cDevice::ActualDevice()->DeviceName();
|
frontendNameM = cDevice::ActualDevice()->DeviceName();
|
||||||
frontendStatusM = strengthValidM ? (DTV_STAT_HAS_SIGNAL | DTV_STAT_HAS_CARRIER | DTV_STAT_HAS_VITERBI | DTV_STAT_HAS_SYNC | DTV_STAT_HAS_LOCK) : DTV_STAT_HAS_NONE;
|
frontendStatusM = (fe_status_t)(strengthValidM ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0);
|
||||||
frontendStatusValidM = strengthValidM;
|
frontendStatusValidM = strengthValidM;
|
||||||
signalM = strengthM;
|
signalM = uint16_t(strengthM * 0xFFFF / 100);
|
||||||
signalValidM = strengthValidM;
|
signalValidM = strengthValidM;
|
||||||
cnrM = qualityM;
|
snrM = uint16_t(qualityM * 0xFFFF / 100);
|
||||||
cnrValidM = qualityValidM;
|
snrValidM = qualityValidM;
|
||||||
berM = 0;
|
berM = 0;
|
||||||
berValidM = false;
|
berValidM = false;
|
||||||
perM = 0;
|
uncM = 0;
|
||||||
perValidM = false;
|
uncValidM = false;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
case DEVICESOURCE_DVBAPI:
|
case DEVICESOURCE_DVBAPI:
|
||||||
if (svdrpConnectionM.handle >= 0) {
|
if (frontendM != -1) {
|
||||||
|
qualityM = cDevice::ActualDevice()->SignalQuality();
|
||||||
|
qualityValidM = (qualityM >= 0);
|
||||||
|
strengthM = cDevice::ActualDevice()->SignalStrength();
|
||||||
|
strengthValidM = (strengthM >= 0);
|
||||||
|
frontendNameM = cDevice::ActualDevice()->DeviceName();
|
||||||
|
frontendStatusValidM = (ioctl(frontendM, FE_READ_STATUS, &frontendStatusM) >= 0);
|
||||||
|
signalValidM = (ioctl(frontendM, FE_READ_SIGNAL_STRENGTH, &signalM) >= 0);
|
||||||
|
snrValidM = (ioctl(frontendM, FE_READ_SNR, &snrM) >= 0);
|
||||||
|
berValidM = (ioctl(frontendM, FE_READ_BER, &berM) >= 0);
|
||||||
|
uncValidM = (ioctl(frontendM, FE_READ_UNCORRECTED_BLOCKS, &uncM) >= 0);
|
||||||
|
}
|
||||||
|
else if (strstr(*cDevice::ActualDevice()->DeviceType(), SATIP_DEVICE)) {
|
||||||
|
qualityM = cDevice::ActualDevice()->SignalQuality();
|
||||||
|
qualityValidM = (qualityM >= 0);
|
||||||
|
strengthM = cDevice::ActualDevice()->SignalStrength();
|
||||||
|
strengthValidM = (strengthM >= 0);
|
||||||
|
frontendNameM = cDevice::ActualDevice()->DeviceName();
|
||||||
|
frontendStatusM = (fe_status_t)(cDevice::ActualDevice()->HasLock() ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0);
|
||||||
|
frontendStatusValidM = strengthValidM;
|
||||||
|
signalM = uint16_t(strengthM * 0xFFFF / 100);
|
||||||
|
signalValidM = strengthValidM;
|
||||||
|
snrM = uint16_t(qualityM * 0xFFFF / 100);
|
||||||
|
snrValidM = qualityValidM;
|
||||||
|
berM = 0;
|
||||||
|
berValidM = false;
|
||||||
|
uncM = 0;
|
||||||
|
uncValidM = false;
|
||||||
|
}
|
||||||
|
else if (svdrpConnectionM.handle >= 0) {
|
||||||
cmd.handle = svdrpConnectionM.handle;
|
cmd.handle = svdrpConnectionM.handle;
|
||||||
svdrpPluginM->Service("SvdrpCommand-v1.0", &cmd);
|
svdrpPluginM->Service("SvdrpCommand-v1.0", &cmd);
|
||||||
if (cmd.responseCode == 900) {
|
if (cmd.responseCode == 900) {
|
||||||
@ -631,9 +657,9 @@ void cFemonOsd::Action(void)
|
|||||||
qualityValidM = false;
|
qualityValidM = false;
|
||||||
frontendStatusValidM = false;
|
frontendStatusValidM = false;
|
||||||
signalValidM = false;
|
signalValidM = false;
|
||||||
cnrValidM = false;
|
snrValidM = false;
|
||||||
berValidM = false;
|
berValidM = false;
|
||||||
perValidM = false;
|
uncValidM = false;
|
||||||
for (cLine *line = cmd.reply.First(); line; line = cmd.reply.Next(line)) {
|
for (cLine *line = cmd.reply.First(); line; line = cmd.reply.Next(line)) {
|
||||||
const char *s = line->Text();
|
const char *s = line->Text();
|
||||||
if (!strncasecmp(s, "CARD:", 5))
|
if (!strncasecmp(s, "CARD:", 5))
|
||||||
@ -646,61 +672,38 @@ void cFemonOsd::Action(void)
|
|||||||
qualityM = (int)strtol(s + 5, NULL, 10);
|
qualityM = (int)strtol(s + 5, NULL, 10);
|
||||||
qualityValidM = (qualityM >= 0);
|
qualityValidM = (qualityM >= 0);
|
||||||
}
|
}
|
||||||
else if (!strncasecmp(s, "TYPE:", 5)) {
|
else if (!strncasecmp(s, "TYPE:", 5))
|
||||||
frontendTypeM = s + 5;
|
frontendInfoM.type = (fe_type_t)strtol(s + 5, NULL, 10);
|
||||||
}
|
|
||||||
else if (!strncasecmp(s, "NAME:", 5)) {
|
else if (!strncasecmp(s, "NAME:", 5)) {
|
||||||
frontendNameM = s + 5;
|
frontendNameM = s + 5;
|
||||||
}
|
}
|
||||||
else if (!strncasecmp(s, "STAT:", 5)) {
|
else if (!strncasecmp(s, "STAT:", 5)) {
|
||||||
frontendStatusM = strtol(s + 5, NULL, 16);
|
frontendStatusM = (fe_status_t)strtol(s + 5, NULL, 16);
|
||||||
frontendStatusValidM = true;
|
frontendStatusValidM = true;
|
||||||
}
|
}
|
||||||
else if (!strncasecmp(s, "SGNL:", 5)) {
|
else if (!strncasecmp(s, "SGNL:", 5)) {
|
||||||
signalM = atod(s + 5);
|
signalM = (uint16_t)strtol(s + 5, NULL, 16);
|
||||||
signalValidM = true;
|
signalValidM = true;
|
||||||
}
|
}
|
||||||
else if (!strncasecmp(s, "CNRA:", 5)) {
|
else if (!strncasecmp(s, "SNRA:", 5)) {
|
||||||
cnrM = atod(s + 5);
|
snrM = (uint16_t)strtol(s + 5, NULL, 16);
|
||||||
cnrValidM = true;
|
snrValidM = true;
|
||||||
}
|
}
|
||||||
else if (!strncasecmp(s, "BERA:", 5)) {
|
else if (!strncasecmp(s, "BERA:", 5)) {
|
||||||
berM = atod(s + 5);
|
berM = (uint32_t)strtol(s + 5, NULL, 16);
|
||||||
berValidM = true;
|
berValidM = true;
|
||||||
}
|
}
|
||||||
else if (!strncasecmp(s, "PERA:", 5)) {
|
else if (!strncasecmp(s, "UNCB:", 5)) {
|
||||||
perM = atod(s + 5);
|
uncM = (uint32_t)strtol(s + 5, NULL, 16);
|
||||||
perValidM = true;
|
uncValidM = true;
|
||||||
}
|
}
|
||||||
else if (!strncasecmp(s, "VIBR:", 5))
|
else if (!strncasecmp(s, "VIBR:", 5))
|
||||||
svdrpVideoBitRateM = atod(s + 5);
|
svdrpVideoBitRateM = (double)strtol(s + 5, NULL, 10);
|
||||||
else if (!strncasecmp(s, "AUBR:", 5))
|
else if (!strncasecmp(s, "AUBR:", 5))
|
||||||
svdrpAudioBitRateM = atod(s + 5);
|
svdrpAudioBitRateM = (double)strtol(s + 5, NULL, 10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
int valid;
|
|
||||||
qualityM = cDevice::ActualDevice()->SignalQuality();
|
|
||||||
qualityValidM = (qualityM >= 0);
|
|
||||||
strengthM = cDevice::ActualDevice()->SignalStrength();
|
|
||||||
strengthValidM = (strengthM >= 0);
|
|
||||||
frontendNameM = cDevice::ActualDevice()->DeviceName();
|
|
||||||
if (cDevice::ActualDevice()->SignalStats(valid, &signalM, &cnrM, NULL, &berM, &perM, &frontendStatusM)) {
|
|
||||||
frontendStatusValidM = valid & DTV_STAT_VALID_STATUS;
|
|
||||||
signalValidM = valid & DTV_STAT_VALID_STRENGTH;
|
|
||||||
cnrValidM = valid & DTV_STAT_VALID_CNR;
|
|
||||||
berValidM = valid & DTV_STAT_VALID_BERPOST;
|
|
||||||
perValidM = valid & DTV_STAT_VALID_PER;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
frontendStatusValidM = false;
|
|
||||||
signalValidM = false;
|
|
||||||
cnrValidM = false;
|
|
||||||
berValidM = false;
|
|
||||||
perValidM = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
DrawInfoWindow();
|
DrawInfoWindow();
|
||||||
@ -713,10 +716,42 @@ void cFemonOsd::Show(void)
|
|||||||
{
|
{
|
||||||
debug1("%s", __PRETTY_FUNCTION__);
|
debug1("%s", __PRETTY_FUNCTION__);
|
||||||
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
|
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
|
||||||
LOCK_CHANNELS_READ;
|
const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||||
const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
|
|
||||||
|
|
||||||
AttachFrontend();
|
deviceSourceM = DEVICESOURCE_DVBAPI;
|
||||||
|
if (channel) {
|
||||||
|
if (channel->IsSourceType('I'))
|
||||||
|
deviceSourceM = DEVICESOURCE_IPTV;
|
||||||
|
else if (channel->IsSourceType('V'))
|
||||||
|
deviceSourceM = DEVICESOURCE_PVRINPUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (deviceSourceM == DEVICESOURCE_DVBAPI) {
|
||||||
|
if (!strstr(*cDevice::ActualDevice()->DeviceType(), SATIP_DEVICE)) {
|
||||||
|
cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice());
|
||||||
|
frontendM = dev ? open(*cString::sprintf(FRONTEND_DEVICE, dev->Adapter(), dev->Frontend()), O_RDONLY | O_NONBLOCK) : -1;
|
||||||
|
if (frontendM >= 0) {
|
||||||
|
if (ioctl(frontendM, FE_GET_INFO, &frontendInfoM) < 0) {
|
||||||
|
if (!FemonConfig.GetUseSvdrp())
|
||||||
|
error("%s Cannot read frontend info", __PRETTY_FUNCTION__);
|
||||||
|
close(frontendM);
|
||||||
|
frontendM = -1;
|
||||||
|
memset(&frontendInfoM, 0, sizeof(frontendInfoM));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (FemonConfig.GetUseSvdrp()) {
|
||||||
|
if (!SvdrpConnect() || !SvdrpTune())
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
error("%s Cannot open frontend device", __PRETTY_FUNCTION__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
frontendM = -1;
|
||||||
|
|
||||||
osdM = cOsdProvider::NewOsd(osdLeftM, osdTopM);
|
osdM = cOsdProvider::NewOsd(osdLeftM, osdTopM);
|
||||||
if (osdM) {
|
if (osdM) {
|
||||||
@ -745,38 +780,11 @@ void cFemonOsd::Show(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cFemonOsd::AttachFrontend(void)
|
|
||||||
{
|
|
||||||
debug1("%s", __PRETTY_FUNCTION__);
|
|
||||||
LOCK_CHANNELS_READ;
|
|
||||||
const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
|
|
||||||
|
|
||||||
deviceSourceM = DEVICESOURCE_DVBAPI;
|
|
||||||
if (channel) {
|
|
||||||
if (channel->IsSourceType('I'))
|
|
||||||
deviceSourceM = DEVICESOURCE_IPTV;
|
|
||||||
else if (channel->IsSourceType('V'))
|
|
||||||
deviceSourceM = DEVICESOURCE_PVRINPUT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (deviceSourceM == DEVICESOURCE_DVBAPI) {
|
|
||||||
if (!strstr(*cDevice::ActualDevice()->DeviceType(), SATIP_DEVICE)) {
|
|
||||||
if (FemonConfig.GetUseSvdrp()) {
|
|
||||||
if (!SvdrpConnect() || !SvdrpTune())
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
void cFemonOsd::ChannelSwitch(const cDevice * deviceP, int channelNumberP, bool liveViewP)
|
void cFemonOsd::ChannelSwitch(const cDevice * deviceP, int channelNumberP, bool liveViewP)
|
||||||
{
|
{
|
||||||
debug1("%s (%d, %d, %d)", __PRETTY_FUNCTION__, deviceP->DeviceNumber(), channelNumberP, liveViewP);
|
debug1("%s (%d, %d, %d)", __PRETTY_FUNCTION__, deviceP->DeviceNumber(), channelNumberP, liveViewP);
|
||||||
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
|
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
|
||||||
LOCK_CHANNELS_READ;
|
const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||||
const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
|
|
||||||
|
|
||||||
if (!deviceP || !liveViewP)
|
if (!deviceP || !liveViewP)
|
||||||
return;
|
return;
|
||||||
@ -789,7 +797,42 @@ void cFemonOsd::ChannelSwitch(const cDevice * deviceP, int channelNumberP, bool
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (channel && FemonConfig.GetAnalyzeStream() && AttachFrontend()) {
|
if (channel && FemonConfig.GetAnalyzeStream()) {
|
||||||
|
deviceSourceM = DEVICESOURCE_DVBAPI;
|
||||||
|
if (channel->IsSourceType('I'))
|
||||||
|
deviceSourceM = DEVICESOURCE_IPTV;
|
||||||
|
else if (channel->IsSourceType('V'))
|
||||||
|
deviceSourceM = DEVICESOURCE_PVRINPUT;
|
||||||
|
|
||||||
|
if (frontendM >= 0) {
|
||||||
|
close(frontendM);
|
||||||
|
frontendM = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (deviceSourceM == DEVICESOURCE_DVBAPI) {
|
||||||
|
if (!strstr(*cDevice::ActualDevice()->DeviceType(), SATIP_DEVICE)) {
|
||||||
|
cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice());
|
||||||
|
frontendM = dev ? open(*cString::sprintf(FRONTEND_DEVICE, dev->Adapter(), dev->Frontend()), O_RDONLY | O_NONBLOCK) : -1;
|
||||||
|
if (frontendM >= 0) {
|
||||||
|
if (ioctl(frontendM, FE_GET_INFO, &frontendInfoM) < 0) {
|
||||||
|
if (!FemonConfig.GetUseSvdrp())
|
||||||
|
error("%s Cannot read frontend info", __PRETTY_FUNCTION__);
|
||||||
|
close(frontendM);
|
||||||
|
frontendM = -1;
|
||||||
|
memset(&frontendInfoM, 0, sizeof(frontendInfoM));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (FemonConfig.GetUseSvdrp()) {
|
||||||
|
if (!SvdrpConnect() || !SvdrpTune())
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
error("%s Cannot open frontend device", __PRETTY_FUNCTION__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (receiverM) {
|
if (receiverM) {
|
||||||
receiverM->Deactivate();
|
receiverM->Deactivate();
|
||||||
DELETENULL(receiverM);
|
DELETENULL(receiverM);
|
||||||
@ -798,6 +841,7 @@ void cFemonOsd::ChannelSwitch(const cDevice * deviceP, int channelNumberP, bool
|
|||||||
cDevice::ActualDevice()->AttachReceiver(receiverM);
|
cDevice::ActualDevice()->AttachReceiver(receiverM);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void cFemonOsd::SetAudioTrack(int indexP, const char * const *tracksP)
|
void cFemonOsd::SetAudioTrack(int indexP, const char * const *tracksP)
|
||||||
{
|
{
|
||||||
@ -808,8 +852,7 @@ void cFemonOsd::SetAudioTrack(int indexP, const char * const *tracksP)
|
|||||||
DELETENULL(receiverM);
|
DELETENULL(receiverM);
|
||||||
}
|
}
|
||||||
if (FemonConfig.GetAnalyzeStream()) {
|
if (FemonConfig.GetAnalyzeStream()) {
|
||||||
LOCK_CHANNELS_READ;
|
const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||||
const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
|
|
||||||
if (channel) {
|
if (channel) {
|
||||||
receiverM = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0);
|
receiverM = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0);
|
||||||
cDevice::ActualDevice()->AttachReceiver(receiverM);
|
cDevice::ActualDevice()->AttachReceiver(receiverM);
|
||||||
@ -823,8 +866,7 @@ bool cFemonOsd::DeviceSwitch(int directionP)
|
|||||||
int device = cDevice::ActualDevice()->DeviceNumber();
|
int device = cDevice::ActualDevice()->DeviceNumber();
|
||||||
int direction = sgn(directionP);
|
int direction = sgn(directionP);
|
||||||
if (device >= 0) {
|
if (device >= 0) {
|
||||||
LOCK_CHANNELS_READ;
|
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||||
const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
|
|
||||||
if (channel) {
|
if (channel) {
|
||||||
for (int i = 0; i < cDevice::NumDevices() - 1; i++) {
|
for (int i = 0; i < cDevice::NumDevices() - 1; i++) {
|
||||||
if (direction >= 0) {
|
if (direction >= 0) {
|
||||||
@ -897,13 +939,12 @@ bool cFemonOsd::DeviceSwitch(int directionP)
|
|||||||
d->CamSlot()->Assign(NULL);
|
d->CamSlot()->Assign(NULL);
|
||||||
d->SwitchChannel(channel, false);
|
d->SwitchChannel(channel, false);
|
||||||
cControl::Launch(new cTransferControl(d, channel));
|
cControl::Launch(new cTransferControl(d, channel));
|
||||||
AttachFrontend();
|
return (true);
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return (false);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool cFemonOsd::SvdrpConnect(void)
|
bool cFemonOsd::SvdrpConnect(void)
|
||||||
@ -937,8 +978,7 @@ bool cFemonOsd::SvdrpConnect(void)
|
|||||||
bool cFemonOsd::SvdrpTune(void)
|
bool cFemonOsd::SvdrpTune(void)
|
||||||
{
|
{
|
||||||
if (svdrpPluginM && svdrpConnectionM.handle >= 0) {
|
if (svdrpPluginM && svdrpConnectionM.handle >= 0) {
|
||||||
LOCK_CHANNELS_READ;
|
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||||
const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
|
|
||||||
if (channel) {
|
if (channel) {
|
||||||
SvdrpCommand_v1_0 cmd;
|
SvdrpCommand_v1_0 cmd;
|
||||||
cmd.handle = svdrpConnectionM.handle;
|
cmd.handle = svdrpConnectionM.handle;
|
||||||
@ -998,8 +1038,7 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP)
|
|||||||
if ((numberM == 0) && (oldNumberM != 0)) {
|
if ((numberM == 0) && (oldNumberM != 0)) {
|
||||||
numberM = oldNumberM;
|
numberM = oldNumberM;
|
||||||
oldNumberM = cDevice::CurrentChannel();
|
oldNumberM = cDevice::CurrentChannel();
|
||||||
LOCK_CHANNELS_READ;
|
Channels.SwitchTo(numberM);
|
||||||
Channels->SwitchTo(numberM);
|
|
||||||
numberM = 0;
|
numberM = 0;
|
||||||
return osContinue;
|
return osContinue;
|
||||||
}
|
}
|
||||||
@ -1008,12 +1047,11 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP)
|
|||||||
numberM = numberM * 10 + keyP - k0;
|
numberM = numberM * 10 + keyP - k0;
|
||||||
if (numberM > 0) {
|
if (numberM > 0) {
|
||||||
DrawStatusWindow();
|
DrawStatusWindow();
|
||||||
LOCK_CHANNELS_READ;
|
cChannel *ch = Channels.GetByNumber(numberM);
|
||||||
const cChannel *ch = Channels->GetByNumber(numberM);
|
|
||||||
inputTimeM.Set(0);
|
inputTimeM.Set(0);
|
||||||
// Lets see if there can be any useful further input:
|
// Lets see if there can be any useful further input:
|
||||||
int n = ch ? numberM * 10 : 0;
|
int n = ch ? numberM * 10 : 0;
|
||||||
while (ch && (ch = Channels->Next(ch)) != NULL) {
|
while (ch && (ch = Channels.Next(ch)) != NULL) {
|
||||||
if (!ch->GroupSep()) {
|
if (!ch->GroupSep()) {
|
||||||
if (n <= ch->Number() && ch->Number() <= n + 9) {
|
if (n <= ch->Number() && ch->Number() <= n + 9) {
|
||||||
n = 0;
|
n = 0;
|
||||||
@ -1026,7 +1064,7 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP)
|
|||||||
if (n > 0) {
|
if (n > 0) {
|
||||||
// This channel is the only one that fits the input, so let's take it right away:
|
// This channel is the only one that fits the input, so let's take it right away:
|
||||||
oldNumberM = cDevice::CurrentChannel();
|
oldNumberM = cDevice::CurrentChannel();
|
||||||
Channels->SwitchTo(numberM);
|
Channels.SwitchTo(numberM);
|
||||||
numberM = 0;
|
numberM = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1086,10 +1124,9 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP)
|
|||||||
break;
|
break;
|
||||||
case kNone:
|
case kNone:
|
||||||
if (numberM && (inputTimeM.Elapsed() > CHANNELINPUT_TIMEOUT)) {
|
if (numberM && (inputTimeM.Elapsed() > CHANNELINPUT_TIMEOUT)) {
|
||||||
LOCK_CHANNELS_READ;
|
if (Channels.GetByNumber(numberM)) {
|
||||||
if (Channels->GetByNumber(numberM)) {
|
|
||||||
oldNumberM = cDevice::CurrentChannel();
|
oldNumberM = cDevice::CurrentChannel();
|
||||||
Channels->SwitchTo(numberM);
|
Channels.SwitchTo(numberM);
|
||||||
numberM = 0;
|
numberM = 0;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -1101,8 +1138,7 @@ eOSState cFemonOsd::ProcessKey(eKeys keyP)
|
|||||||
case kOk:
|
case kOk:
|
||||||
{
|
{
|
||||||
// toggle between display modes
|
// toggle between display modes
|
||||||
LOCK_CHANNELS_READ;
|
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||||
const cChannel *channel = Channels->GetByNumber(cDevice::CurrentChannel());
|
|
||||||
if (++displayModeM == eFemonModeAC3 && channel && !channel->Dpid(0)) displayModeM++;
|
if (++displayModeM == eFemonModeAC3 && channel && !channel->Dpid(0)) displayModeM++;
|
||||||
if (displayModeM >= eFemonModeMaxNumber) displayModeM = 0;
|
if (displayModeM >= eFemonModeMaxNumber) displayModeM = 0;
|
||||||
DrawInfoWindow();
|
DrawInfoWindow();
|
||||||
|
19
osd.h
19
osd.h
@ -8,7 +8,9 @@
|
|||||||
#ifndef __FEMON_OSD_H
|
#ifndef __FEMON_OSD_H
|
||||||
#define __FEMON_OSD_H
|
#define __FEMON_OSD_H
|
||||||
|
|
||||||
|
#include <linux/dvb/frontend.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
#include <vdr/osd.h>
|
#include <vdr/osd.h>
|
||||||
#include <vdr/thread.h>
|
#include <vdr/thread.h>
|
||||||
#include <vdr/status.h>
|
#include <vdr/status.h>
|
||||||
@ -35,6 +37,7 @@ private:
|
|||||||
|
|
||||||
cOsd *osdM;
|
cOsd *osdM;
|
||||||
cFemonReceiver *receiverM;
|
cFemonReceiver *receiverM;
|
||||||
|
int frontendM;
|
||||||
int svdrpFrontendM;
|
int svdrpFrontendM;
|
||||||
double svdrpVideoBitRateM;
|
double svdrpVideoBitRateM;
|
||||||
double svdrpAudioBitRateM;
|
double svdrpAudioBitRateM;
|
||||||
@ -46,17 +49,16 @@ private:
|
|||||||
bool qualityValidM;
|
bool qualityValidM;
|
||||||
int strengthM;
|
int strengthM;
|
||||||
bool strengthValidM;
|
bool strengthValidM;
|
||||||
double cnrM;
|
uint16_t snrM;
|
||||||
bool cnrValidM;
|
bool snrValidM;
|
||||||
double signalM;
|
uint16_t signalM;
|
||||||
bool signalValidM;
|
bool signalValidM;
|
||||||
double berM;
|
uint32_t berM;
|
||||||
bool berValidM;
|
bool berValidM;
|
||||||
double perM;
|
uint32_t uncM;
|
||||||
bool perValidM;
|
bool uncValidM;
|
||||||
cString frontendNameM;
|
cString frontendNameM;
|
||||||
cString frontendTypeM;
|
fe_status_t frontendStatusM;
|
||||||
int frontendStatusM;
|
|
||||||
bool frontendStatusValidM;
|
bool frontendStatusValidM;
|
||||||
dvb_frontend_info frontendInfoM;
|
dvb_frontend_info frontendInfoM;
|
||||||
eDeviceSourceType deviceSourceM;
|
eDeviceSourceType deviceSourceM;
|
||||||
@ -70,7 +72,6 @@ private:
|
|||||||
cCondWait sleepM;
|
cCondWait sleepM;
|
||||||
cMutex mutexM;
|
cMutex mutexM;
|
||||||
|
|
||||||
bool AttachFrontend(void);
|
|
||||||
void DrawStatusWindow(void);
|
void DrawStatusWindow(void);
|
||||||
void DrawInfoWindow(void);
|
void DrawInfoWindow(void);
|
||||||
bool SvdrpConnect(void);
|
bool SvdrpConnect(void);
|
||||||
|
133
po/de_DE.po
133
po/de_DE.po
@ -1,22 +1,21 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
# Copyright (C) 2007-2015 Rolf Ahrenberg
|
||||||
# This file is distributed under the same license as the femon package.
|
# This file is distributed under the same license as the femon package.
|
||||||
# Peter Marquardt
|
# Peter Marquardt
|
||||||
# Andreas Brachold
|
# Andreas Brachold
|
||||||
# Christian Wieninger
|
# Christian Wieninger
|
||||||
# Winfried
|
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
"Project-Id-Version: vdr-femon 2.2.1\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
|
||||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
|
||||||
"Last-Translator: Christian Wieninger\n"
|
"Last-Translator: Christian Wieninger\n"
|
||||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
"Language-Team: German <vdr@linuxtv.org>\n"
|
||||||
"Language: de\n"
|
"Language: de\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=utf-8\n"
|
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
msgid "DVB Signal Information Monitor (OSD)"
|
msgid "DVB Signal Information Monitor (OSD)"
|
||||||
@ -26,7 +25,7 @@ msgid "Signal Information"
|
|||||||
msgstr "Signalinformationen"
|
msgstr "Signalinformationen"
|
||||||
|
|
||||||
msgid "Femon not available"
|
msgid "Femon not available"
|
||||||
msgstr "Femon nicht verfügbar"
|
msgstr "Femon nicht verfügbar"
|
||||||
|
|
||||||
msgid "Video"
|
msgid "Video"
|
||||||
msgstr "Video"
|
msgstr "Video"
|
||||||
@ -62,7 +61,7 @@ msgid "Coderate"
|
|||||||
msgstr "Coderate"
|
msgstr "Coderate"
|
||||||
|
|
||||||
msgid "Protocol"
|
msgid "Protocol"
|
||||||
msgstr "Protokoll"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Bitrate"
|
msgid "Bitrate"
|
||||||
msgstr "Bitrate"
|
msgstr "Bitrate"
|
||||||
@ -71,28 +70,28 @@ msgid "Stream Information"
|
|||||||
msgstr "Streaminformation"
|
msgstr "Streaminformation"
|
||||||
|
|
||||||
msgid "Video Stream"
|
msgid "Video Stream"
|
||||||
msgstr "Videostream"
|
msgstr "Video Stream"
|
||||||
|
|
||||||
msgid "Codec"
|
msgid "Codec"
|
||||||
msgstr "Codec"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Aspect Ratio"
|
msgid "Aspect Ratio"
|
||||||
msgstr "Seitenverhältnis"
|
msgstr "Seitenverhältnis"
|
||||||
|
|
||||||
msgid "Frame Rate"
|
msgid "Frame Rate"
|
||||||
msgstr "Bildrate"
|
msgstr "Bildrate"
|
||||||
|
|
||||||
msgid "Video Format"
|
msgid "Video Format"
|
||||||
msgstr "Videoformat"
|
msgstr "Bildformat"
|
||||||
|
|
||||||
msgid "Resolution"
|
msgid "Resolution"
|
||||||
msgstr "Auflösung"
|
msgstr "Auflösung"
|
||||||
|
|
||||||
msgid "Audio Stream"
|
msgid "Audio Stream"
|
||||||
msgstr "Audiostream"
|
msgstr "Audio Stream"
|
||||||
|
|
||||||
msgid "Channel Mode"
|
msgid "Channel Mode"
|
||||||
msgstr "Kanalmodus"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Sampling Frequency"
|
msgid "Sampling Frequency"
|
||||||
msgstr "Abtastrate"
|
msgstr "Abtastrate"
|
||||||
@ -116,7 +115,7 @@ msgid "Dolby Surround Mode"
|
|||||||
msgstr "Dolby Surround Modus"
|
msgstr "Dolby Surround Modus"
|
||||||
|
|
||||||
msgid "Low Frequency Effects"
|
msgid "Low Frequency Effects"
|
||||||
msgstr "Tieftöner Effekte"
|
msgstr "Tieftöner Effekte"
|
||||||
|
|
||||||
msgid "Dialogue Normalization"
|
msgid "Dialogue Normalization"
|
||||||
msgstr "Dialog Normalisierung"
|
msgstr "Dialog Normalisierung"
|
||||||
@ -130,15 +129,6 @@ msgstr "Transponder"
|
|||||||
msgid "stream"
|
msgid "stream"
|
||||||
msgstr "Stream"
|
msgstr "Stream"
|
||||||
|
|
||||||
msgid "dBm"
|
|
||||||
msgstr "dBm"
|
|
||||||
|
|
||||||
msgid "dBuV"
|
|
||||||
msgstr "dBuV"
|
|
||||||
|
|
||||||
msgid "dBV"
|
|
||||||
msgstr "dBV"
|
|
||||||
|
|
||||||
msgid "Classic"
|
msgid "Classic"
|
||||||
msgstr "Klassischer"
|
msgstr "Klassischer"
|
||||||
|
|
||||||
@ -170,88 +160,82 @@ msgid "PearlHD"
|
|||||||
msgstr "PearlHD"
|
msgstr "PearlHD"
|
||||||
|
|
||||||
msgid "Hide main menu entry"
|
msgid "Hide main menu entry"
|
||||||
msgstr "Hauptmenüeintrag verstecken"
|
msgstr "Hauptmenüeintrag verstecken"
|
||||||
|
|
||||||
msgid "Define whether the main menu entry is hidden."
|
msgid "Define whether the main menu entry is hidden."
|
||||||
msgstr "Legt fest, ob der Hauptmenüeintrag ausgeblendet ist."
|
msgstr ""
|
||||||
|
|
||||||
msgid "Default display mode"
|
msgid "Default display mode"
|
||||||
msgstr "Standard Anzeigemodus"
|
msgstr "Standard Anzeigemodus"
|
||||||
|
|
||||||
msgid "Define the default display mode at startup."
|
msgid "Define the default display mode at startup."
|
||||||
msgstr "Definiert den Standard-Anzeigemodus beim Start."
|
msgstr ""
|
||||||
|
|
||||||
msgid "Define the used OSD skin."
|
msgid "Define the used OSD skin."
|
||||||
msgstr "Definiert die verwendete OSD-Oberfläche."
|
msgstr ""
|
||||||
|
|
||||||
msgid "Define the used OSD theme."
|
msgid "Define the used OSD theme."
|
||||||
msgstr "Definiert das verwendete OSD-Theme."
|
msgstr ""
|
||||||
|
|
||||||
msgid "Position"
|
msgid "Position"
|
||||||
msgstr "Position"
|
msgstr "Position"
|
||||||
|
|
||||||
msgid "Define the position of OSD."
|
msgid "Define the position of OSD."
|
||||||
msgstr "Definiert die Position des OSD."
|
msgstr ""
|
||||||
|
|
||||||
msgid "Downscale OSD size [%]"
|
msgid "Downscale OSD size [%]"
|
||||||
msgstr "OSD Größe verkleinern [%]"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Define the downscale ratio for OSD size."
|
msgid "Define the downscale ratio for OSD size."
|
||||||
msgstr "Definiert den Verkleinerungsfaktor der OSD-Größe."
|
msgstr ""
|
||||||
|
|
||||||
msgid "Signal level unit"
|
|
||||||
msgstr "Signalpegel Einheiten"
|
|
||||||
|
|
||||||
msgid "Define the used signal level unit."
|
|
||||||
msgstr "Definiert der Einheit für Signalpegel."
|
|
||||||
|
|
||||||
msgid "Red limit [%]"
|
msgid "Red limit [%]"
|
||||||
msgstr "Grenze Rot [%]"
|
msgstr "Grenze Rot [%]"
|
||||||
|
|
||||||
msgid "Define a limit for red bar, which is used to indicate a bad signal."
|
msgid "Define a limit for red bar, which is used to indicate a bad signal."
|
||||||
msgstr "Definiert einen Grenzwert für den roten Balken, um ein schlechtes Signal zu kennzeichnen."
|
msgstr ""
|
||||||
|
|
||||||
msgid "Green limit [%]"
|
msgid "Green limit [%]"
|
||||||
msgstr "Grenze Grün [%]"
|
msgstr "Grenze Grün [%]"
|
||||||
|
|
||||||
msgid "Define a limit for green bar, which is used to indicate a good signal."
|
msgid "Define a limit for green bar, which is used to indicate a good signal."
|
||||||
msgstr "Definiert einen Grenzwert für den grünen Balken, um ein gutes Signal zu kennzeichnen."
|
msgstr ""
|
||||||
|
|
||||||
msgid "OSD update interval [0.1s]"
|
msgid "OSD update interval [0.1s]"
|
||||||
msgstr "OSD Updateintervall [0.1s]"
|
msgstr "OSD Updateintervall [0.1s]"
|
||||||
|
|
||||||
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
|
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
|
||||||
msgstr "Definiert den Intervall für OSD-Updates. Ein kleineres Intervall erzeugt eine höhere CPU-Last."
|
msgstr ""
|
||||||
|
|
||||||
msgid "Analyze stream"
|
msgid "Analyze stream"
|
||||||
msgstr "Stream analysieren"
|
msgstr "Stream analysieren"
|
||||||
|
|
||||||
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
|
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
|
||||||
msgstr "Definiert ob der DVB-Stream analysiert und die Bitraten berechnet werden."
|
msgstr ""
|
||||||
|
|
||||||
msgid "Calculation interval [0.1s]"
|
msgid "Calculation interval [0.1s]"
|
||||||
msgstr "Berechnungsintervall [0.1s]"
|
msgstr "Berechnungsintervall [0.1s]"
|
||||||
|
|
||||||
msgid "Define an interval for calculation. The bigger interval generates more stable values."
|
msgid "Define an interval for calculation. The bigger interval generates more stable values."
|
||||||
msgstr "Definiert den Intervall für die Berechnung. Ein größerer Intervall erzeugt stabilere Werte."
|
msgstr ""
|
||||||
|
|
||||||
msgid "Use SVDRP service"
|
msgid "Use SVDRP service"
|
||||||
msgstr "SVDRP-Service verwenden"
|
msgstr "SVDRP Service verwenden"
|
||||||
|
|
||||||
msgid "Define whether the SVDRP service is used in client/server setups."
|
msgid "Define whether the SVDRP service is used in client/server setups."
|
||||||
msgstr "Legt fest, ob der SVDRP-Service in Client/Server-Setups verwendet wird."
|
msgstr ""
|
||||||
|
|
||||||
msgid "SVDRP service port"
|
msgid "SVDRP service port"
|
||||||
msgstr "SVDRP-Service Port"
|
msgstr "SVDRP Service Port"
|
||||||
|
|
||||||
msgid "Define the port number of SVDRP service."
|
msgid "Define the port number of SVDRP service."
|
||||||
msgstr "Definiert die Portnummer des SVDRP-Service."
|
msgstr ""
|
||||||
|
|
||||||
msgid "SVDRP service IP"
|
msgid "SVDRP service IP"
|
||||||
msgstr "SVDRP-Service IP"
|
msgstr "SVDRP Service IP"
|
||||||
|
|
||||||
msgid "Define the IP address of SVDRP service."
|
msgid "Define the IP address of SVDRP service."
|
||||||
msgstr "Definiert die IP-Adresse des SVDRP-Service."
|
msgstr ""
|
||||||
|
|
||||||
msgid "Help"
|
msgid "Help"
|
||||||
msgstr "Hilfe"
|
msgstr "Hilfe"
|
||||||
@ -263,67 +247,64 @@ msgid "Analog"
|
|||||||
msgstr "Analog"
|
msgstr "Analog"
|
||||||
|
|
||||||
msgid "MPEG-2"
|
msgid "MPEG-2"
|
||||||
msgstr "MPEG-2"
|
msgstr ""
|
||||||
|
|
||||||
msgid "H.264"
|
msgid "H.264"
|
||||||
msgstr "H.264"
|
msgstr ""
|
||||||
|
|
||||||
msgid "H.265"
|
|
||||||
msgstr "H.265"
|
|
||||||
|
|
||||||
msgid "MPEG-1 Layer I"
|
msgid "MPEG-1 Layer I"
|
||||||
msgstr "MPEG-1 Layer I"
|
msgstr ""
|
||||||
|
|
||||||
msgid "MPEG-1 Layer II"
|
msgid "MPEG-1 Layer II"
|
||||||
msgstr "MPEG-1 Layer II"
|
msgstr ""
|
||||||
|
|
||||||
msgid "MPEG-1 Layer III"
|
msgid "MPEG-1 Layer III"
|
||||||
msgstr "MPEG-1 Layer III"
|
msgstr ""
|
||||||
|
|
||||||
msgid "MPEG-2 Layer I"
|
msgid "MPEG-2 Layer I"
|
||||||
msgstr "MPEG-2 Layer I"
|
msgstr ""
|
||||||
|
|
||||||
msgid "MPEG-2 Layer II"
|
msgid "MPEG-2 Layer II"
|
||||||
msgstr "MPEG-2 Layer II"
|
msgstr ""
|
||||||
|
|
||||||
msgid "MPEG-2 Layer III"
|
msgid "MPEG-2 Layer III"
|
||||||
msgstr "MPEG-2 Layer III"
|
msgstr ""
|
||||||
|
|
||||||
msgid "HE-AAC"
|
msgid "HE-AAC"
|
||||||
msgstr "HE-AAC"
|
msgstr ""
|
||||||
|
|
||||||
msgid "LATM"
|
msgid "LATM"
|
||||||
msgstr "LATM"
|
msgstr ""
|
||||||
|
|
||||||
msgid "stereo"
|
msgid "stereo"
|
||||||
msgstr "Stereo"
|
msgstr ""
|
||||||
|
|
||||||
msgid "joint Stereo"
|
msgid "joint Stereo"
|
||||||
msgstr "Joint-Stereo"
|
msgstr ""
|
||||||
|
|
||||||
msgid "dual"
|
msgid "dual"
|
||||||
msgstr "Dual"
|
msgstr ""
|
||||||
|
|
||||||
msgid "mono"
|
msgid "mono"
|
||||||
msgstr "Mono"
|
msgstr ""
|
||||||
|
|
||||||
msgid "interlaced"
|
msgid "interlaced"
|
||||||
msgstr "Interlaced"
|
msgstr ""
|
||||||
|
|
||||||
msgid "progressive"
|
msgid "progressive"
|
||||||
msgstr "Progressiv"
|
msgstr ""
|
||||||
|
|
||||||
msgid "reserved"
|
msgid "reserved"
|
||||||
msgstr "belegt"
|
msgstr "belegt"
|
||||||
|
|
||||||
msgid "extended"
|
msgid "extended"
|
||||||
msgstr "erweitert"
|
msgstr ""
|
||||||
|
|
||||||
msgid "unknown"
|
msgid "unknown"
|
||||||
msgstr "unbekannt"
|
msgstr "unbekannt"
|
||||||
|
|
||||||
msgid "component"
|
msgid "component"
|
||||||
msgstr "Komponentenvideo"
|
msgstr ""
|
||||||
|
|
||||||
msgid "PAL"
|
msgid "PAL"
|
||||||
msgstr "PAL"
|
msgstr "PAL"
|
||||||
@ -332,10 +313,10 @@ msgid "NTSC"
|
|||||||
msgstr "NTSC"
|
msgstr "NTSC"
|
||||||
|
|
||||||
msgid "SECAM"
|
msgid "SECAM"
|
||||||
msgstr "SECAM"
|
msgstr ""
|
||||||
|
|
||||||
msgid "MAC"
|
msgid "MAC"
|
||||||
msgstr "MAC"
|
msgstr ""
|
||||||
|
|
||||||
msgid "Hz"
|
msgid "Hz"
|
||||||
msgstr "Hz"
|
msgstr "Hz"
|
||||||
@ -350,7 +331,7 @@ msgid "Visually Impaired (VI)"
|
|||||||
msgstr "Sehbehindert (VI)"
|
msgstr "Sehbehindert (VI)"
|
||||||
|
|
||||||
msgid "Hearing Impaired (HI)"
|
msgid "Hearing Impaired (HI)"
|
||||||
msgstr "Hörbehindert (HI)"
|
msgstr "Hörbehindert (HI)"
|
||||||
|
|
||||||
msgid "Dialogue (D)"
|
msgid "Dialogue (D)"
|
||||||
msgstr "Dialog (D)"
|
msgstr "Dialog (D)"
|
||||||
@ -362,7 +343,7 @@ msgid "Emergency (E)"
|
|||||||
msgstr "Notfall (E)"
|
msgstr "Notfall (E)"
|
||||||
|
|
||||||
msgid "Voice Over (VO)"
|
msgid "Voice Over (VO)"
|
||||||
msgstr "Überlagerte Stimme (VO)"
|
msgstr "Überlagerte Stimme (VO)"
|
||||||
|
|
||||||
msgid "Karaoke"
|
msgid "Karaoke"
|
||||||
msgstr "Karaoke"
|
msgstr "Karaoke"
|
||||||
|
26
po/es_ES.po
26
po/es_ES.po
@ -1,14 +1,14 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
# Copyright (C) 2007-2015 Rolf Ahrenberg
|
||||||
# This file is distributed under the same license as the femon package.
|
# This file is distributed under the same license as the femon package.
|
||||||
# Luis Palacios
|
# Luis Palacios
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
"Project-Id-Version: vdr-femon 2.2.1\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
|
||||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
|
||||||
"Last-Translator: Luis Palacios\n"
|
"Last-Translator: Luis Palacios\n"
|
||||||
"Language-Team: Spanish <vdr@linuxtv.org>\n"
|
"Language-Team: Spanish <vdr@linuxtv.org>\n"
|
||||||
"Language: es\n"
|
"Language: es\n"
|
||||||
@ -127,15 +127,6 @@ msgstr "Transpondedor"
|
|||||||
msgid "stream"
|
msgid "stream"
|
||||||
msgstr "Flujo"
|
msgstr "Flujo"
|
||||||
|
|
||||||
msgid "dBm"
|
|
||||||
msgstr "dBm"
|
|
||||||
|
|
||||||
msgid "dBuV"
|
|
||||||
msgstr "dBuV"
|
|
||||||
|
|
||||||
msgid "dBV"
|
|
||||||
msgstr "dBV"
|
|
||||||
|
|
||||||
msgid "Classic"
|
msgid "Classic"
|
||||||
msgstr "Clásico"
|
msgstr "Clásico"
|
||||||
|
|
||||||
@ -196,12 +187,6 @@ msgstr ""
|
|||||||
msgid "Define the downscale ratio for OSD size."
|
msgid "Define the downscale ratio for OSD size."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Signal level unit"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Define the used signal level unit."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Red limit [%]"
|
msgid "Red limit [%]"
|
||||||
msgstr "Límite de rojo [%s]"
|
msgstr "Límite de rojo [%s]"
|
||||||
|
|
||||||
@ -265,9 +250,6 @@ msgstr ""
|
|||||||
msgid "H.264"
|
msgid "H.264"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "H.265"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "MPEG-1 Layer I"
|
msgid "MPEG-1 Layer I"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
26
po/et_EE.po
26
po/et_EE.po
@ -1,14 +1,14 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
# Copyright (C) 2007-2015 Rolf Ahrenberg
|
||||||
# This file is distributed under the same license as the femon package.
|
# This file is distributed under the same license as the femon package.
|
||||||
# Arthur Konovalov
|
# Arthur Konovalov
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
"Project-Id-Version: vdr-femon 2.2.1\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
|
||||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
|
||||||
"Last-Translator: Arthur Konovalov\n"
|
"Last-Translator: Arthur Konovalov\n"
|
||||||
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
||||||
"Language: et\n"
|
"Language: et\n"
|
||||||
@ -127,15 +127,6 @@ msgstr "transponder"
|
|||||||
msgid "stream"
|
msgid "stream"
|
||||||
msgstr "voog"
|
msgstr "voog"
|
||||||
|
|
||||||
msgid "dBm"
|
|
||||||
msgstr "dBm"
|
|
||||||
|
|
||||||
msgid "dBuV"
|
|
||||||
msgstr "dBuV"
|
|
||||||
|
|
||||||
msgid "dBV"
|
|
||||||
msgstr "dBV"
|
|
||||||
|
|
||||||
msgid "Classic"
|
msgid "Classic"
|
||||||
msgstr "Classic"
|
msgstr "Classic"
|
||||||
|
|
||||||
@ -196,12 +187,6 @@ msgstr "Ekraanimen
|
|||||||
msgid "Define the downscale ratio for OSD size."
|
msgid "Define the downscale ratio for OSD size."
|
||||||
msgstr "Ekraanimenüü suuruse vähendamise määritlemine"
|
msgstr "Ekraanimenüü suuruse vähendamise määritlemine"
|
||||||
|
|
||||||
msgid "Signal level unit"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Define the used signal level unit."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Red limit [%]"
|
msgid "Red limit [%]"
|
||||||
msgstr "Punase limiit [%]"
|
msgstr "Punase limiit [%]"
|
||||||
|
|
||||||
@ -265,9 +250,6 @@ msgstr "MPEG-2"
|
|||||||
msgid "H.264"
|
msgid "H.264"
|
||||||
msgstr "H.264"
|
msgstr "H.264"
|
||||||
|
|
||||||
msgid "H.265"
|
|
||||||
msgstr "H.265"
|
|
||||||
|
|
||||||
msgid "MPEG-1 Layer I"
|
msgid "MPEG-1 Layer I"
|
||||||
msgstr "MPEG-1 Layet I"
|
msgstr "MPEG-1 Layet I"
|
||||||
|
|
||||||
|
31
po/fi_FI.po
31
po/fi_FI.po
@ -1,14 +1,14 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
# Copyright (C) 2007-2015 Rolf Ahrenberg
|
||||||
# This file is distributed under the same license as the femon package.
|
# This file is distributed under the same license as the femon package.
|
||||||
# Rolf Ahrenberg
|
# Rolf Ahrenberg
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
"Project-Id-Version: vdr-femon 2.2.1\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2019-10-27 16:29+0200\n"
|
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
|
||||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
|
||||||
"Last-Translator: Rolf Ahrenberg\n"
|
"Last-Translator: Rolf Ahrenberg\n"
|
||||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
||||||
"Language: fi\n"
|
"Language: fi\n"
|
||||||
@ -127,17 +127,8 @@ msgstr "transponderi"
|
|||||||
msgid "stream"
|
msgid "stream"
|
||||||
msgstr "lähete"
|
msgstr "lähete"
|
||||||
|
|
||||||
msgid "dBm"
|
|
||||||
msgstr "dBm"
|
|
||||||
|
|
||||||
msgid "dBuV"
|
|
||||||
msgstr "dBuV"
|
|
||||||
|
|
||||||
msgid "dBV"
|
|
||||||
msgstr "dBV"
|
|
||||||
|
|
||||||
msgid "Classic"
|
msgid "Classic"
|
||||||
msgstr ""
|
msgstr "Klassinen"
|
||||||
|
|
||||||
msgid "Elchi"
|
msgid "Elchi"
|
||||||
msgstr "Elchi"
|
msgstr "Elchi"
|
||||||
@ -196,12 +187,6 @@ msgstr "Pienennä näytön kokoa [%]"
|
|||||||
msgid "Define the downscale ratio for OSD size."
|
msgid "Define the downscale ratio for OSD size."
|
||||||
msgstr "Määrittele näytön pienennyssuhde."
|
msgstr "Määrittele näytön pienennyssuhde."
|
||||||
|
|
||||||
msgid "Signal level unit"
|
|
||||||
msgstr "Signaalitason yksikkö"
|
|
||||||
|
|
||||||
msgid "Define the used signal level unit."
|
|
||||||
msgstr "Määrittele yksikkö signaalin tasolle."
|
|
||||||
|
|
||||||
msgid "Red limit [%]"
|
msgid "Red limit [%]"
|
||||||
msgstr "Punaisen taso [%]"
|
msgstr "Punaisen taso [%]"
|
||||||
|
|
||||||
@ -265,9 +250,6 @@ msgstr "MPEG-2"
|
|||||||
msgid "H.264"
|
msgid "H.264"
|
||||||
msgstr "H.264"
|
msgstr "H.264"
|
||||||
|
|
||||||
msgid "H.265"
|
|
||||||
msgstr "H.265"
|
|
||||||
|
|
||||||
msgid "MPEG-1 Layer I"
|
msgid "MPEG-1 Layer I"
|
||||||
msgstr "MPEG-1 kerros I"
|
msgstr "MPEG-1 kerros I"
|
||||||
|
|
||||||
@ -405,6 +387,3 @@ msgstr "Mbit/s"
|
|||||||
|
|
||||||
msgid "kbit/s"
|
msgid "kbit/s"
|
||||||
msgstr "kbit/s"
|
msgstr "kbit/s"
|
||||||
|
|
||||||
#~ msgid "Clasxsic"
|
|
||||||
#~ msgstr "Klassinen"
|
|
||||||
|
26
po/fr_FR.po
26
po/fr_FR.po
@ -1,5 +1,5 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
# Copyright (C) 2007-2015 Rolf Ahrenberg
|
||||||
# This file is distributed under the same license as the femon package.
|
# This file is distributed under the same license as the femon package.
|
||||||
# Nicolas Huillard
|
# Nicolas Huillard
|
||||||
# Michaël Nival <mnival@club-internet.fr>, 2010
|
# Michaël Nival <mnival@club-internet.fr>, 2010
|
||||||
@ -7,10 +7,10 @@
|
|||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
"Project-Id-Version: vdr-femon 2.2.1\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
|
||||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
|
||||||
"Last-Translator: Bernard Jaulin <bernard.jaulin@gmail.com>\n"
|
"Last-Translator: Bernard Jaulin <bernard.jaulin@gmail.com>\n"
|
||||||
"Language-Team: French <vdr@linuxtv.org>\n"
|
"Language-Team: French <vdr@linuxtv.org>\n"
|
||||||
"Language: fr\n"
|
"Language: fr\n"
|
||||||
@ -129,15 +129,6 @@ msgstr "transpondeur"
|
|||||||
msgid "stream"
|
msgid "stream"
|
||||||
msgstr "flux"
|
msgstr "flux"
|
||||||
|
|
||||||
msgid "dBm"
|
|
||||||
msgstr "dBm"
|
|
||||||
|
|
||||||
msgid "dBuV"
|
|
||||||
msgstr "dBuV"
|
|
||||||
|
|
||||||
msgid "dBV"
|
|
||||||
msgstr "dBV"
|
|
||||||
|
|
||||||
msgid "Classic"
|
msgid "Classic"
|
||||||
msgstr "Classique"
|
msgstr "Classique"
|
||||||
|
|
||||||
@ -198,12 +189,6 @@ msgstr "Réduit la taille de l'OSD (%)"
|
|||||||
msgid "Define the downscale ratio for OSD size."
|
msgid "Define the downscale ratio for OSD size."
|
||||||
msgstr "Définit le ration de réduction de l'OSD."
|
msgstr "Définit le ration de réduction de l'OSD."
|
||||||
|
|
||||||
msgid "Signal level unit"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Define the used signal level unit."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Red limit [%]"
|
msgid "Red limit [%]"
|
||||||
msgstr "Limite du rouge (%)"
|
msgstr "Limite du rouge (%)"
|
||||||
|
|
||||||
@ -267,9 +252,6 @@ msgstr "MPEG-2"
|
|||||||
msgid "H.264"
|
msgid "H.264"
|
||||||
msgstr "H.264"
|
msgstr "H.264"
|
||||||
|
|
||||||
msgid "H.265"
|
|
||||||
msgstr "H.265"
|
|
||||||
|
|
||||||
msgid "MPEG-1 Layer I"
|
msgid "MPEG-1 Layer I"
|
||||||
msgstr "MPEG-1 Layer I"
|
msgstr "MPEG-1 Layer I"
|
||||||
|
|
||||||
|
26
po/hu_HU.po
26
po/hu_HU.po
@ -1,14 +1,14 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
# Copyright (C) 2007-2015 Rolf Ahrenberg
|
||||||
# This file is distributed under the same license as the femon package.
|
# This file is distributed under the same license as the femon package.
|
||||||
# Füley István <ifuley at tigercomp dot ro>, 2011
|
# Füley István <ifuley at tigercomp dot ro>, 2011
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
"Project-Id-Version: vdr-femon 2.2.1\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
|
||||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
|
||||||
"Last-Translator: Füley István <ifuley at tigercomp dot ro>\n"
|
"Last-Translator: Füley István <ifuley at tigercomp dot ro>\n"
|
||||||
"Language-Team: Hungarian <ifuley at tigercomp dot ro>\n"
|
"Language-Team: Hungarian <ifuley at tigercomp dot ro>\n"
|
||||||
"Language: hu\n"
|
"Language: hu\n"
|
||||||
@ -130,15 +130,6 @@ msgstr "transponder"
|
|||||||
msgid "stream"
|
msgid "stream"
|
||||||
msgstr "adatfolyam (stream)"
|
msgstr "adatfolyam (stream)"
|
||||||
|
|
||||||
msgid "dBm"
|
|
||||||
msgstr "dBm"
|
|
||||||
|
|
||||||
msgid "dBuV"
|
|
||||||
msgstr "dBuV"
|
|
||||||
|
|
||||||
msgid "dBV"
|
|
||||||
msgstr "dBV"
|
|
||||||
|
|
||||||
msgid "Classic"
|
msgid "Classic"
|
||||||
msgstr "Klasszikus"
|
msgstr "Klasszikus"
|
||||||
|
|
||||||
@ -199,12 +190,6 @@ msgstr "Az OSD lem
|
|||||||
msgid "Define the downscale ratio for OSD size."
|
msgid "Define the downscale ratio for OSD size."
|
||||||
msgstr "Az OSD méretének leméretezése százalékban."
|
msgstr "Az OSD méretének leméretezése százalékban."
|
||||||
|
|
||||||
msgid "Signal level unit"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Define the used signal level unit."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Red limit [%]"
|
msgid "Red limit [%]"
|
||||||
msgstr "Piros színt határa [%]"
|
msgstr "Piros színt határa [%]"
|
||||||
|
|
||||||
@ -268,9 +253,6 @@ msgstr "MPEG-2"
|
|||||||
msgid "H.264"
|
msgid "H.264"
|
||||||
msgstr "H.264"
|
msgstr "H.264"
|
||||||
|
|
||||||
msgid "H.265"
|
|
||||||
msgstr "H.265"
|
|
||||||
|
|
||||||
msgid "MPEG-1 Layer I"
|
msgid "MPEG-1 Layer I"
|
||||||
msgstr "MPEG-1 Layer I"
|
msgstr "MPEG-1 Layer I"
|
||||||
|
|
||||||
|
26
po/it_IT.po
26
po/it_IT.po
@ -1,15 +1,15 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
# Copyright (C) 2007-2015 Rolf Ahrenberg
|
||||||
# This file is distributed under the same license as the femon package.
|
# This file is distributed under the same license as the femon package.
|
||||||
# Sean Carlos
|
# Sean Carlos
|
||||||
# Diego Pierotto <vdr-italian@tiscali.it>
|
# Diego Pierotto <vdr-italian@tiscali.it>
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
"Project-Id-Version: vdr-femon 2.2.1\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
|
||||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
|
||||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
|
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
|
||||||
"Language-Team: Italian <vdr@linuxtv.org>\n"
|
"Language-Team: Italian <vdr@linuxtv.org>\n"
|
||||||
"Language: it\n"
|
"Language: it\n"
|
||||||
@ -131,15 +131,6 @@ msgstr "transponder"
|
|||||||
msgid "stream"
|
msgid "stream"
|
||||||
msgstr "flusso"
|
msgstr "flusso"
|
||||||
|
|
||||||
msgid "dBm"
|
|
||||||
msgstr "dBm"
|
|
||||||
|
|
||||||
msgid "dBuV"
|
|
||||||
msgstr "dBuV"
|
|
||||||
|
|
||||||
msgid "dBV"
|
|
||||||
msgstr "dBV"
|
|
||||||
|
|
||||||
msgid "Classic"
|
msgid "Classic"
|
||||||
msgstr "Classico"
|
msgstr "Classico"
|
||||||
|
|
||||||
@ -200,12 +191,6 @@ msgstr "Riduci dimensione OSD [%]"
|
|||||||
msgid "Define the downscale ratio for OSD size."
|
msgid "Define the downscale ratio for OSD size."
|
||||||
msgstr "Definisci il rapporto di riduzione della dimensione OSD."
|
msgstr "Definisci il rapporto di riduzione della dimensione OSD."
|
||||||
|
|
||||||
msgid "Signal level unit"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Define the used signal level unit."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Red limit [%]"
|
msgid "Red limit [%]"
|
||||||
msgstr "Limite rosso [%]"
|
msgstr "Limite rosso [%]"
|
||||||
|
|
||||||
@ -269,9 +254,6 @@ msgstr "MPEG-2"
|
|||||||
msgid "H.264"
|
msgid "H.264"
|
||||||
msgstr "H.264"
|
msgstr "H.264"
|
||||||
|
|
||||||
msgid "H.265"
|
|
||||||
msgstr "H.265"
|
|
||||||
|
|
||||||
msgid "MPEG-1 Layer I"
|
msgid "MPEG-1 Layer I"
|
||||||
msgstr "MPEG-1 Layer I"
|
msgstr "MPEG-1 Layer I"
|
||||||
|
|
||||||
|
26
po/lt_LT.po
26
po/lt_LT.po
@ -1,14 +1,14 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
# Copyright (C) 2007-2015 Rolf Ahrenberg
|
||||||
# This file is distributed under the same license as the femon package.
|
# This file is distributed under the same license as the femon package.
|
||||||
# Valdemaras Pipiras
|
# Valdemaras Pipiras
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
"Project-Id-Version: vdr-femon 2.2.1\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
|
||||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
|
||||||
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
|
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
|
||||||
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
||||||
"Language: lt\n"
|
"Language: lt\n"
|
||||||
@ -127,15 +127,6 @@ msgstr "Siųstuvas"
|
|||||||
msgid "stream"
|
msgid "stream"
|
||||||
msgstr "Srautas"
|
msgstr "Srautas"
|
||||||
|
|
||||||
msgid "dBm"
|
|
||||||
msgstr "dBm"
|
|
||||||
|
|
||||||
msgid "dBuV"
|
|
||||||
msgstr "dBuV"
|
|
||||||
|
|
||||||
msgid "dBV"
|
|
||||||
msgstr "dBV"
|
|
||||||
|
|
||||||
msgid "Classic"
|
msgid "Classic"
|
||||||
msgstr "Klasikinis"
|
msgstr "Klasikinis"
|
||||||
|
|
||||||
@ -196,12 +187,6 @@ msgstr "Sumažinti ekrano užsklandos (OSD) dydį [%]"
|
|||||||
msgid "Define the downscale ratio for OSD size."
|
msgid "Define the downscale ratio for OSD size."
|
||||||
msgstr "Nustatyti ekrano užsklandos (OSD) mažinimo santykį."
|
msgstr "Nustatyti ekrano užsklandos (OSD) mažinimo santykį."
|
||||||
|
|
||||||
msgid "Signal level unit"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Define the used signal level unit."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Red limit [%]"
|
msgid "Red limit [%]"
|
||||||
msgstr "Raudonoji ribą [%]"
|
msgstr "Raudonoji ribą [%]"
|
||||||
|
|
||||||
@ -265,9 +250,6 @@ msgstr "MPEG-2"
|
|||||||
msgid "H.264"
|
msgid "H.264"
|
||||||
msgstr "H.264"
|
msgstr "H.264"
|
||||||
|
|
||||||
msgid "H.265"
|
|
||||||
msgstr "H.265"
|
|
||||||
|
|
||||||
msgid "MPEG-1 Layer I"
|
msgid "MPEG-1 Layer I"
|
||||||
msgstr "MPEG-1 Layer I"
|
msgstr "MPEG-1 Layer I"
|
||||||
|
|
||||||
|
408
po/pl_PL.po
408
po/pl_PL.po
@ -1,408 +0,0 @@
|
|||||||
# VDR plugin language source file.
|
|
||||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
|
||||||
# This file is distributed under the same license as the vdr-femon package.
|
|
||||||
# Tomasz Maciej Nowak, 2017.
|
|
||||||
#
|
|
||||||
msgid ""
|
|
||||||
msgstr ""
|
|
||||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
|
||||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
|
||||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
|
||||||
"Last-Translator: Tomasz Maciej Nowak <tomek_n@o2.pl>\n"
|
|
||||||
"Language-Team: Polish <vdr@linuxtv.org>\n"
|
|
||||||
"Language: pl_PL\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"X-Generator: Poedit 1.8.11\n"
|
|
||||||
|
|
||||||
msgid "DVB Signal Information Monitor (OSD)"
|
|
||||||
msgstr "Monitor sygnału DVB (OSD)"
|
|
||||||
|
|
||||||
msgid "Signal Information"
|
|
||||||
msgstr "Informacja o sygnale"
|
|
||||||
|
|
||||||
msgid "Femon not available"
|
|
||||||
msgstr "Femon niedostępny"
|
|
||||||
|
|
||||||
msgid "Video"
|
|
||||||
msgstr "Obraz"
|
|
||||||
|
|
||||||
msgid "AC-3"
|
|
||||||
msgstr "AC-3"
|
|
||||||
|
|
||||||
msgid "Audio"
|
|
||||||
msgstr "Dźwięk"
|
|
||||||
|
|
||||||
msgid "Transponder Information"
|
|
||||||
msgstr "Informacje o transponderze"
|
|
||||||
|
|
||||||
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 "Sprawność kodowania"
|
|
||||||
|
|
||||||
msgid "Protocol"
|
|
||||||
msgstr "Protokół"
|
|
||||||
|
|
||||||
msgid "Bitrate"
|
|
||||||
msgstr "Przepływność"
|
|
||||||
|
|
||||||
msgid "Stream Information"
|
|
||||||
msgstr "Informacje o strumieniu"
|
|
||||||
|
|
||||||
msgid "Video Stream"
|
|
||||||
msgstr "Strumień obrazu"
|
|
||||||
|
|
||||||
msgid "Codec"
|
|
||||||
msgstr "Kodek"
|
|
||||||
|
|
||||||
msgid "Aspect Ratio"
|
|
||||||
msgstr "Proporcje obrazu"
|
|
||||||
|
|
||||||
msgid "Frame Rate"
|
|
||||||
msgstr "Tempo wyświetlania klatek"
|
|
||||||
|
|
||||||
msgid "Video Format"
|
|
||||||
msgstr "Format obrazu"
|
|
||||||
|
|
||||||
msgid "Resolution"
|
|
||||||
msgstr "Rozdzielczość"
|
|
||||||
|
|
||||||
msgid "Audio Stream"
|
|
||||||
msgstr "Strumień dźwięku"
|
|
||||||
|
|
||||||
msgid "Channel Mode"
|
|
||||||
msgstr "Tryb kanału"
|
|
||||||
|
|
||||||
msgid "Sampling Frequency"
|
|
||||||
msgstr "Częstotliwość próbkowania"
|
|
||||||
|
|
||||||
msgid "AC-3 Stream"
|
|
||||||
msgstr "Strumień AC-3"
|
|
||||||
|
|
||||||
msgid "Bit Stream Mode"
|
|
||||||
msgstr "Tryb strumienia bitów"
|
|
||||||
|
|
||||||
msgid "Audio Coding Mode"
|
|
||||||
msgstr "Tryb kodowania dźwięku"
|
|
||||||
|
|
||||||
msgid "Center Mix Level"
|
|
||||||
msgstr "Poziom Center Mix"
|
|
||||||
|
|
||||||
msgid "Surround Mix Level"
|
|
||||||
msgstr "Poziom Surround Mix"
|
|
||||||
|
|
||||||
msgid "Dolby Surround Mode"
|
|
||||||
msgstr "Tryb Dolby Surround"
|
|
||||||
|
|
||||||
msgid "Low Frequency Effects"
|
|
||||||
msgstr "Efekty niskich frekwencji"
|
|
||||||
|
|
||||||
msgid "Dialogue Normalization"
|
|
||||||
msgstr "Normalizacja dialogów"
|
|
||||||
|
|
||||||
msgid "basic"
|
|
||||||
msgstr "podstawowy"
|
|
||||||
|
|
||||||
msgid "transponder"
|
|
||||||
msgstr "transponder"
|
|
||||||
|
|
||||||
msgid "stream"
|
|
||||||
msgstr "strumień"
|
|
||||||
|
|
||||||
msgid "dBm"
|
|
||||||
msgstr "dBm"
|
|
||||||
|
|
||||||
msgid "dBuV"
|
|
||||||
msgstr "dBuV"
|
|
||||||
|
|
||||||
msgid "dBV"
|
|
||||||
msgstr "dBV"
|
|
||||||
|
|
||||||
msgid "Classic"
|
|
||||||
msgstr "Klasyczna"
|
|
||||||
|
|
||||||
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 "PearlHD"
|
|
||||||
msgstr "PearlHD"
|
|
||||||
|
|
||||||
msgid "Hide main menu entry"
|
|
||||||
msgstr "Ukryj pozycję w głównym menu"
|
|
||||||
|
|
||||||
msgid "Define whether the main menu entry is hidden."
|
|
||||||
msgstr "Określa czy pozycja w głównym menu jest ukryta."
|
|
||||||
|
|
||||||
msgid "Default display mode"
|
|
||||||
msgstr "Domyślny tryb wyświetlania"
|
|
||||||
|
|
||||||
msgid "Define the default display mode at startup."
|
|
||||||
msgstr "Określa domyślny tryb wyświetlania przy uruchamianiu."
|
|
||||||
|
|
||||||
msgid "Define the used OSD skin."
|
|
||||||
msgstr "Określa używaną skórkę OSD."
|
|
||||||
|
|
||||||
msgid "Define the used OSD theme."
|
|
||||||
msgstr "Określa używany motyw OSD."
|
|
||||||
|
|
||||||
msgid "Position"
|
|
||||||
msgstr "Pozycja"
|
|
||||||
|
|
||||||
msgid "Define the position of OSD."
|
|
||||||
msgstr "Określa pozycję OSD."
|
|
||||||
|
|
||||||
msgid "Downscale OSD size [%]"
|
|
||||||
msgstr "Zmniejsz rozmiar OSD [%]"
|
|
||||||
|
|
||||||
msgid "Define the downscale ratio for OSD size."
|
|
||||||
msgstr "Określa procent zmniejszenia OSD."
|
|
||||||
|
|
||||||
msgid "Signal level unit"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Define the used signal level unit."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Red limit [%]"
|
|
||||||
msgstr "Czerwony - zakres [%]"
|
|
||||||
|
|
||||||
msgid "Define a limit for red bar, which is used to indicate a bad signal."
|
|
||||||
msgstr "Określa zakres czerwonego paska, pokazującego zły sygnał."
|
|
||||||
|
|
||||||
msgid "Green limit [%]"
|
|
||||||
msgstr "Zielony - zakres [%]"
|
|
||||||
|
|
||||||
msgid "Define a limit for green bar, which is used to indicate a good signal."
|
|
||||||
msgstr "Określa zakres zielonego paska, pokazującego dobry sygnał."
|
|
||||||
|
|
||||||
msgid "OSD update interval [0.1s]"
|
|
||||||
msgstr "Interwał aktualizacji OSD [0,1s]"
|
|
||||||
|
|
||||||
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
|
|
||||||
msgstr "Określa interwał aktualizacji danych w OSD. Mniejszy interwał generuje większe obciążenie CPU."
|
|
||||||
|
|
||||||
msgid "Analyze stream"
|
|
||||||
msgstr "Analiza strumienia"
|
|
||||||
|
|
||||||
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
|
|
||||||
msgstr "Określa czy strumień DVB jest analizowany a przepływność obliczana."
|
|
||||||
|
|
||||||
msgid "Calculation interval [0.1s]"
|
|
||||||
msgstr "Interwał obliczeń [0,1s]"
|
|
||||||
|
|
||||||
msgid "Define an interval for calculation. The bigger interval generates more stable values."
|
|
||||||
msgstr "Określa interwał obliczeń. Większy interwał generuje stabilniejsze wartości."
|
|
||||||
|
|
||||||
msgid "Use SVDRP service"
|
|
||||||
msgstr "Używaj usługi SVDRP"
|
|
||||||
|
|
||||||
msgid "Define whether the SVDRP service is used in client/server setups."
|
|
||||||
msgstr "Określa czy używać usługi SVDRP w kownfiguracjach serwer/klient."
|
|
||||||
|
|
||||||
msgid "SVDRP service port"
|
|
||||||
msgstr "Port usługi SVDRP"
|
|
||||||
|
|
||||||
msgid "Define the port number of SVDRP service."
|
|
||||||
msgstr "Określa numer portu usługi SVDRP."
|
|
||||||
|
|
||||||
msgid "SVDRP service IP"
|
|
||||||
msgstr "IP usługi SVDRP"
|
|
||||||
|
|
||||||
msgid "Define the IP address of SVDRP service."
|
|
||||||
msgstr "Określa adres IP usługi SVDRP."
|
|
||||||
|
|
||||||
msgid "Help"
|
|
||||||
msgstr "Pomoc"
|
|
||||||
|
|
||||||
msgid "Fixed"
|
|
||||||
msgstr "Stały"
|
|
||||||
|
|
||||||
msgid "Analog"
|
|
||||||
msgstr "Analog"
|
|
||||||
|
|
||||||
msgid "MPEG-2"
|
|
||||||
msgstr "MPEG-2"
|
|
||||||
|
|
||||||
msgid "H.264"
|
|
||||||
msgstr "H.264"
|
|
||||||
|
|
||||||
msgid "H.265"
|
|
||||||
msgstr "H.265"
|
|
||||||
|
|
||||||
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 "połączone stereo"
|
|
||||||
|
|
||||||
msgid "dual"
|
|
||||||
msgstr "podwójne"
|
|
||||||
|
|
||||||
msgid "mono"
|
|
||||||
msgstr "mono"
|
|
||||||
|
|
||||||
msgid "interlaced"
|
|
||||||
msgstr "z przeplotem"
|
|
||||||
|
|
||||||
msgid "progressive"
|
|
||||||
msgstr "progresywne"
|
|
||||||
|
|
||||||
msgid "reserved"
|
|
||||||
msgstr "zamknięte"
|
|
||||||
|
|
||||||
msgid "extended"
|
|
||||||
msgstr "rozszerzone"
|
|
||||||
|
|
||||||
msgid "unknown"
|
|
||||||
msgstr "nieznane"
|
|
||||||
|
|
||||||
msgid "component"
|
|
||||||
msgstr "komponent"
|
|
||||||
|
|
||||||
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 "Complete Main (CM)"
|
|
||||||
|
|
||||||
msgid "Music and Effects (ME)"
|
|
||||||
msgstr "Muzyka i efekty (ME)"
|
|
||||||
|
|
||||||
msgid "Visually Impaired (VI)"
|
|
||||||
msgstr "Upośledzone wzrokowo (VI)"
|
|
||||||
|
|
||||||
msgid "Hearing Impaired (HI)"
|
|
||||||
msgstr "Upośledzone słuchowo (HI)"
|
|
||||||
|
|
||||||
msgid "Dialogue (D)"
|
|
||||||
msgstr "Dialog (D)"
|
|
||||||
|
|
||||||
msgid "Commentary (C)"
|
|
||||||
msgstr "Komentarz (C)"
|
|
||||||
|
|
||||||
msgid "Emergency (E)"
|
|
||||||
msgstr "Nagły wypadek (E)"
|
|
||||||
|
|
||||||
msgid "Voice Over (VO)"
|
|
||||||
msgstr "Naniesiony głos (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 "nie podano"
|
|
||||||
|
|
||||||
msgid "MHz"
|
|
||||||
msgstr "MHz"
|
|
||||||
|
|
||||||
msgid "free"
|
|
||||||
msgstr "wolne"
|
|
||||||
|
|
||||||
msgid "Mbit/s"
|
|
||||||
msgstr "Mbit/s"
|
|
||||||
|
|
||||||
msgid "kbit/s"
|
|
||||||
msgstr "kbit/s"
|
|
26
po/ru_RU.po
26
po/ru_RU.po
@ -1,14 +1,14 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
# Copyright (C) 2007-2015 Rolf Ahrenberg
|
||||||
# This file is distributed under the same license as the femon package.
|
# This file is distributed under the same license as the femon package.
|
||||||
# Vyacheslav Dikonov
|
# Vyacheslav Dikonov
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
"Project-Id-Version: vdr-femon 2.2.1\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
|
||||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
|
||||||
"Last-Translator: Vyacheslav Dikonov\n"
|
"Last-Translator: Vyacheslav Dikonov\n"
|
||||||
"Language-Team: Russian <vdr@linuxtv.org>\n"
|
"Language-Team: Russian <vdr@linuxtv.org>\n"
|
||||||
"Language: ru\n"
|
"Language: ru\n"
|
||||||
@ -127,15 +127,6 @@ msgstr ""
|
|||||||
msgid "stream"
|
msgid "stream"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "dBm"
|
|
||||||
msgstr "dBm"
|
|
||||||
|
|
||||||
msgid "dBuV"
|
|
||||||
msgstr "dBuV"
|
|
||||||
|
|
||||||
msgid "dBV"
|
|
||||||
msgstr "dBV"
|
|
||||||
|
|
||||||
msgid "Classic"
|
msgid "Classic"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
@ -196,12 +187,6 @@ msgstr ""
|
|||||||
msgid "Define the downscale ratio for OSD size."
|
msgid "Define the downscale ratio for OSD size."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Signal level unit"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Define the used signal level unit."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Red limit [%]"
|
msgid "Red limit [%]"
|
||||||
msgstr "ºàÐáÝÐï ×ÞÝÐ áÛÐÑÞÓÞ áØÓÝÐÛÐ ÔÞ (%)"
|
msgstr "ºàÐáÝÐï ×ÞÝÐ áÛÐÑÞÓÞ áØÓÝÐÛÐ ÔÞ (%)"
|
||||||
|
|
||||||
@ -265,9 +250,6 @@ msgstr ""
|
|||||||
msgid "H.264"
|
msgid "H.264"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "H.265"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "MPEG-1 Layer I"
|
msgid "MPEG-1 Layer I"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
26
po/sk_SK.po
26
po/sk_SK.po
@ -1,14 +1,14 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
# Copyright (C) 2007-2015 Rolf Ahrenberg
|
||||||
# This file is distributed under the same license as the femon package.
|
# This file is distributed under the same license as the femon package.
|
||||||
# Milan Hrala
|
# Milan Hrala
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
"Project-Id-Version: vdr-femon 2.2.1\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
|
||||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
|
||||||
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
|
||||||
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
"Language-Team: Slovak <vdr@linuxtv.org>\n"
|
||||||
"Language: sk\n"
|
"Language: sk\n"
|
||||||
@ -127,15 +127,6 @@ msgstr "Transpond
|
|||||||
msgid "stream"
|
msgid "stream"
|
||||||
msgstr "dátový tok"
|
msgstr "dátový tok"
|
||||||
|
|
||||||
msgid "dBm"
|
|
||||||
msgstr "dBm"
|
|
||||||
|
|
||||||
msgid "dBuV"
|
|
||||||
msgstr "dBuV"
|
|
||||||
|
|
||||||
msgid "dBV"
|
|
||||||
msgstr "dBV"
|
|
||||||
|
|
||||||
msgid "Classic"
|
msgid "Classic"
|
||||||
msgstr "Klasický"
|
msgstr "Klasický"
|
||||||
|
|
||||||
@ -196,12 +187,6 @@ msgstr "Zmen
|
|||||||
msgid "Define the downscale ratio for OSD size."
|
msgid "Define the downscale ratio for OSD size."
|
||||||
msgstr "Zadajte zmen¹enie pomeru pre OSD veµkosti."
|
msgstr "Zadajte zmen¹enie pomeru pre OSD veµkosti."
|
||||||
|
|
||||||
msgid "Signal level unit"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Define the used signal level unit."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Red limit [%]"
|
msgid "Red limit [%]"
|
||||||
msgstr "Èervený limit [%]"
|
msgstr "Èervený limit [%]"
|
||||||
|
|
||||||
@ -265,9 +250,6 @@ msgstr "MPEG-2"
|
|||||||
msgid "H.264"
|
msgid "H.264"
|
||||||
msgstr "H.264"
|
msgstr "H.264"
|
||||||
|
|
||||||
msgid "H.265"
|
|
||||||
msgstr "H.265"
|
|
||||||
|
|
||||||
msgid "MPEG-1 Layer I"
|
msgid "MPEG-1 Layer I"
|
||||||
msgstr "MPEG-1 vrstva I"
|
msgstr "MPEG-1 vrstva I"
|
||||||
|
|
||||||
|
24
po/uk_UA.po
24
po/uk_UA.po
@ -4,10 +4,10 @@
|
|||||||
# Yarema aka Knedlyk <yupadmin@gmail.com>, 2010.
|
# Yarema aka Knedlyk <yupadmin@gmail.com>, 2010.
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
"Project-Id-Version: vdr-femon 2.2.1\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
|
||||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
|
||||||
"Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n"
|
"Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n"
|
||||||
"Language-Team: Ukrainian <translation@linux.org.ua>\n"
|
"Language-Team: Ukrainian <translation@linux.org.ua>\n"
|
||||||
"Language: uk\n"
|
"Language: uk\n"
|
||||||
@ -127,15 +127,6 @@ msgstr "транспондер"
|
|||||||
msgid "stream"
|
msgid "stream"
|
||||||
msgstr "потік"
|
msgstr "потік"
|
||||||
|
|
||||||
msgid "dBm"
|
|
||||||
msgstr "dBm"
|
|
||||||
|
|
||||||
msgid "dBuV"
|
|
||||||
msgstr "dBuV"
|
|
||||||
|
|
||||||
msgid "dBV"
|
|
||||||
msgstr "dBV"
|
|
||||||
|
|
||||||
msgid "Classic"
|
msgid "Classic"
|
||||||
msgstr "Класичний"
|
msgstr "Класичний"
|
||||||
|
|
||||||
@ -196,12 +187,6 @@ msgstr "Масштаб розміру повідомлень [%]"
|
|||||||
msgid "Define the downscale ratio for OSD size."
|
msgid "Define the downscale ratio for OSD size."
|
||||||
msgstr "Визначити коефіцієнт масштабування розміру повідомлень"
|
msgstr "Визначити коефіцієнт масштабування розміру повідомлень"
|
||||||
|
|
||||||
msgid "Signal level unit"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Define the used signal level unit."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Red limit [%]"
|
msgid "Red limit [%]"
|
||||||
msgstr "Червона границя [%]"
|
msgstr "Червона границя [%]"
|
||||||
|
|
||||||
@ -265,9 +250,6 @@ msgstr "MPEG-2"
|
|||||||
msgid "H.264"
|
msgid "H.264"
|
||||||
msgstr "H.264"
|
msgstr "H.264"
|
||||||
|
|
||||||
msgid "H.265"
|
|
||||||
msgstr "H.265"
|
|
||||||
|
|
||||||
msgid "MPEG-1 Layer I"
|
msgid "MPEG-1 Layer I"
|
||||||
msgstr "MPEG-1 Layer I"
|
msgstr "MPEG-1 Layer I"
|
||||||
|
|
||||||
|
26
po/zh_CN.po
26
po/zh_CN.po
@ -1,14 +1,14 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
# Copyright (C) 2007-2015 Rolf Ahrenberg
|
||||||
# This file is distributed under the same license as the femon package.
|
# This file is distributed under the same license as the femon package.
|
||||||
# Nan Feng VDR <nfgx@21cn.com>, 2009.2
|
# Nan Feng VDR <nfgx@21cn.com>, 2009.2
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
"Project-Id-Version: vdr-femon 2.2.1\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
|
||||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
|
||||||
"Last-Translator: NanFeng <nfgx@21cn.com>\n"
|
"Last-Translator: NanFeng <nfgx@21cn.com>\n"
|
||||||
"Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n"
|
"Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n"
|
||||||
"Language: zh_CN\n"
|
"Language: zh_CN\n"
|
||||||
@ -127,15 +127,6 @@ msgstr "转发器"
|
|||||||
msgid "stream"
|
msgid "stream"
|
||||||
msgstr "数据流"
|
msgstr "数据流"
|
||||||
|
|
||||||
msgid "dBm"
|
|
||||||
msgstr "dBm"
|
|
||||||
|
|
||||||
msgid "dBuV"
|
|
||||||
msgstr "dBuV"
|
|
||||||
|
|
||||||
msgid "dBV"
|
|
||||||
msgstr "dBV"
|
|
||||||
|
|
||||||
msgid "Classic"
|
msgid "Classic"
|
||||||
msgstr "经典"
|
msgstr "经典"
|
||||||
|
|
||||||
@ -196,12 +187,6 @@ msgstr ""
|
|||||||
msgid "Define the downscale ratio for OSD size."
|
msgid "Define the downscale ratio for OSD size."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Signal level unit"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Define the used signal level unit."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Red limit [%]"
|
msgid "Red limit [%]"
|
||||||
msgstr "红限制[ % ]"
|
msgstr "红限制[ % ]"
|
||||||
|
|
||||||
@ -265,9 +250,6 @@ msgstr "MPEG-2"
|
|||||||
msgid "H.264"
|
msgid "H.264"
|
||||||
msgstr "H.264"
|
msgstr "H.264"
|
||||||
|
|
||||||
msgid "H.265"
|
|
||||||
msgstr "H.265"
|
|
||||||
|
|
||||||
msgid "MPEG-1 Layer I"
|
msgid "MPEG-1 Layer I"
|
||||||
msgstr "MPEG-1 Layer I"
|
msgstr "MPEG-1 Layer I"
|
||||||
|
|
||||||
|
26
po/zh_TW.po
26
po/zh_TW.po
@ -1,14 +1,14 @@
|
|||||||
# VDR plugin language source file.
|
# VDR plugin language source file.
|
||||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
# Copyright (C) 2007-2015 Rolf Ahrenberg
|
||||||
# This file is distributed under the same license as the femon package.
|
# This file is distributed under the same license as the femon package.
|
||||||
# Nan Feng VDR <nfgx@21cn.com>, 2009.2
|
# Nan Feng VDR <nfgx@21cn.com>, 2009.2
|
||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
"Project-Id-Version: vdr-femon 2.2.1\n"
|
||||||
"Report-Msgid-Bugs-To: <see README>\n"
|
"Report-Msgid-Bugs-To: <see README>\n"
|
||||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
"POT-Creation-Date: 2015-04-04 04:04+0300\n"
|
||||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
"PO-Revision-Date: 2015-04-04 04:04+0300\n"
|
||||||
"Last-Translator: NanFeng <nfgx@21cn.com>\n"
|
"Last-Translator: NanFeng <nfgx@21cn.com>\n"
|
||||||
"Language-Team: Chinese (traditional) <vdr@linuxtv.org>\n"
|
"Language-Team: Chinese (traditional) <vdr@linuxtv.org>\n"
|
||||||
"Language: zh_TW\n"
|
"Language: zh_TW\n"
|
||||||
@ -127,15 +127,6 @@ msgstr "轉發器"
|
|||||||
msgid "stream"
|
msgid "stream"
|
||||||
msgstr "數據流"
|
msgstr "數據流"
|
||||||
|
|
||||||
msgid "dBm"
|
|
||||||
msgstr "dBm"
|
|
||||||
|
|
||||||
msgid "dBuV"
|
|
||||||
msgstr "dBuV"
|
|
||||||
|
|
||||||
msgid "dBV"
|
|
||||||
msgstr "dBV"
|
|
||||||
|
|
||||||
msgid "Classic"
|
msgid "Classic"
|
||||||
msgstr "經典"
|
msgstr "經典"
|
||||||
|
|
||||||
@ -196,12 +187,6 @@ msgstr ""
|
|||||||
msgid "Define the downscale ratio for OSD size."
|
msgid "Define the downscale ratio for OSD size."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "Signal level unit"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Define the used signal level unit."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "Red limit [%]"
|
msgid "Red limit [%]"
|
||||||
msgstr "紅限制[ % ]"
|
msgstr "紅限制[ % ]"
|
||||||
|
|
||||||
@ -265,9 +250,6 @@ msgstr "MPEG-2"
|
|||||||
msgid "H.264"
|
msgid "H.264"
|
||||||
msgstr "H.264"
|
msgstr "H.264"
|
||||||
|
|
||||||
msgid "H.265"
|
|
||||||
msgstr "H.265"
|
|
||||||
|
|
||||||
msgid "MPEG-1 Layer I"
|
msgid "MPEG-1 Layer I"
|
||||||
msgstr "MPEG-1 Layer I"
|
msgstr "MPEG-1 Layer I"
|
||||||
|
|
||||||
|
11
receiver.c
11
receiver.c
@ -19,7 +19,6 @@ cFemonReceiver::cFemonReceiver(const cChannel *channelP, int aTrackP, int dTrack
|
|||||||
sleepM(),
|
sleepM(),
|
||||||
activeM(false),
|
activeM(false),
|
||||||
detectH264M(this),
|
detectH264M(this),
|
||||||
detectH265M(this),
|
|
||||||
detectMpegM(this, this),
|
detectMpegM(this, this),
|
||||||
detectAacM(this),
|
detectAacM(this),
|
||||||
detectLatmM(this),
|
detectLatmM(this),
|
||||||
@ -102,7 +101,7 @@ void cFemonReceiver::Activate(bool onP)
|
|||||||
Deactivate();
|
Deactivate();
|
||||||
}
|
}
|
||||||
|
|
||||||
void cFemonReceiver::Receive(const uchar *dataP, int lengthP)
|
void cFemonReceiver::Receive(uchar *dataP, int lengthP)
|
||||||
{
|
{
|
||||||
// TS packet length: TS_SIZE
|
// TS packet length: TS_SIZE
|
||||||
if (Running() && (*dataP == TS_SYNC_BYTE) && (lengthP == TS_SIZE)) {
|
if (Running() && (*dataP == TS_SYNC_BYTE) && (lengthP == TS_SIZE)) {
|
||||||
@ -164,18 +163,12 @@ void cFemonReceiver::Action(void)
|
|||||||
processed = true;
|
processed = true;
|
||||||
if (TsPayloadStart(Data)) {
|
if (TsPayloadStart(Data)) {
|
||||||
while (const uint8_t *p = videoAssemblerM.GetPes(len)) {
|
while (const uint8_t *p = videoAssemblerM.GetPes(len)) {
|
||||||
if (videoTypeM == 0x1B) {
|
if (videoTypeM == 0x1B) { // MPEG4
|
||||||
if (detectH264M.processVideo(p, len)) {
|
if (detectH264M.processVideo(p, len)) {
|
||||||
videoValidM = true;
|
videoValidM = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (videoTypeM == 0x24) {
|
|
||||||
if (detectH265M.processVideo(p, len)) {
|
|
||||||
videoValidM = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
else {
|
||||||
if (detectMpegM.processVideo(p, len)) {
|
if (detectMpegM.processVideo(p, len)) {
|
||||||
videoValidM = true;
|
videoValidM = true;
|
||||||
|
@ -15,7 +15,6 @@
|
|||||||
#include "ac3.h"
|
#include "ac3.h"
|
||||||
#include "audio.h"
|
#include "audio.h"
|
||||||
#include "h264.h"
|
#include "h264.h"
|
||||||
#include "h265.h"
|
|
||||||
#include "latm.h"
|
#include "latm.h"
|
||||||
#include "mpeg.h"
|
#include "mpeg.h"
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
@ -28,7 +27,6 @@ private:
|
|||||||
bool activeM;
|
bool activeM;
|
||||||
|
|
||||||
cFemonH264 detectH264M;
|
cFemonH264 detectH264M;
|
||||||
cFemonH265 detectH265M;
|
|
||||||
cFemonMPEG detectMpegM;
|
cFemonMPEG detectMpegM;
|
||||||
cFemonAAC detectAacM;
|
cFemonAAC detectAacM;
|
||||||
cFemonLATM detectLatmM;
|
cFemonLATM detectLatmM;
|
||||||
@ -61,7 +59,7 @@ private:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void Activate(bool onP);
|
virtual void Activate(bool onP);
|
||||||
virtual void Receive(const uchar *dataP, int lengthP);
|
virtual void Receive(uchar *dataP, int lengthP);
|
||||||
virtual void Action(void);
|
virtual void Action(void);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
10
setup.c
10
setup.c
@ -19,7 +19,6 @@ cMenuFemonSetup::cMenuFemonSetup()
|
|||||||
themeM(FemonConfig.GetTheme()),
|
themeM(FemonConfig.GetTheme()),
|
||||||
positionM(FemonConfig.GetPosition()),
|
positionM(FemonConfig.GetPosition()),
|
||||||
downscaleM(FemonConfig.GetDownscale()),
|
downscaleM(FemonConfig.GetDownscale()),
|
||||||
signalUnitM(FemonConfig.GetSignalUnit()),
|
|
||||||
redLimitM(FemonConfig.GetRedLimit()),
|
redLimitM(FemonConfig.GetRedLimit()),
|
||||||
greenLimitM(FemonConfig.GetGreenLimit()),
|
greenLimitM(FemonConfig.GetGreenLimit()),
|
||||||
updateIntervalM(FemonConfig.GetUpdateInterval()),
|
updateIntervalM(FemonConfig.GetUpdateInterval()),
|
||||||
@ -36,10 +35,6 @@ cMenuFemonSetup::cMenuFemonSetup()
|
|||||||
dispModesM[eFemonModeStream] = tr("stream");
|
dispModesM[eFemonModeStream] = tr("stream");
|
||||||
dispModesM[eFemonModeAC3] = tr("AC-3");
|
dispModesM[eFemonModeAC3] = tr("AC-3");
|
||||||
|
|
||||||
signalUnitsM[eFemonSignalUnitdBm] = tr("dBm");
|
|
||||||
signalUnitsM[eFemonSignalUnitdBuV] = tr("dBuV");
|
|
||||||
signalUnitsM[eFemonSignalUnitdBV] = tr("dBV");
|
|
||||||
|
|
||||||
skinsM[eFemonSkinClassic] = tr("Classic");
|
skinsM[eFemonSkinClassic] = tr("Classic");
|
||||||
skinsM[eFemonSkinElchi] = tr("Elchi");
|
skinsM[eFemonSkinElchi] = tr("Elchi");
|
||||||
|
|
||||||
@ -83,9 +78,6 @@ void cMenuFemonSetup::Setup(void)
|
|||||||
Add(new cMenuEditIntItem(tr("Downscale OSD size [%]"), &downscaleM, 0, 20));
|
Add(new cMenuEditIntItem(tr("Downscale OSD size [%]"), &downscaleM, 0, 20));
|
||||||
helpM.Append(tr("Define the downscale ratio for OSD size."));
|
helpM.Append(tr("Define the downscale ratio for OSD size."));
|
||||||
|
|
||||||
Add(new cMenuEditStraItem(tr("Signal level unit"), &signalUnitM, eFemonSignalUnitMaxNumber, signalUnitsM));
|
|
||||||
helpM.Append(tr("Define the used signal level unit."));
|
|
||||||
|
|
||||||
Add(new cMenuEditIntItem(tr("Red limit [%]"), &redLimitM, 1, 50));
|
Add(new cMenuEditIntItem(tr("Red limit [%]"), &redLimitM, 1, 50));
|
||||||
helpM.Append(tr("Define a limit for red bar, which is used to indicate a bad signal."));
|
helpM.Append(tr("Define a limit for red bar, which is used to indicate a bad signal."));
|
||||||
|
|
||||||
@ -128,7 +120,6 @@ void cMenuFemonSetup::Store(void)
|
|||||||
SetupStore("Theme", themeM);
|
SetupStore("Theme", themeM);
|
||||||
SetupStore("Position", positionM);
|
SetupStore("Position", positionM);
|
||||||
SetupStore("Downscale", downscaleM);
|
SetupStore("Downscale", downscaleM);
|
||||||
SetupStore("SignalUnit", signalUnitM);
|
|
||||||
SetupStore("RedLimit", redLimitM);
|
SetupStore("RedLimit", redLimitM);
|
||||||
SetupStore("GreenLimit", greenLimitM);
|
SetupStore("GreenLimit", greenLimitM);
|
||||||
SetupStore("UpdateInterval", updateIntervalM);
|
SetupStore("UpdateInterval", updateIntervalM);
|
||||||
@ -144,7 +135,6 @@ void cMenuFemonSetup::Store(void)
|
|||||||
FemonConfig.SetTheme(themeM);
|
FemonConfig.SetTheme(themeM);
|
||||||
FemonConfig.SetPosition(positionM);
|
FemonConfig.SetPosition(positionM);
|
||||||
FemonConfig.SetDownscale(downscaleM);
|
FemonConfig.SetDownscale(downscaleM);
|
||||||
FemonConfig.SetSignalUnit(signalUnitM);
|
|
||||||
FemonConfig.SetRedLimit(redLimitM);
|
FemonConfig.SetRedLimit(redLimitM);
|
||||||
FemonConfig.SetGreenLimit(greenLimitM);
|
FemonConfig.SetGreenLimit(greenLimitM);
|
||||||
FemonConfig.SetUpdateInterval(updateIntervalM);
|
FemonConfig.SetUpdateInterval(updateIntervalM);
|
||||||
|
2
setup.h
2
setup.h
@ -11,7 +11,6 @@
|
|||||||
class cMenuFemonSetup : public cMenuSetupPage {
|
class cMenuFemonSetup : public cMenuSetupPage {
|
||||||
private:
|
private:
|
||||||
const char *dispModesM[eFemonModeMaxNumber];
|
const char *dispModesM[eFemonModeMaxNumber];
|
||||||
const char *signalUnitsM[eFemonSignalUnitMaxNumber];
|
|
||||||
const char *skinsM[eFemonSkinMaxNumber];
|
const char *skinsM[eFemonSkinMaxNumber];
|
||||||
const char *themesM[eFemonThemeMaxNumber];
|
const char *themesM[eFemonThemeMaxNumber];
|
||||||
cVector<const char*> helpM;
|
cVector<const char*> helpM;
|
||||||
@ -21,7 +20,6 @@ private:
|
|||||||
int themeM;
|
int themeM;
|
||||||
int positionM;
|
int positionM;
|
||||||
int downscaleM;
|
int downscaleM;
|
||||||
int signalUnitM;
|
|
||||||
int redLimitM;
|
int redLimitM;
|
||||||
int greenLimitM;
|
int greenLimitM;
|
||||||
int updateIntervalM;
|
int updateIntervalM;
|
||||||
|
14
symbol.c
14
symbol.c
@ -19,7 +19,6 @@
|
|||||||
#include "symbols/dolbydigital51.xpm"
|
#include "symbols/dolbydigital51.xpm"
|
||||||
#include "symbols/mpeg2.xpm"
|
#include "symbols/mpeg2.xpm"
|
||||||
#include "symbols/h264.xpm"
|
#include "symbols/h264.xpm"
|
||||||
#include "symbols/h265.xpm"
|
|
||||||
#include "symbols/ntsc.xpm"
|
#include "symbols/ntsc.xpm"
|
||||||
#include "symbols/pal.xpm"
|
#include "symbols/pal.xpm"
|
||||||
#include "symbols/encrypted.xpm"
|
#include "symbols/encrypted.xpm"
|
||||||
@ -43,9 +42,6 @@
|
|||||||
#include "symbols/six.xpm"
|
#include "symbols/six.xpm"
|
||||||
#include "symbols/seven.xpm"
|
#include "symbols/seven.xpm"
|
||||||
#include "symbols/eight.xpm"
|
#include "symbols/eight.xpm"
|
||||||
#include "symbols/format2160.xpm"
|
|
||||||
#include "symbols/format2160i.xpm"
|
|
||||||
#include "symbols/format2160p.xpm"
|
|
||||||
#include "symbols/format1080.xpm"
|
#include "symbols/format1080.xpm"
|
||||||
#include "symbols/format1080i.xpm"
|
#include "symbols/format1080i.xpm"
|
||||||
#include "symbols/format1080p.xpm"
|
#include "symbols/format1080p.xpm"
|
||||||
@ -68,7 +64,6 @@ static cBitmap bmDolbyDigital20(dolbydigital20_xpm);
|
|||||||
static cBitmap bmDolbyDigital51(dolbydigital51_xpm);
|
static cBitmap bmDolbyDigital51(dolbydigital51_xpm);
|
||||||
static cBitmap bmMpeg2(mpeg2_xpm);
|
static cBitmap bmMpeg2(mpeg2_xpm);
|
||||||
static cBitmap bmH264(h264_xpm);
|
static cBitmap bmH264(h264_xpm);
|
||||||
static cBitmap bmH265(h265_xpm);
|
|
||||||
static cBitmap bmPal(pal_xpm);
|
static cBitmap bmPal(pal_xpm);
|
||||||
static cBitmap bmNtsc(ntsc_xpm);
|
static cBitmap bmNtsc(ntsc_xpm);
|
||||||
static cBitmap bmEncrypted(encrypted_xpm);
|
static cBitmap bmEncrypted(encrypted_xpm);
|
||||||
@ -92,9 +87,6 @@ static cBitmap bmFive(five_xpm);
|
|||||||
static cBitmap bmSix(six_xpm);
|
static cBitmap bmSix(six_xpm);
|
||||||
static cBitmap bmSeven(seven_xpm);
|
static cBitmap bmSeven(seven_xpm);
|
||||||
static cBitmap bmEight(eight_xpm);
|
static cBitmap bmEight(eight_xpm);
|
||||||
static cBitmap bmFormat2160(format2160_xpm);
|
|
||||||
static cBitmap bmFormat2160i(format2160i_xpm);
|
|
||||||
static cBitmap bmFormat2160p(format2160p_xpm);
|
|
||||||
static cBitmap bmFormat1080(format1080_xpm);
|
static cBitmap bmFormat1080(format1080_xpm);
|
||||||
static cBitmap bmFormat1080i(format1080i_xpm);
|
static cBitmap bmFormat1080i(format1080i_xpm);
|
||||||
static cBitmap bmFormat1080p(format1080p_xpm);
|
static cBitmap bmFormat1080p(format1080p_xpm);
|
||||||
@ -154,7 +146,6 @@ bool cFemonSymbolCache::Populate(void)
|
|||||||
cacheM.Append(bmDolbyDigital51.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_DD51
|
cacheM.Append(bmDolbyDigital51.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_DD51
|
||||||
cacheM.Append(bmMpeg2.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_MPEG2
|
cacheM.Append(bmMpeg2.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_MPEG2
|
||||||
cacheM.Append(bmH264.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_H264
|
cacheM.Append(bmH264.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_H264
|
||||||
cacheM.Append(bmH265.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_H265
|
|
||||||
cacheM.Append(bmPal.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_PAL
|
cacheM.Append(bmPal.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_PAL
|
||||||
cacheM.Append(bmNtsc.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_NTSC
|
cacheM.Append(bmNtsc.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_NTSC
|
||||||
cacheM.Append(bmEncrypted.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_ENCRYPTED
|
cacheM.Append(bmEncrypted.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_ENCRYPTED
|
||||||
@ -178,9 +169,6 @@ bool cFemonSymbolCache::Populate(void)
|
|||||||
cacheM.Append(bmSix.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_SIX
|
cacheM.Append(bmSix.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_SIX
|
||||||
cacheM.Append(bmSeven.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_SEVEN
|
cacheM.Append(bmSeven.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_SEVEN
|
||||||
cacheM.Append(bmEight.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_EIGHT
|
cacheM.Append(bmEight.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_EIGHT
|
||||||
cacheM.Append(bmFormat2160.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_2160
|
|
||||||
cacheM.Append(bmFormat2160i.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_2160i
|
|
||||||
cacheM.Append(bmFormat2160p.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_2160p
|
|
||||||
cacheM.Append(bmFormat1080.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_1080
|
cacheM.Append(bmFormat1080.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_1080
|
||||||
cacheM.Append(bmFormat1080i.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_1080i
|
cacheM.Append(bmFormat1080i.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_1080i
|
||||||
cacheM.Append(bmFormat1080p.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_1080p
|
cacheM.Append(bmFormat1080p.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_1080p
|
||||||
@ -213,7 +201,7 @@ bool cFemonSymbolCache::Flush(void)
|
|||||||
|
|
||||||
cBitmap& cFemonSymbolCache::Get(eSymbols symbolP)
|
cBitmap& cFemonSymbolCache::Get(eSymbols symbolP)
|
||||||
{
|
{
|
||||||
cBitmap *bitmapM = &bmOnePixel;
|
cBitmap *bitmapM = cacheM[SYMBOL_ONEPIXEL];
|
||||||
|
|
||||||
if (symbolP < cacheM.Size())
|
if (symbolP < cacheM.Size())
|
||||||
bitmapM = cacheM[symbolP];
|
bitmapM = cacheM[symbolP];
|
||||||
|
4
symbol.h
4
symbol.h
@ -21,7 +21,6 @@ enum eSymbols {
|
|||||||
SYMBOL_DD51,
|
SYMBOL_DD51,
|
||||||
SYMBOL_MPEG2,
|
SYMBOL_MPEG2,
|
||||||
SYMBOL_H264,
|
SYMBOL_H264,
|
||||||
SYMBOL_H265,
|
|
||||||
SYMBOL_PAL,
|
SYMBOL_PAL,
|
||||||
SYMBOL_NTSC,
|
SYMBOL_NTSC,
|
||||||
SYMBOL_ENCRYPTED,
|
SYMBOL_ENCRYPTED,
|
||||||
@ -45,9 +44,6 @@ enum eSymbols {
|
|||||||
SYMBOL_SIX,
|
SYMBOL_SIX,
|
||||||
SYMBOL_SEVEN,
|
SYMBOL_SEVEN,
|
||||||
SYMBOL_EIGHT,
|
SYMBOL_EIGHT,
|
||||||
SYMBOL_FORMAT_2160,
|
|
||||||
SYMBOL_FORMAT_2160i,
|
|
||||||
SYMBOL_FORMAT_2160p,
|
|
||||||
SYMBOL_FORMAT_1080,
|
SYMBOL_FORMAT_1080,
|
||||||
SYMBOL_FORMAT_1080i,
|
SYMBOL_FORMAT_1080i,
|
||||||
SYMBOL_FORMAT_1080p,
|
SYMBOL_FORMAT_1080p,
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
/* XPM */
|
|
||||||
static const char *const format2160_xpm[] = {
|
|
||||||
"40 18 2 1",
|
|
||||||
". c #FFFFFF",
|
|
||||||
"+ c #000000",
|
|
||||||
"++++++++++++++++++++++++++++++++++++++++",
|
|
||||||
"+......................................+",
|
|
||||||
"+.....++++......++..++++++....++++.....+",
|
|
||||||
"+...+++++++..+++++.++++++++..++++++....+",
|
|
||||||
"+...++....++.+++++.+++...++..++..++....+",
|
|
||||||
"+.........++....++.++.......++....++...+",
|
|
||||||
"+.........++....++.++.......++....++...+",
|
|
||||||
"+.........++....++.++.+++...++....++...+",
|
|
||||||
"+.......+++.....++.+++++++..++....++...+",
|
|
||||||
"+......+++......++.+++..+++.++....++...+",
|
|
||||||
"+.....+++.......++.++....++.++....++...+",
|
|
||||||
"+.....+++.......++.++....++.++....++...+",
|
|
||||||
"+....+++........++.++....++.++....++...+",
|
|
||||||
"+....++.........++.+++..+++..++..++....+",
|
|
||||||
"+....++++++++...++..+++++++..++++++....+",
|
|
||||||
"+....++++++++...++...+++++....++++.....+",
|
|
||||||
"+......................................+",
|
|
||||||
"++++++++++++++++++++++++++++++++++++++++"};
|
|
@ -1,23 +0,0 @@
|
|||||||
/* XPM */
|
|
||||||
static const char *const format2160i_xpm[] = {
|
|
||||||
"43 18 2 1",
|
|
||||||
". c #FFFFFF",
|
|
||||||
"+ c #000000",
|
|
||||||
"+++++++++++++++++++++++++++++++++++++++++++",
|
|
||||||
"+.........................................+",
|
|
||||||
"+.....++++......++..++++++....++++........+",
|
|
||||||
"+...+++++++..+++++.++++++++..++++++.......+",
|
|
||||||
"+...++....++.+++++.+++...++..++..++.......+",
|
|
||||||
"+.........++....++.++.......++....++......+",
|
|
||||||
"+.........++....++.++.......++....++.++...+",
|
|
||||||
"+.........++....++.++.+++...++....++.++...+",
|
|
||||||
"+.......+++.....++.+++++++..++....++......+",
|
|
||||||
"+......+++......++.+++..+++.++....++.++...+",
|
|
||||||
"+.....+++.......++.++....++.++....++.++...+",
|
|
||||||
"+.....+++.......++.++....++.++....++.++...+",
|
|
||||||
"+....+++........++.++....++.++....++.++...+",
|
|
||||||
"+....++.........++.+++..+++..++..++..++...+",
|
|
||||||
"+....++++++++...++..+++++++..++++++..++...+",
|
|
||||||
"+....++++++++...++...+++++....++++...++...+",
|
|
||||||
"+.........................................+",
|
|
||||||
"+++++++++++++++++++++++++++++++++++++++++++"};
|
|
@ -1,23 +0,0 @@
|
|||||||
/* XPM */
|
|
||||||
static const char *const format2160p_xpm[] = {
|
|
||||||
"47 18 2 1",
|
|
||||||
". c #FFFFFF",
|
|
||||||
"+ c #000000",
|
|
||||||
"+++++++++++++++++++++++++++++++++++++++++++++++",
|
|
||||||
"+.............................................+",
|
|
||||||
"+.....++++......++..++++++....++++............+",
|
|
||||||
"+...+++++++..+++++.++++++++..++++++...........+",
|
|
||||||
"+...++....++.+++++.+++...++..++..++...........+",
|
|
||||||
"+.........++....++.++.......++....++..........+",
|
|
||||||
"+.........++....++.++.......++....++..........+",
|
|
||||||
"+.........++....++.++.+++...++....++.++++.....+",
|
|
||||||
"+.......+++.....++.+++++++..++....++.+++++....+",
|
|
||||||
"+......+++......++.+++..+++.++....++.++..++...+",
|
|
||||||
"+.....+++.......++.++....++.++....++.++..++...+",
|
|
||||||
"+.....+++.......++.++....++.++....++.+++++....+",
|
|
||||||
"+....+++........++.++....++.++....++.++++.....+",
|
|
||||||
"+....++.........++.+++..+++..++..++..++.......+",
|
|
||||||
"+....++++++++...++..+++++++..++++++..++.......+",
|
|
||||||
"+....++++++++...++...+++++....++++...++.......+",
|
|
||||||
"+.............................................+",
|
|
||||||
"+++++++++++++++++++++++++++++++++++++++++++++++"};
|
|
@ -1,23 +0,0 @@
|
|||||||
/* XPM */
|
|
||||||
static const char *const h265_xpm[] = {
|
|
||||||
"40 18 2 1",
|
|
||||||
". c #FFFFFF",
|
|
||||||
"+ c #000000",
|
|
||||||
"++++++++++++++++++++++++++++++++++++++++",
|
|
||||||
"+......................................+",
|
|
||||||
"+..++...++.....+++++...+++++..+++++++..+",
|
|
||||||
"+..++...++....+++++++.+++++++.+++++++..+",
|
|
||||||
"+..++...++....++...++.++...++.++.......+",
|
|
||||||
"+..++...++.........++.++......++.......+",
|
|
||||||
"+..++...++.........++.++......++.......+",
|
|
||||||
"+..++...++........+++.++......++.......+",
|
|
||||||
"+..+++++++.......+++..++++++..++++++...+",
|
|
||||||
"+..+++++++......+++...+++++++.+++++++..+",
|
|
||||||
"+..++...++.....+++....++...++.....+++..+",
|
|
||||||
"+..++...++....+++.....++...++......++..+",
|
|
||||||
"+..++...++....++......++...++......++..+",
|
|
||||||
"+..++...++....++...++.++...++.++...++..+",
|
|
||||||
"+..++...++.++.+++++++.+++++++.++...++..+",
|
|
||||||
"+..++...++.++.+++++++..+++++...+++++...+",
|
|
||||||
"+......................................+",
|
|
||||||
"++++++++++++++++++++++++++++++++++++++++"};
|
|
175
tools.c
175
tools.c
@ -13,8 +13,9 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <linux/dvb/frontend.h>
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
#include "osd.h"
|
#include "osd.h"
|
||||||
#include "receiver.h"
|
#include "receiver.h"
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
@ -90,42 +91,60 @@ static const char *getUserString(int valueP, const tDvbParameterMap *mapP)
|
|||||||
return "---";
|
return "---";
|
||||||
}
|
}
|
||||||
|
|
||||||
cString getFrontendInfo(cDevice *deviceP)
|
cDvbDevice *getDvbDevice(cDevice* deviceP)
|
||||||
{
|
{
|
||||||
const cChannel *channel;
|
cDvbDevice *dev = dynamic_cast<cDvbDevice*>(deviceP);
|
||||||
int status, valid = DTV_STAT_VALID_NONE;
|
#ifdef __DYNAMIC_DEVICE_PROBE
|
||||||
|
if (!dev && deviceP && deviceP->HasSubDevice())
|
||||||
|
dev = dynamic_cast<cDvbDevice*>(deviceP->SubDevice());
|
||||||
|
#endif
|
||||||
|
return dev;
|
||||||
|
}
|
||||||
|
|
||||||
|
cString getFrontendInfo(cDvbDevice *deviceP)
|
||||||
|
{
|
||||||
|
struct dvb_frontend_info value;
|
||||||
|
fe_status_t status;
|
||||||
cString info = "";
|
cString info = "";
|
||||||
double signal = 0, cnr = 0, ber = 0, per = 0;
|
uint16_t signal = 0;
|
||||||
|
uint16_t snr = 0;
|
||||||
|
uint32_t ber = 0;
|
||||||
|
uint32_t unc = 0;
|
||||||
|
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||||
|
|
||||||
if (!deviceP)
|
if (!deviceP)
|
||||||
return info;
|
return info;
|
||||||
|
|
||||||
info = cString::sprintf("CARD:%d\nSTRG:%d\nQUAL:%d\nTYPE:%s\nNAME:%s", deviceP->CardIndex(), deviceP->SignalStrength(), deviceP->SignalQuality(), *deviceP->DeviceType(), *deviceP->DeviceName());
|
int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK);
|
||||||
if (deviceP && deviceP->SignalStats(valid, &signal, &cnr, NULL, &ber, &per, &status)) {
|
if (fe < 0)
|
||||||
if (valid & DTV_STAT_VALID_STATUS)
|
return info;
|
||||||
info = cString::sprintf("%s\nSTAT:%04X", *info, status);
|
|
||||||
if (valid & DTV_STAT_VALID_STRENGTH)
|
info = cString::sprintf("CARD:%d\nSTRG:%d\nQUAL:%d", deviceP->CardIndex(), deviceP->SignalStrength(), deviceP->SignalQuality());
|
||||||
info = cString::sprintf("%s\nSGNL:%s", *info, *dtoa(signal, "%.2f"));
|
|
||||||
if (valid & DTV_STAT_VALID_CNR)
|
if (ioctl(fe, FE_GET_INFO, &value) >= 0)
|
||||||
info = cString::sprintf("%s\nCNRA:%s", *info, *dtoa(cnr, "%.2f"));
|
info = cString::sprintf("%s\nTYPE:%d\nNAME:%s", *info, value.type, *deviceP->DeviceName());
|
||||||
if (valid & DTV_STAT_VALID_BERPOST)
|
if (ioctl(fe, FE_READ_STATUS, &status) >= 0)
|
||||||
info = cString::sprintf("%s\nBERA:%s", *info, *dtoa(ber, "%.0f"));
|
info = cString::sprintf("%s\nSTAT:%02X", *info, status);
|
||||||
if (valid & DTV_STAT_VALID_PER)
|
if (ioctl(fe, FE_READ_SIGNAL_STRENGTH, &signal) >= 0)
|
||||||
info = cString::sprintf("%s\nPERA:%s", *info, *dtoa(per, "%.0f"));
|
info = cString::sprintf("%s\nSGNL:%04X", *info, signal);
|
||||||
}
|
if (ioctl(fe, FE_READ_SNR, &snr) >= 0)
|
||||||
|
info = cString::sprintf("%s\nSNRA:%04X", *info, snr);
|
||||||
|
if (ioctl(fe, FE_READ_BER, &ber) >= 0)
|
||||||
|
info = cString::sprintf("%s\nBERA:%08X", *info, ber);
|
||||||
|
if (ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &unc) >= 0)
|
||||||
|
info = cString::sprintf("%s\nUNCB:%08X", *info, unc);
|
||||||
|
close(fe);
|
||||||
|
|
||||||
if (cFemonOsd::Instance())
|
if (cFemonOsd::Instance())
|
||||||
info = cString::sprintf("%s\nVIBR:%s\nAUBR:%s\nDDBR:%s", *info, *dtoa(cFemonOsd::Instance()->GetVideoBitrate(), "%.0f"), *dtoa(cFemonOsd::Instance()->GetAudioBitrate(), "%.0f"), *dtoa(cFemonOsd::Instance()->GetDolbyBitrate(), "%.0f"));
|
info = cString::sprintf("%s\nVIBR:%.0f\nAUBR:%.0f\nDDBR:%.0f", *info, cFemonOsd::Instance()->GetVideoBitrate(), cFemonOsd::Instance()->GetAudioBitrate(), cFemonOsd::Instance()->GetDolbyBitrate());
|
||||||
|
|
||||||
LOCK_CHANNELS_READ;
|
|
||||||
channel = Channels->GetByNumber(cDevice::CurrentChannel());
|
|
||||||
if (channel)
|
if (channel)
|
||||||
info = cString::sprintf("%s\nCHAN:%s", *info, *channel->ToText());
|
info = cString::sprintf("%s\nCHAN:%s", *info, *channel->ToText());
|
||||||
|
|
||||||
return info;
|
return info;
|
||||||
}
|
}
|
||||||
|
|
||||||
cString getFrontendName(cDevice *deviceP)
|
cString getFrontendName(cDvbDevice *deviceP)
|
||||||
{
|
{
|
||||||
if (!deviceP)
|
if (!deviceP)
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -133,80 +152,85 @@ cString getFrontendName(cDevice *deviceP)
|
|||||||
return (cString::sprintf("%s on deviceP #%d", *deviceP->DeviceName(), deviceP->CardIndex()));
|
return (cString::sprintf("%s on deviceP #%d", *deviceP->DeviceName(), deviceP->CardIndex()));
|
||||||
}
|
}
|
||||||
|
|
||||||
cString getFrontendStatus(cDevice *deviceP)
|
cString getFrontendStatus(cDvbDevice *deviceP)
|
||||||
{
|
{
|
||||||
int status;
|
fe_status_t value;
|
||||||
int valid = DTV_STAT_VALID_NONE;
|
|
||||||
|
|
||||||
if (deviceP && deviceP->SignalStats(valid, NULL, NULL, NULL, NULL, NULL, &status)) {
|
|
||||||
if (valid & DTV_STAT_VALID_STATUS)
|
|
||||||
return (cString::sprintf("Status %s:%s:%s:%s:%s on deviceP #%d", (status & DTV_STAT_HAS_LOCK) ? "LOCKED" : "-", (status & DTV_STAT_HAS_SIGNAL) ? "SIGNAL" : "-", (status & DTV_STAT_HAS_CARRIER) ? "CARRIER" : "-", (status & DTV_STAT_HAS_VITERBI) ? "VITERBI" : "-", (status & DTV_STAT_HAS_SYNC) ? "SYNC" : "-", deviceP->CardIndex()));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (!deviceP)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK);
|
||||||
|
if (fe < 0)
|
||||||
|
return NULL;
|
||||||
|
memset(&value, 0, sizeof(value));
|
||||||
|
ioctl(fe, FE_READ_STATUS, &value);
|
||||||
|
close(fe);
|
||||||
|
|
||||||
|
return (cString::sprintf("Status %s:%s:%s:%s:%s on deviceP #%d", (value & FE_HAS_LOCK) ? "LOCKED" : "-", (value & FE_HAS_SIGNAL) ? "SIGNAL" : "-", (value & FE_HAS_CARRIER) ? "CARRIER" : "-", (value & FE_HAS_VITERBI) ? "VITERBI" : "-", (value & FE_HAS_SYNC) ? "SYNC" : "-", deviceP->CardIndex()));
|
||||||
}
|
}
|
||||||
|
|
||||||
double getSignal(cDevice *deviceP)
|
uint16_t getSignal(cDvbDevice *deviceP)
|
||||||
{
|
{
|
||||||
double strength;
|
uint16_t value = 0;
|
||||||
int valid = DTV_STAT_VALID_NONE;
|
|
||||||
|
|
||||||
if (deviceP && deviceP->SignalStats(valid, &strength, NULL, NULL, NULL, NULL, NULL)) {
|
if (!deviceP)
|
||||||
if (valid & DTV_STAT_VALID_STRENGTH)
|
return (value);
|
||||||
return strength;
|
|
||||||
|
int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK);
|
||||||
|
if (fe < 0)
|
||||||
|
return (value);
|
||||||
|
ioctl(fe, FE_READ_SIGNAL_STRENGTH, &value);
|
||||||
|
close(fe);
|
||||||
|
|
||||||
|
return (value);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
uint16_t getSNR(cDvbDevice *deviceP)
|
||||||
}
|
|
||||||
|
|
||||||
double getCNR(cDevice *deviceP)
|
|
||||||
{
|
{
|
||||||
double cnr;
|
uint16_t value = 0;
|
||||||
int valid = DTV_STAT_VALID_NONE;
|
|
||||||
|
|
||||||
if (deviceP && deviceP->SignalStats(valid, NULL, &cnr, NULL, NULL, NULL, NULL)) {
|
if (!deviceP)
|
||||||
if (valid & DTV_STAT_VALID_CNR)
|
return (value);
|
||||||
return cnr;
|
|
||||||
|
int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK);
|
||||||
|
if (fe < 0)
|
||||||
|
return (value);
|
||||||
|
ioctl(fe, FE_READ_SNR, &value);
|
||||||
|
close(fe);
|
||||||
|
|
||||||
|
return (value);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
uint32_t getBER(cDvbDevice *deviceP)
|
||||||
}
|
|
||||||
|
|
||||||
double getBER(cDevice *deviceP)
|
|
||||||
{
|
{
|
||||||
double ber;
|
uint32_t value = 0;
|
||||||
int valid = DTV_STAT_VALID_NONE;
|
|
||||||
|
|
||||||
if (deviceP && deviceP->SignalStats(valid, NULL, NULL, NULL, &ber, NULL, NULL)) {
|
if (!deviceP)
|
||||||
if (valid & DTV_STAT_VALID_BERPOST)
|
return (value);
|
||||||
return ber;
|
|
||||||
|
int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK);
|
||||||
|
if (fe < 0)
|
||||||
|
return (value);
|
||||||
|
ioctl(fe, FE_READ_BER, &value);
|
||||||
|
close(fe);
|
||||||
|
|
||||||
|
return (value);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
uint32_t getUNC(cDvbDevice *deviceP)
|
||||||
}
|
|
||||||
|
|
||||||
double getPER(cDevice *deviceP)
|
|
||||||
{
|
{
|
||||||
double per;
|
uint32_t value = 0;
|
||||||
int valid = DTV_STAT_VALID_NONE;
|
|
||||||
|
|
||||||
if (deviceP && deviceP->SignalStats(valid, NULL, NULL, NULL, NULL, &per, NULL)) {
|
if (!deviceP)
|
||||||
if (valid & DTV_STAT_VALID_PER)
|
return (value);
|
||||||
return per;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
int fe = open(*cString::sprintf(FRONTEND_DEVICE, deviceP->Adapter(), deviceP->Frontend()), O_RDONLY | O_NONBLOCK);
|
||||||
}
|
if (fe < 0)
|
||||||
|
return (value);
|
||||||
|
ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &value);
|
||||||
|
close(fe);
|
||||||
|
|
||||||
cString getSignalStrength(double strengthP)
|
return (value);
|
||||||
{
|
|
||||||
switch (FemonConfig.GetSignalUnit()) {
|
|
||||||
case eFemonSignalUnitdBm: return cString::sprintf("%.2f %s", strengthP, tr("dBm"));
|
|
||||||
case eFemonSignalUnitdBuV: return cString::sprintf("%.2f %s", strengthP + (120 - 11.25), tr("dBuV"));
|
|
||||||
case eFemonSignalUnitdBV: return cString::sprintf("%.2f %s", strengthP - 11.25, tr("dBV"));
|
|
||||||
default: break;
|
|
||||||
}
|
|
||||||
return cString::sprintf("---");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cString getApids(const cChannel *channelP)
|
cString getApids(const cChannel *channelP)
|
||||||
@ -285,7 +309,6 @@ cString getVideoCodec(int valueP)
|
|||||||
switch (valueP) {
|
switch (valueP) {
|
||||||
case VIDEO_CODEC_MPEG2: return cString::sprintf("%s", tr("MPEG-2"));
|
case VIDEO_CODEC_MPEG2: return cString::sprintf("%s", tr("MPEG-2"));
|
||||||
case VIDEO_CODEC_H264: return cString::sprintf("%s", tr("H.264"));
|
case VIDEO_CODEC_H264: return cString::sprintf("%s", tr("H.264"));
|
||||||
case VIDEO_CODEC_H265: return cString::sprintf("%s", tr("H.265"));
|
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
return cString::sprintf("---");
|
return cString::sprintf("---");
|
||||||
|
18
tools.h
18
tools.h
@ -20,16 +20,18 @@
|
|||||||
|
|
||||||
#define SATIP_DEVICE "SAT>IP"
|
#define SATIP_DEVICE "SAT>IP"
|
||||||
|
|
||||||
cString getFrontendInfo(cDevice *deviceP);
|
cDvbDevice *getDvbDevice(cDevice* deviceP);
|
||||||
cString getFrontendName(cDevice *deviceP);
|
|
||||||
cString getFrontendStatus(cDevice *deviceP);
|
|
||||||
|
|
||||||
double getCNR(cDevice *deviceP);
|
cString getFrontendInfo(cDvbDevice *deviceP);
|
||||||
double getSignal(cDevice *deviceP);
|
cString getFrontendName(cDvbDevice *deviceP);
|
||||||
double getBER(cDevice *deviceP);
|
cString getFrontendStatus(cDvbDevice *deviceP);
|
||||||
double getPER(cDevice *deviceP);
|
|
||||||
|
uint16_t getSNR(cDvbDevice *deviceP);
|
||||||
|
uint16_t getSignal(cDvbDevice *deviceP);
|
||||||
|
|
||||||
|
uint32_t getBER(cDvbDevice *deviceP);
|
||||||
|
uint32_t getUNC(cDvbDevice *deviceP);
|
||||||
|
|
||||||
cString getSignalStrength(double strengthP);
|
|
||||||
cString getApids(const cChannel *channelP);
|
cString getApids(const cChannel *channelP);
|
||||||
cString getDpids(const cChannel *channelP);
|
cString getDpids(const cChannel *channelP);
|
||||||
cString getSpids(const cChannel *channelP);
|
cString getSpids(const cChannel *channelP);
|
||||||
|
Loading…
Reference in New Issue
Block a user