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

Compare commits

..

6 Commits

Author SHA1 Message Date
Rolf Ahrenberg
55b5e0c293 Added missing MINFONTSIZE and MAXFONTSIZE defines. 2009-06-18 23:05:30 +03:00
Rolf Ahrenberg
cbc39db870 Cleaned up compilation warnings. 2009-06-18 17:40:44 +03:00
Rolf Ahrenberg
ecb79fe6db Cleaned up compilation warnings. 2009-06-18 17:30:54 +03:00
Rolf Ahrenberg
4a5318371d Backported from 1.7.2. 2009-06-18 12:17:42 +03:00
Rolf Ahrenberg
c69a018337 Backported from 1.7.1. 2009-01-06 23:39:59 +02:00
Rolf Ahrenberg
88b263aa02 Backported from 1.7.0. 2008-12-16 12:53:19 +02:00
54 changed files with 1504 additions and 5203 deletions

95
HISTORY
View File

@@ -364,98 +364,3 @@ VDR Plugin 'femon' Revision History
- Cleaned up compilation warnings. - Cleaned up compilation warnings.
- Fixed font handling to be thread-safe. - Fixed font handling to be thread-safe.
2009-08-29: Version 1.7.3
- Removed OSD offset and height options.
- Added PES assembler.
- Added bitstream parsers for all codecs.
2009-09-04: Version 1.7.4
- Fixed H.264 bitstream parser.
- Added a mutex to receiver class.
- Added 1080/720/576/480 format symbols into status window.
2009-10-01: Version 1.7.5
- Changed H.264 parser to show display aspect ratio.
- Removed error logging from unimplemented ioctl functions.
- Removed bitstream parsing from Receive() method.
- Added Chinese translation (Thanks to NanFeng).
2010-02-01: Version 1.7.6
- Updated for vdr-1.7.12.
- Updated Estonian translation (Thanks to Arthur Konovalov).
- Added Lithuanian translation (Thanks to Valdemaras Pipiras).
2010-03-05: Version 1.7.7
- Updated for vdr-1.7.13.
- Added a setup option to downscale the OSD size.
- Updated Estonian translation (Thanks to Arthur Konovalov).
2010-06-23: Version 1.7.8
- Fixed device switching.
- Added preliminary support for LATM.
- Updated Italian translation (Thanks to Diego Pierotto).
- Fixed a crash in femon service (Thanks to Wolfgang Astleitner).
2010-12-27: Version 1.7.9
- Updated for vdr-1.7.16.
- Added Makefile depencency for objects.
- Fixed detection of replaying.
- Added support for LDFLAGS.
2011-05-15: Version 1.7.10
- Updated for vdr-1.7.18.
- Added scaling for symbols.
2011-12-04: Version 1.7.11
- Updated for vdr-1.7.22: New API functions for signal strength
and quality used to provide information for the OSD.
- Added cppcheck target into Makefile.
- Refactored bitstream code.
2012-01-15: Version 1.7.12
- Updated for vdr-1.7.23.
- Updated SVDRP interface.
- Added Hungarian translation (Thanks to Fuley Istvan).
2012-02-05: Version 1.7.13
- Added initial support for PVRINPUT devices (Thanks to Winfried Köhler).
- Added initial support for IPTV devices.
2012-03-10: Version 1.7.14
- Updated for vdr-1.7.26.
2012-03-12: Version 1.7.15
- Cleaned up compilation warnings.
- Fixed channel switching.
2012-03-25: Version 1.7.16
- Updated for vdr-1.7.27.
- Cleaned up compilation warnings again.
2012-04-02: Version 1.7.17
- Added the dynamite compatibility patch (Thanks to Lars Hanisch).
- Silenced error log messages when accessing pseudo devices.
- Added a new theme: PearlHD (Thanks to Taipan @ VDRPortal).
- Added the transponder info window support for IPTV devices.
2013-02-10: Version 1.7.18
- Updated for vdr-1.7.37.
- Modified how the receiver is detached.
- Added Ukrainian translation (Thanks to Yarema aka Knedlyk).

View File

@@ -2,136 +2,118 @@
# Makefile for Frontend Status Monitor plugin # Makefile for Frontend Status Monitor plugin
# #
# Debugging on/off # Debugging on/off
#FEMON_DEBUG = 1 #FEMON_DEBUG = 1
# Strip debug symbols? Set eg. to /bin/true if not # Strip debug symbols? Set eg. to /bin/true if not
STRIP = strip STRIP = strip
# The official name of this plugin. # The official name of this plugin.
# This name will be used in the '-P...' option of VDR to load the plugin. # This name will be used in the '-P...' option of VDR to load the plugin.
# By default the main source file also carries this name. # By default the main source file also carries this name.
# IMPORTANT: the presence of this macro is important for the Make.config
# file. So it must be defined, even if it is not used here!
#
PLUGIN = femon PLUGIN = femon
### The version number of this plugin (taken from the main source file): ### The version number of this plugin (taken from the main source file):
VERSION = $(shell grep 'static const char VERSION\[\] *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g') VERSION = $(shell grep 'static const char VERSION\[\] *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
GITTAG = $(shell git describe --always 2>/dev/null)
### The C++ compiler and options:
CXX ?= g++
CXXFLAGS ?= -fPIC -g -O2 -Wall -Wextra -Wswitch-default -Wfloat-equal -Wundef -Wpointer-arith -Wconversion -Wcast-align -Wredundant-decls -Wno-unused-parameter -Woverloaded-virtual -Wno-parentheses
### The directory environment: ### The directory environment:
# Use package data if installed...otherwise assume we're under the VDR source directory: VDRDIR = ../../..
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell pkg-config --variable=$(1) vdr || pkg-config --variable=$(1) ../../../vdr.pc)) LIBDIR = ../../lib
LIBDIR = $(call PKGCFG,libdir) TMPDIR = /tmp
LOCDIR = $(call PKGCFG,locdir)
PLGCFG = $(call PKGCFG,plgcfg)
#
TMPDIR ?= /tmp
### The compiler options:
export CFLAGS = $(call PKGCFG,cflags)
export CXXFLAGS = $(call PKGCFG,cxxflags)
### The version number of VDR's plugin API:
APIVERSION = $(call PKGCFG,apiversion)
### Allow user defined options to overwrite defaults: ### Allow user defined options to overwrite defaults:
-include $(PLGCFG) -include $(VDRDIR)/Make.config
### The version number of VDR's plugin API (taken from VDR's "config.h"):
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
### The name of the distribution archive: ### The name of the distribution archive:
ARCHIVE = $(PLUGIN)-$(VERSION) ARCHIVE = $(PLUGIN)-$(VERSION)
PACKAGE = vdr-$(ARCHIVE) PACKAGE = vdr-$(ARCHIVE)
### The name of the shared object file:
SOFILE = libvdr-$(PLUGIN).so
### Includes and Defines (add further entries here): ### Includes and Defines (add further entries here):
INCLUDES += INCLUDES += -I$(VDRDIR)/include
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"' DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
ifdef FEMON_DEBUG ifdef FEMON_DEBUG
DEFINES += -DDEBUG DEFINES += -DDEBUG
endif endif
ifneq ($(strip $(GITTAG)),)
DEFINES += -DGITVERSION='"-GIT-$(GITTAG)"'
endif
.PHONY: all all-redirect .PHONY: all all-redirect
all-redirect: all all-redirect: all
### The object files (add further files here): ### The object files (add further files here):
OBJS = $(PLUGIN).o femonosd.o femonreceiver.o femoncfg.o femontools.o femonmpeg.o femonac3.o femonaac.o femonlatm.o femonh264.o femonsymbol.o OBJS = femon.o femonosd.o femonreceiver.o femoncfg.o femontools.o femonmpeg.o femonac3.o femonaac.o femonh264.o femonsymbol.o
### The main target: ### The main target:
all: $(SOFILE) i18n all: libvdr-$(PLUGIN).so i18n
### Implicit rules: ### Implicit rules:
%.o: %.c %.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $< $(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
### Dependencies: ### Dependencies:
MAKEDEP = $(CXX) -MM -MG MAKEDEP = $(CXX) -MM -MG
DEPFILE = .dependencies DEPFILE = .dependencies
$(DEPFILE): Makefile $(DEPFILE): Makefile
@$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@ @$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
-include $(DEPFILE) -include $(DEPFILE)
### Internationalization (I18N): ### Internationalization (I18N):
PODIR = po PODIR = po
LOCALEDIR = $(VDRDIR)/locale
I18Npo = $(wildcard $(PODIR)/*.po) I18Npo = $(wildcard $(PODIR)/*.po)
I18Nmo = $(addsuffix .mo, $(foreach file, $(I18Npo), $(basename $(file)))) I18Nmsgs = $(addprefix $(LOCALEDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
I18Nmsgs = $(addprefix $(DESTDIR)$(LOCDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
I18Npot = $(PODIR)/$(PLUGIN).pot I18Npot = $(PODIR)/$(PLUGIN).pot
%.mo: %.po %.mo: %.po
msgfmt -c -o $@ $< msgfmt -c -o $@ $<
$(I18Npot): $(wildcard *.c) $(I18Npot): $(wildcard *.c)
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^` xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='Rolf Ahrenberg' -o $@ $^
%.po: $(I18Npot) %.po: $(I18Npot)
msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $< msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
@touch $@ @touch $@
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo $(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
install -D -m644 $< $@ @mkdir -p $(dir $@)
cp $< $@
.PHONY: i18n .PHONY: i18n
i18n: $(I18Nmo) $(I18Npot) i18n: $(I18Nmsgs) $(I18Npot)
install-i18n: $(I18Nmsgs)
### Targets: ### Targets:
$(SOFILE): $(OBJS) libvdr-$(PLUGIN).so: $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@ $(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
ifndef FEMON_DEBUG ifndef FEMON_DEBUG
@$(STRIP) $@ @$(STRIP) $@
endif endif
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
install-lib: $(SOFILE) dist: clean
install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
install: install-lib install-i18n
dist: $(I18Npo) clean
@-rm -rf $(TMPDIR)/$(ARCHIVE) @-rm -rf $(TMPDIR)/$(ARCHIVE)
@mkdir $(TMPDIR)/$(ARCHIVE) @mkdir $(TMPDIR)/$(ARCHIVE)
@cp -a * $(TMPDIR)/$(ARCHIVE) @cp -a * $(TMPDIR)/$(ARCHIVE)
@@ -140,9 +122,4 @@ dist: $(I18Npo) clean
@echo Distribution package created as $(PACKAGE).tgz @echo Distribution package created as $(PACKAGE).tgz
clean: clean:
@-rm -f $(PODIR)/*.mo $(PODIR)/*.pot @-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ $(PODIR)/*.mo $(PODIR)/*.pot
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
.PHONY: cppcheck
cppcheck:
@cppcheck --enable=all -v -f $(OBJS:%.o=%.c)

21
README
View File

@@ -26,21 +26,24 @@ transponder and stream information are also available in advanced display modes.
The plugin is based on a neat console frontend status monitor application The plugin is based on a neat console frontend status monitor application
called 'femon' by Johannes Stezenbach (see DVB-apps/szap/femon.c for further called 'femon' by Johannes Stezenbach (see DVB-apps/szap/femon.c for further
information). information). The bitrate calculation trick originates from the 'dvbstream'
application by Dave Chapman and the stream information routines are taken from
the 'libdvb' library by Metzler Brothers. The H.264 parsing routines are taken
from vdr-xineliboutput plugin by Petri Hintukainen.
Terminology: Terminology:
-------------------------------------------------------------- --------------------------------------------------------------
|## Channel Name ################### [SVDRP][AR][VF][A/DD][D]| |## Channel Name ################### [SVDRP][AR][VF][A/DD][D]|
|[=====Signal Strength ===================|=================]| |[=====Signal Strength in % ==============|=================]|
|[=====Signal Quality ================|=====================]| |[=====Signal-to-Noise Ratio in % ========|=================]|
| STR: #0000 (0%) BER: #00000000 Video: 0 Mbit/s | | STR: #0000 (0%) BER: #00000000 Video: 0 Mbit/s |
| SNR: #0000 (0%) UNC: #00000000 Audio: 0 kbit/s | | SNR: #0000 (0%) UNC: #00000000 Audio: 0 kbit/s |
| [LOCK] [SIGNAL] [CARRIER] [VITERBI] [SYNC] | | [LOCK] [SIGNAL] [CARRIER] [VITERBI] [SYNC] |
-------------------------------------------------------------- --------------------------------------------------------------
STR - Signal strength from driver STR - Signal strength
SNR - Signal-to-noise ratio from driver SNR - Signal-to-noise ratio
BER - Bit error rate BER - Bit error rate
UNC - Uncorrected blocks UNC - Uncorrected blocks
Video - Calculated video bitrate in Mbit/s Video - Calculated video bitrate in Mbit/s
@@ -97,6 +100,9 @@ the local device number.
Notes: Notes:
- The plugin supports only those DVB cards with _one_ frontend, because I
haven't yet figured howto do it without patching the VDR core.
- Disable the stream analyze to speed up heavy zapping sessions. - Disable the stream analyze to speed up heavy zapping sessions.
- The signal strength and signal-to-noise ratio values are comparable only - The signal strength and signal-to-noise ratio values are comparable only
@@ -104,8 +110,9 @@ Notes:
specifications those values cannot be calculated into any real units. specifications those values cannot be calculated into any real units.
- If the OSD isn't visible, you've configured the OSD height too big or too - If the OSD isn't visible, you've configured the OSD height too big or too
small. Please, try to adjust the variable on the OSD setup page before small. Please, try to adjust the variable on the setup page before writing
writing any bug reports. any bug reports. NTSC users should use a shrinked default OSD height by
modifying VDR's setup.conf: femon.OSDHeight = 420
- If the SVDRP service is used: femon won't notice if the server is tuned - If the SVDRP service is used: femon won't notice if the server is tuned
to a different channel and tuning the channel on the server might annoy to a different channel and tuning the channel on the server might annoy

126
femon.c
View File

@@ -7,22 +7,18 @@
#include <vdr/menu.h> #include <vdr/menu.h>
#include <vdr/remote.h> #include <vdr/remote.h>
#include <vdr/player.h> #include <vdr/menu.h>
#include "femoncfg.h" #include "femoncfg.h"
#include "femonreceiver.h" #include "femonreceiver.h"
#include "femonosd.h" #include "femonosd.h"
#include "femonservice.h" #include "femonservice.h"
#include "femontools.h" #include "femontools.h"
#if defined(APIVERSNUM) && APIVERSNUM < 10737 #if defined(APIVERSNUM) && APIVERSNUM < 10600
#error "VDR-1.7.37 API version or greater is required!" #error "VDR-1.6.0 API version or greater is required!"
#endif #endif
#ifndef GITVERSION static const char VERSION[] = "1.6.7";
#define GITVERSION ""
#endif
static const char VERSION[] = "1.7.18" 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");
@@ -54,13 +50,13 @@ cPluginFemon::cPluginFemon()
// Initialize any member variables here. // Initialize any member variables here.
// DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL // DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
// VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT! // VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
debug("%s()\n", __PRETTY_FUNCTION__); Dprintf("%s()\n", __PRETTY_FUNCTION__);
} }
cPluginFemon::~cPluginFemon() cPluginFemon::~cPluginFemon()
{ {
// Clean up after yourself! // Clean up after yourself!
debug("%s()\n", __PRETTY_FUNCTION__); Dprintf("%s()\n", __PRETTY_FUNCTION__);
} }
const char *cPluginFemon::CommandLineHelp(void) const char *cPluginFemon::CommandLineHelp(void)
@@ -100,8 +96,8 @@ void cPluginFemon::Housekeeping(void)
cOsdObject *cPluginFemon::MainMenuAction(void) cOsdObject *cPluginFemon::MainMenuAction(void)
{ {
// Perform the action when selected from the main VDR menu. // Perform the action when selected from the main VDR menu.
debug("%s()\n", __PRETTY_FUNCTION__); Dprintf("%s()\n", __PRETTY_FUNCTION__);
if (cControl::Control() || (Channels.Count() <= 0)) if (cReplayControl::NowReplaying() || (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);
@@ -114,9 +110,10 @@ bool cPluginFemon::SetupParse(const char *Name, const char *Value)
if (!strcasecmp(Name, "HideMenu")) femonConfig.hidemenu = atoi(Value); if (!strcasecmp(Name, "HideMenu")) femonConfig.hidemenu = atoi(Value);
else if (!strcasecmp(Name, "DisplayMode")) femonConfig.displaymode = atoi(Value); else if (!strcasecmp(Name, "DisplayMode")) femonConfig.displaymode = atoi(Value);
else if (!strcasecmp(Name, "Position")) femonConfig.position = atoi(Value); else if (!strcasecmp(Name, "Position")) femonConfig.position = atoi(Value);
else if (!strcasecmp(Name, "OSDHeight")) femonConfig.osdheight = atoi(Value);
else if (!strcasecmp(Name, "OSDOffset")) femonConfig.osdoffset = atoi(Value);
else if (!strcasecmp(Name, "Skin")) femonConfig.skin = atoi(Value); else if (!strcasecmp(Name, "Skin")) femonConfig.skin = atoi(Value);
else if (!strcasecmp(Name, "Theme")) femonConfig.theme = atoi(Value); else if (!strcasecmp(Name, "Theme")) femonConfig.theme = atoi(Value);
else if (!strcasecmp(Name, "Downscale")) femonConfig.downscale = atoi(Value);
else if (!strcasecmp(Name, "RedLimit")) femonConfig.redlimit = atoi(Value); else if (!strcasecmp(Name, "RedLimit")) femonConfig.redlimit = atoi(Value);
else if (!strcasecmp(Name, "GreenLimit")) femonConfig.greenlimit = atoi(Value); else if (!strcasecmp(Name, "GreenLimit")) femonConfig.greenlimit = atoi(Value);
else if (!strcasecmp(Name, "UpdateInterval")) femonConfig.updateinterval = atoi(Value); else if (!strcasecmp(Name, "UpdateInterval")) femonConfig.updateinterval = atoi(Value);
@@ -137,15 +134,13 @@ bool cPluginFemon::Service(const char *Id, void *Data)
if (strcmp(Id,"FemonService-v1.0") == 0) { if (strcmp(Id,"FemonService-v1.0") == 0) {
if (Data) { if (Data) {
FemonService_v1_0 *data = (FemonService_v1_0*)Data; FemonService_v1_0 *data = (FemonService_v1_0*)Data;
if (!cDevice::ActualDevice()) int ndx = cDevice::ActualDevice()->CardIndex();
return false; data->fe_name = getFrontendName(ndx);
cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice()); data->fe_status = getFrontendStatus(ndx);
data->fe_name = getFrontendName(dev); data->fe_snr = getSNR(ndx);
data->fe_status = getFrontendStatus(dev); data->fe_signal = getSignal(ndx);
data->fe_snr = getSNR(dev); data->fe_ber = getBER(ndx);
data->fe_signal = getSignal(dev); data->fe_unc = getUNC(ndx);
data->fe_ber = getBER(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;
@@ -157,7 +152,7 @@ bool cPluginFemon::Service(const char *Id, void *Data)
} }
const char **cPluginFemon::SVDRPHelpPages(void) const char **cPluginFemon::SVDRPHelpPages(void)
{ {
static const char *HelpPages[] = { static const char *HelpPages[] = {
"OPEN\n" "OPEN\n"
" Open femon plugin.", " Open femon plugin.",
@@ -167,30 +162,26 @@ const char **cPluginFemon::SVDRPHelpPages(void)
" Switch to next possible device.", " Switch to next possible device.",
"PREV\n" "PREV\n"
" Switch to previous possible device.", " Switch to previous possible device.",
"INFO <card index>\n" "INFO\n"
" Print the frontend information.", " Print the current frontend information.",
"NAME <card index>\n" "NAME\n"
" Print the frontend name.", " Print the current frontend name.",
"STAT <card index>\n" "STAT\n"
" Print the frontend status.", " Print the current frontend status.",
"STRG <card index>\n" "SGNL\n"
" Print the signal strength.", " Print the current signal strength.",
"QUAL <card index>\n" "SNRA\n"
" Print the signal quality.", " Print the current signal-to-noise ratio.",
"SGNL <card index>\n" "BERA\n"
" Print the signal strength from driver.", " Print the current bit error rate.",
"SNRA <card index>\n" "UNCB\n"
" Print the signal-to-noise ratio from driver.", " Print the current uncorrected blocks rate.",
"BERA <card index>\n"
" Print the bit error rate.",
"UNCB <card index>\n"
" Print the uncorrected blocks rate.",
"VIBR\n" "VIBR\n"
" Print the current video bitrate [Mbit/s].", " Print the actual device and current video bitrate [Mbit/s].",
"AUBR\n" "AUBR\n"
" Print the current audio bitrate [kbit/s].", " Print the actual device and current audio bitrate [kbit/s].",
"DDBR\n" "DDBR\n"
" Print the current dolby bitrate [kbit/s].", " Print the actual device and current dolby bitrate [kbit/s].",
NULL NULL
}; };
return HelpPages; return HelpPages;
@@ -198,19 +189,13 @@ const char **cPluginFemon::SVDRPHelpPages(void)
cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode) cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode)
{ {
cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice());
if (*Option && isnumber(Option)) {
cDvbDevice *dev2 = dynamic_cast<cDvbDevice*>(cDevice::GetDevice(int(strtol(Option, NULL, 10))));
if (dev2)
dev = dev2;
}
if (strcasecmp(Command, "OPEN") == 0) { if (strcasecmp(Command, "OPEN") == 0) {
if (cReplayControl::NowReplaying()) { if (cReplayControl::NowReplaying()) {
ReplyCode = 550; // Requested action not taken ReplyCode = 550; // Requested action not taken
return cString("Cannot open femon plugin while replaying"); return cString("Cannot open femon plugin while replaying");
} }
if (!cFemonOsd::Instance()) if (!cFemonOsd::Instance())
cRemote::CallPlugin(Name()); cRemote::CallPlugin("femon");
return cString("Opening femon plugin"); return cString("Opening femon plugin");
} }
else if (strcasecmp(Command, "QUIT") == 0) { else if (strcasecmp(Command, "QUIT") == 0) {
@@ -231,33 +216,27 @@ cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int
return cString("Cannot switch device"); return cString("Cannot switch device");
} }
else if (strcasecmp(Command, "INFO") == 0) { else if (strcasecmp(Command, "INFO") == 0) {
return getFrontendInfo(dev); return getFrontendInfo(cDevice::ActualDevice()->CardIndex());
} }
else if (strcasecmp(Command, "NAME") == 0) { else if (strcasecmp(Command, "NAME") == 0) {
return getFrontendName(dev); return getFrontendName(cDevice::ActualDevice()->CardIndex());
} }
else if (strcasecmp(Command, "STAT") == 0) { else if (strcasecmp(Command, "STAT") == 0) {
return getFrontendStatus(dev); return getFrontendStatus(cDevice::ActualDevice()->CardIndex());
}
else if (strcasecmp(Command, "STRG") == 0) {
return cString::sprintf("%d on device #%d", dev->SignalStrength(), dev->CardIndex());
}
else if (strcasecmp(Command, "QUAL") == 0) {
return cString::sprintf("%d on device #%d", dev->SignalQuality(), dev->CardIndex());
} }
else if (strcasecmp(Command, "SGNL") == 0) { else if (strcasecmp(Command, "SGNL") == 0) {
int value = getSignal(dev); int value = getSignal(cDevice::ActualDevice()->CardIndex());
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, dev->CardIndex()); return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, cDevice::ActualDevice()->CardIndex());
} }
else if (strcasecmp(Command, "SNRA") == 0) { else if (strcasecmp(Command, "SNRA") == 0) {
int value = getSNR(dev); int value = getSNR(cDevice::ActualDevice()->CardIndex());
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, dev->CardIndex()); return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, cDevice::ActualDevice()->CardIndex());
} }
else if (strcasecmp(Command, "BERA") == 0) { else if (strcasecmp(Command, "BERA") == 0) {
return cString::sprintf("%08X on device #%d", getBER(dev), dev->CardIndex()); return cString::sprintf("%08X on device #%d", getBER(cDevice::ActualDevice()->CardIndex()), cDevice::ActualDevice()->CardIndex());
} }
else if (strcasecmp(Command, "UNCB") == 0) { else if (strcasecmp(Command, "UNCB") == 0) {
return cString::sprintf("%08X on device #%d", getUNC(dev), dev->CardIndex()); return cString::sprintf("%08X on device #%d", getUNC(cDevice::ActualDevice()->CardIndex()), cDevice::ActualDevice()->CardIndex());
} }
else if (strcasecmp(Command, "VIBR") == 0) { else if (strcasecmp(Command, "VIBR") == 0) {
if (cFemonOsd::Instance()) if (cFemonOsd::Instance())
@@ -297,7 +276,7 @@ public:
cMenuFemonSetup::cMenuFemonSetup(void) cMenuFemonSetup::cMenuFemonSetup(void)
{ {
debug("%s()\n", __PRETTY_FUNCTION__); Dprintf("%s()\n", __PRETTY_FUNCTION__);
dispmodes[eFemonModeBasic] = tr("basic"); dispmodes[eFemonModeBasic] = tr("basic");
dispmodes[eFemonModeTransponder] = tr("transponder"); dispmodes[eFemonModeTransponder] = tr("transponder");
dispmodes[eFemonModeStream] = tr("stream"); dispmodes[eFemonModeStream] = tr("stream");
@@ -315,7 +294,6 @@ cMenuFemonSetup::cMenuFemonSetup(void)
themes[eFemonThemeEgalsTry] = tr("EgalsTry"); themes[eFemonThemeEgalsTry] = tr("EgalsTry");
themes[eFemonThemeDuotone] = tr("Duotone"); themes[eFemonThemeDuotone] = tr("Duotone");
themes[eFemonThemeSilverGreen] = tr("SilverGreen"); themes[eFemonThemeSilverGreen] = tr("SilverGreen");
themes[eFemonThemePearlHD] = tr("PearlHD");
data = femonConfig; data = femonConfig;
Setup(); Setup();
@@ -343,8 +321,11 @@ void cMenuFemonSetup::Setup(void)
Add(new cMenuEditBoolItem(tr("Position"), &data.position, trVDR("bottom"), trVDR("top"))); Add(new cMenuEditBoolItem(tr("Position"), &data.position, trVDR("bottom"), trVDR("top")));
help.Append(tr("Define the position of OSD.")); help.Append(tr("Define the position of OSD."));
Add(new cMenuEditIntItem(tr("Downscale OSD size [%]"), &data.downscale, 0, 20)); Add(new cMenuEditIntItem(trVDR("Setup.OSD$Height"), &data.osdheight, 400, 500));
help.Append(tr("Define the downscale ratio for OSD size.")); help.Append(tr("Define the height of OSD."));
Add(new cMenuEditIntItem(tr("Horizontal offset"), &data.osdoffset, -50, 50));
help.Append(tr("Define the horizontal offset of OSD."));
Add(new cMenuEditIntItem(tr("Red limit [%]"), &data.redlimit, 1, 50)); Add(new cMenuEditIntItem(tr("Red limit [%]"), &data.redlimit, 1, 50));
help.Append(tr("Define a limit for red bar, which is used to indicate a bad signal.")); help.Append(tr("Define a limit for red bar, which is used to indicate a bad signal."));
@@ -380,14 +361,15 @@ void cMenuFemonSetup::Setup(void)
void cMenuFemonSetup::Store(void) void cMenuFemonSetup::Store(void)
{ {
debug("%s()\n", __PRETTY_FUNCTION__); Dprintf("%s()\n", __PRETTY_FUNCTION__);
femonConfig = data; femonConfig = data;
SetupStore("HideMenu", femonConfig.hidemenu); SetupStore("HideMenu", femonConfig.hidemenu);
SetupStore("DisplayMode", femonConfig.displaymode); SetupStore("DisplayMode", femonConfig.displaymode);
SetupStore("Skin", femonConfig.skin); SetupStore("Skin", femonConfig.skin);
SetupStore("Theme", femonConfig.theme); SetupStore("Theme", femonConfig.theme);
SetupStore("Position", femonConfig.position); SetupStore("Position", femonConfig.position);
SetupStore("Downscale", femonConfig.downscale); SetupStore("OSDHeight", femonConfig.osdheight);
SetupStore("OSDOffset", femonConfig.osdoffset);
SetupStore("RedLimit", femonConfig.redlimit); SetupStore("RedLimit", femonConfig.redlimit);
SetupStore("GreenLimit", femonConfig.greenlimit); SetupStore("GreenLimit", femonConfig.greenlimit);
SetupStore("UpdateInterval", femonConfig.updateinterval); SetupStore("UpdateInterval", femonConfig.updateinterval);

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -17,14 +17,15 @@ cFemonConfig::cFemonConfig(void)
skin = 0; skin = 0;
theme = 0; theme = 0;
position = 1; position = 1;
downscale = 0;
redlimit = 33; redlimit = 33;
greenlimit = 66; greenlimit = 66;
updateinterval = 5; updateinterval = 5;
analyzestream = 1; analyzestream = 1;
calcinterval = 20; calcinterval = 20;
osdheight = 480;
osdoffset = 0;
usesvdrp = 0; usesvdrp = 0;
svdrpport = 6419; svdrpport = 2001;
strncpy(svdrpip, "0.0.0.0", sizeof(svdrpip)); strncpy(svdrpip, "0.0.0.0", sizeof(svdrpip));
} }
@@ -138,16 +139,4 @@ const cFemonTheme femonTheme[eFemonThemeMaxNumber] =
0xFFCE7B00, // clrYellow 0xFFCE7B00, // clrYellow
0xFF336600, // clrGreen 0xFF336600, // clrGreen
}, },
{
// eFemonThemePearlHD
4, // bpp
0x90000000, // clrBackground
0xCC000000, // clrTitleBackground
0xFFBEBEBE, // clrTitleText
0xFF4E78B1, // clrActiveText
0xFFBEBEBE, // clrInactiveText
0xAAFF0000, // clrRed
0xAAF8F800, // clrYellow
0x6000ff00, // clrGreen
},
}; };

View File

@@ -28,12 +28,13 @@ public:
int skin; int skin;
int theme; int theme;
int position; int position;
int downscale;
int redlimit; int redlimit;
int greenlimit; int greenlimit;
int updateinterval; int updateinterval;
int analyzestream; int analyzestream;
int calcinterval; int calcinterval;
int osdheight;
int osdoffset;
int usesvdrp; int usesvdrp;
int svdrpport; int svdrpport;
char svdrpip[MaxSvdrpIp + 1]; // must end with additional null char svdrpip[MaxSvdrpIp + 1]; // must end with additional null
@@ -59,21 +60,20 @@ enum eFemonThemes
eFemonThemeEgalsTry, eFemonThemeEgalsTry,
eFemonThemeDuotone, eFemonThemeDuotone,
eFemonThemeSilverGreen, eFemonThemeSilverGreen,
eFemonThemePearlHD,
eFemonThemeMaxNumber eFemonThemeMaxNumber
}; };
struct cFemonTheme struct cFemonTheme
{ {
int bpp; int bpp;
unsigned int clrBackground; int clrBackground;
unsigned int clrTitleBackground; int clrTitleBackground;
unsigned int clrTitleText; int clrTitleText;
unsigned int clrActiveText; int clrActiveText;
unsigned int clrInactiveText; int clrInactiveText;
unsigned int clrRed; int clrRed;
unsigned int clrYellow; int clrYellow;
unsigned int clrGreen; int clrGreen;
}; };
extern const cFemonTheme femonTheme[eFemonThemeMaxNumber]; extern const cFemonTheme femonTheme[eFemonThemeMaxNumber];

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -5,13 +5,7 @@
* *
*/ */
#ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#endif
#include <ctype.h> #include <ctype.h>
#include <math.h>
#include "iptvservice.h"
#include "femoncfg.h" #include "femoncfg.h"
#include "femonreceiver.h" #include "femonreceiver.h"
#include "femontools.h" #include "femontools.h"
@@ -21,29 +15,19 @@
#define CHANNELINPUT_TIMEOUT 1000 #define CHANNELINPUT_TIMEOUT 1000
#define SVDRPPLUGIN "svdrpservice" #define SVDRPPLUGIN "svdrpservice"
#define OSDWIDTH m_OsdWidth // in pixels #define OSDHEIGHT femonConfig.osdheight // in pixels
#define OSDHEIGHT m_OsdHeight // in pixels #define OSDWIDTH 600 // in pixels
#define OSDROWHEIGHT m_Font->Height() // in pixels #define OSDROWHEIGHT m_Font->Height() // in pixels
#define OSDINFOHEIGHT (OSDROWHEIGHT * 13) // in pixels (13 rows) #define OSDINFOHEIGHT (OSDROWHEIGHT * 13) // in pixels (13 rows)
#define OSDSTATUSHEIGHT (OSDROWHEIGHT * 6) // in pixels (6 rows) #define OSDSTATUSHEIGHT (OSDROWHEIGHT * 6) // in pixels (6 rows)
#define OSDSYMBOL(id) femonSymbols.Get(id) #define OSDSPACING 5
#define OSDSPACING femonSymbols.GetSpacing() #define OSDROUNDING 10
#define OSDROUNDING femonSymbols.GetRounding()
#define IS_OSDROUNDING (femonConfig.skin == eFemonSkinElchi) #define IS_OSDROUNDING (femonConfig.skin == eFemonSkinElchi)
#define IS_OSDRESOLUTION(r1, r2) (abs(r1 - r2) < 20)
#define OSDINFOWIN_Y(offset) (femonConfig.position ? (OSDHEIGHT - OSDINFOHEIGHT + offset) : offset) #define OSDINFOWIN_Y(offset) (femonConfig.position ? (OSDHEIGHT - OSDINFOHEIGHT + offset) : offset)
#define OSDINFOWIN_X(col) ((col == 4) ? int(round(OSDWIDTH * 0.76)) : \ #define OSDINFOWIN_X(col) ((col == 4) ? 455 : (col == 3) ? 305 : (col == 2) ? 155 : 15)
(col == 3) ? int(round(OSDWIDTH * 0.51)) : \
(col == 2) ? int(round(OSDWIDTH * 0.26)) : \
int(round(OSDWIDTH * 0.025)))
#define OSDSTATUSWIN_Y(offset) (femonConfig.position ? offset : (OSDHEIGHT - OSDSTATUSHEIGHT + offset)) #define OSDSTATUSWIN_Y(offset) (femonConfig.position ? offset : (OSDHEIGHT - OSDSTATUSHEIGHT + offset))
#define OSDSTATUSWIN_X(col) ((col == 7) ? int(round(OSDWIDTH * 0.79)) : \ #define OSDSTATUSWIN_X(col) ((col == 7) ? 475 : (col == 6) ? 410 : (col == 5) ? 275 : (col == 4) ? 220 : (col == 3) ? 125 : (col == 2) ? 70 : 15)
(col == 6) ? int(round(OSDWIDTH * 0.68)) : \
(col == 5) ? int(round(OSDWIDTH * 0.46)) : \
(col == 4) ? int(round(OSDWIDTH * 0.37)) : \
(col == 3) ? int(round(OSDWIDTH * 0.21)) : \
(col == 2) ? int(round(OSDWIDTH * 0.12)) : \
int(round(OSDWIDTH * 0.025)))
#define OSDSTATUSWIN_XSYMBOL(c,w) (c * ((OSDWIDTH - (5 * w)) / 6) + ((c - 1) * w)) #define OSDSTATUSWIN_XSYMBOL(c,w) (c * ((OSDWIDTH - (5 * w)) / 6) + ((c - 1) * w))
#define OSDBARWIDTH(x) (OSDWIDTH * x / 100) #define OSDBARWIDTH(x) (OSDWIDTH * x / 100)
@@ -69,12 +53,12 @@
#define OSDDRAWSTATUSBAR(value) \ #define OSDDRAWSTATUSBAR(value) \
if (value > 0) { \ if (value > 0) { \
int barvalue = OSDBARWIDTH(value); \ value = OSDBARWIDTH(value); \
m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset) + 3, min(OSDBARWIDTH(femonConfig.redlimit), barvalue), OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT - 3, femonTheme[femonConfig.theme].clrRed); \ m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset) + 3, min(OSDBARWIDTH(femonConfig.redlimit), value), OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT - 3, femonTheme[femonConfig.theme].clrRed); \
if (barvalue > OSDBARWIDTH(femonConfig.redlimit)) \ if (value > OSDBARWIDTH(femonConfig.redlimit)) \
m_Osd->DrawRectangle(OSDBARWIDTH(femonConfig.redlimit), OSDSTATUSWIN_Y(offset) + 3, min((OSDWIDTH * femonConfig.greenlimit / 100), barvalue), OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT - 3, femonTheme[femonConfig.theme].clrYellow); \ m_Osd->DrawRectangle(OSDBARWIDTH(femonConfig.redlimit), OSDSTATUSWIN_Y(offset) + 3, min((OSDWIDTH * femonConfig.greenlimit / 100), value), OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT - 3, femonTheme[femonConfig.theme].clrYellow); \
if (barvalue > OSDBARWIDTH(femonConfig.greenlimit)) \ if (value > OSDBARWIDTH(femonConfig.greenlimit)) \
m_Osd->DrawRectangle(OSDBARWIDTH(femonConfig.greenlimit), OSDSTATUSWIN_Y(offset) + 3, barvalue, OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT - 3, femonTheme[femonConfig.theme].clrGreen); \ m_Osd->DrawRectangle(OSDBARWIDTH(femonConfig.greenlimit), OSDSTATUSWIN_Y(offset) + 3, value, OSDSTATUSWIN_Y(offset) + OSDROWHEIGHT - 3, femonTheme[femonConfig.theme].clrGreen); \
} }
#define OSDDRAWSTATUSTITLEBAR(title) \ #define OSDDRAWSTATUSTITLEBAR(title) \
@@ -146,14 +130,13 @@ public:
virtual int Width(const char *s) const { return 50; } virtual int Width(const char *s) const { return 50; }
virtual int Height(void) const { return 20; } virtual int Height(void) const { return 20; }
virtual void DrawText(cBitmap *Bitmap, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, int Width) const {} virtual void DrawText(cBitmap *Bitmap, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, int Width) const {}
virtual void DrawText(cPixmap *Pixmap, int x, int y, const char *s, tColor ColorFg, tColor ColorBg, int Width) const {}
}; };
cFemonOsd *cFemonOsd::pInstance = NULL; cFemonOsd *cFemonOsd::pInstance = NULL;
cFemonOsd *cFemonOsd::Instance(bool create) cFemonOsd *cFemonOsd::Instance(bool create)
{ {
debug("%s()\n", __PRETTY_FUNCTION__); Dprintf("%s()\n", __PRETTY_FUNCTION__);
if ((pInstance == NULL) && create) if ((pInstance == NULL) && create)
{ {
pInstance = new cFemonOsd(); pInstance = new cFemonOsd();
@@ -172,56 +155,29 @@ cFemonOsd::cFemonOsd()
m_SvdrpPlugin(NULL), m_SvdrpPlugin(NULL),
m_Number(0), m_Number(0),
m_OldNumber(0), m_OldNumber(0),
m_Quality(0),
m_QualityValid(false),
m_Strength(0),
m_StrengthValid(false),
m_SNR(0), m_SNR(0),
m_SNRValid(false),
m_Signal(0), m_Signal(0),
m_SignalValid(false),
m_BER(0), m_BER(0),
m_BERValid(false),
m_UNC(0), m_UNC(0),
m_UNCValid(false),
m_FrontendName(""),
m_FrontendStatusValid(false),
m_DeviceSource(DEVICESOURCE_DVBAPI),
m_DisplayMode(femonConfig.displaymode), m_DisplayMode(femonConfig.displaymode),
m_OsdWidth(cOsd::OsdWidth() * (100 - femonConfig.downscale) / 100),
m_OsdHeight(cOsd::OsdHeight() * (100 - femonConfig.downscale) / 100),
m_OsdLeft(cOsd::OsdLeft() + (cOsd::OsdWidth() * femonConfig.downscale / 200)),
m_OsdTop(cOsd::OsdTop() + (cOsd::OsdHeight() * femonConfig.downscale / 200)),
m_InputTime(0), m_InputTime(0),
m_Sleep(), m_Sleep(),
m_Mutex() m_Mutex()
{ {
int tmp; Dprintf("%s()\n", __PRETTY_FUNCTION__);
debug("%s()\n", __PRETTY_FUNCTION__);
memset(&m_FrontendStatus, 0, sizeof(m_FrontendStatus));
memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo));
m_SvdrpConnection.handle = -1; m_SvdrpConnection.handle = -1;
femonSymbols.Refresh(); m_Font = cFont::CreateFont(Setup.FontSml, min(max(Setup.FontSmlSize, MINFONTSIZE), MAXFONTSIZE));
m_Font = cFont::CreateFont(Setup.FontSml, constrain(Setup.FontSmlSize, MINFONTSIZE, MAXFONTSIZE));
if (!m_Font || !m_Font->Height()) { if (!m_Font || !m_Font->Height()) {
m_Font = new cFemonDummyFont; m_Font = new cFemonDummyFont;
error("cFemonOsd::cFemonOsd() cannot create required font."); esyslog("ERROR: cFemonOsd::cFemonOsd() cannot create required font.");
}
tmp = 5 * OSDSYMBOL(SYMBOL_LOCK).Width() + 6 * OSDSPACING;
if (OSDWIDTH < tmp) {
error("cFemonOsd::cFemonOsd() OSD width (%d) smaller than required (%d).", OSDWIDTH, tmp);
OSDWIDTH = tmp;
}
tmp = OSDINFOHEIGHT + OSDROWHEIGHT + OSDSTATUSHEIGHT;
if (OSDHEIGHT < tmp) {
error("cFemonOsd::cFemonOsd() OSD height (%d) smaller than required (%d).", OSDHEIGHT, tmp);
OSDHEIGHT = tmp;
} }
if (OSDHEIGHT < (OSDINFOHEIGHT + OSDROWHEIGHT + OSDSTATUSHEIGHT))
OSDHEIGHT = (OSDINFOHEIGHT + OSDROWHEIGHT + OSDSTATUSHEIGHT);
} }
cFemonOsd::~cFemonOsd(void) cFemonOsd::~cFemonOsd(void)
{ {
debug("%s()\n", __PRETTY_FUNCTION__); Dprintf("%s()\n", __PRETTY_FUNCTION__);
m_Sleep.Signal(); m_Sleep.Signal();
if (Running()) if (Running())
Cancel(3); Cancel(3);
@@ -248,142 +204,104 @@ cFemonOsd::~cFemonOsd(void)
void cFemonOsd::DrawStatusWindow(void) void cFemonOsd::DrawStatusWindow(void)
{ {
cMutexLock lock(&m_Mutex); cMutexLock lock(&m_Mutex);
cBitmap *bm = NULL;
int snr = m_SNR / 655;
int signal = m_Signal / 655;
int offset = 0;
int x = OSDWIDTH - OSDROUNDING;
int y = 0;
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (m_Osd && channel) { if (m_Osd && channel) {
cBitmap *bm = NULL;
int offset = 0;
int x = OSDWIDTH - OSDROUNDING;
int y = 0;
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
OSDDRAWSTATUSTITLEBAR(*cString::sprintf("%d%s %s", m_Number ? m_Number : channel->Number(), m_Number ? "-" : "", channel->ShortName(true))); OSDDRAWSTATUSTITLEBAR(*cString::sprintf("%d%s %s", m_Number ? m_Number : channel->Number(), m_Number ? "-" : "", channel->ShortName(true)));
if (m_SvdrpFrontend >= 0) { if (m_SvdrpFrontend >= 0) {
bm = &OSDSYMBOL(SYMBOL_SVDRP); bm = &bmSymbol[SYMBOL_SVDRP];
OSDDRAWSTATUSBM(OSDSPACING); OSDDRAWSTATUSBM(OSDSPACING);
} }
switch (cDevice::ActualDevice()->CardIndex()) { switch (cDevice::ActualDevice()->CardIndex()) {
case 1: bm = &OSDSYMBOL(SYMBOL_ONE); break; case 1: bm = &bmSymbol[SYMBOL_ONE]; break;
case 2: bm = &OSDSYMBOL(SYMBOL_TWO); break; case 2: bm = &bmSymbol[SYMBOL_TWO]; break;
case 3: bm = &OSDSYMBOL(SYMBOL_THREE); break; case 3: bm = &bmSymbol[SYMBOL_THREE]; break;
case 4: bm = &OSDSYMBOL(SYMBOL_FOUR); break; case 4: bm = &bmSymbol[SYMBOL_FOUR]; break;
case 5: bm = &OSDSYMBOL(SYMBOL_FIVE); break; case 5: bm = &bmSymbol[SYMBOL_FIVE]; break;
case 6: bm = &OSDSYMBOL(SYMBOL_SIX); break; case 6: bm = &bmSymbol[SYMBOL_SIX]; break;
case 7: bm = &OSDSYMBOL(SYMBOL_SEVEN); break; case 7: bm = &bmSymbol[SYMBOL_SEVEN]; break;
case 8: bm = &OSDSYMBOL(SYMBOL_EIGHT); break; default: bm = &bmSymbol[SYMBOL_ZERO]; break;
default: bm = &OSDSYMBOL(SYMBOL_ZERO); break;
} }
OSDDRAWSTATUSBM(OSDSPACING); OSDDRAWSTATUSBM(OSDSPACING);
bm = &OSDSYMBOL(SYMBOL_DEVICE); bm = &bmSymbol[SYMBOL_DEVICE];
OSDDRAWSTATUSBM(0); OSDDRAWSTATUSBM(0);
if (IS_AUDIO_TRACK(track)) { if (IS_AUDIO_TRACK(track)) {
switch (int(track - ttAudioFirst)) { switch (int(track - ttAudioFirst)) {
case 1: bm = &OSDSYMBOL(SYMBOL_ONE); break; case 1: bm = &bmSymbol[SYMBOL_ONE]; break;
case 2: bm = &OSDSYMBOL(SYMBOL_TWO); break; case 2: bm = &bmSymbol[SYMBOL_TWO]; break;
case 3: bm = &OSDSYMBOL(SYMBOL_THREE); break; case 3: bm = &bmSymbol[SYMBOL_THREE]; break;
case 4: bm = &OSDSYMBOL(SYMBOL_FOUR); break; case 4: bm = &bmSymbol[SYMBOL_FOUR]; break;
case 5: bm = &OSDSYMBOL(SYMBOL_FIVE); break; case 5: bm = &bmSymbol[SYMBOL_FIVE]; break;
case 6: bm = &OSDSYMBOL(SYMBOL_SIX); break; case 6: bm = &bmSymbol[SYMBOL_SIX]; break;
case 7: bm = &OSDSYMBOL(SYMBOL_SEVEN); break; case 7: bm = &bmSymbol[SYMBOL_SEVEN]; break;
case 8: bm = &OSDSYMBOL(SYMBOL_EIGHT); break; default: bm = &bmSymbol[SYMBOL_ZERO]; break;
default: bm = &OSDSYMBOL(SYMBOL_ZERO); break;
} }
OSDDRAWSTATUSBM(OSDSPACING); OSDDRAWSTATUSBM(OSDSPACING);
switch (cDevice::PrimaryDevice()->GetAudioChannel()) { switch (cDevice::PrimaryDevice()->GetAudioChannel()) {
case 1: bm = &OSDSYMBOL(SYMBOL_MONO_LEFT); break; case 1: bm = &bmSymbol[SYMBOL_MONO_LEFT]; break;
case 2: bm = &OSDSYMBOL(SYMBOL_MONO_RIGHT); break; case 2: bm = &bmSymbol[SYMBOL_MONO_RIGHT]; break;
default: bm = &OSDSYMBOL(SYMBOL_STEREO); break; default: bm = &bmSymbol[SYMBOL_STEREO]; break;
} }
OSDDRAWSTATUSBM(0); OSDDRAWSTATUSBM(0);
} }
else if (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) { else if (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) {
if (m_Receiver->AC3_5_1()) bm = &OSDSYMBOL(SYMBOL_DD51); if (m_Receiver->AC3_5_1()) bm = &bmSymbol[SYMBOL_DD51];
else if (m_Receiver->AC3_2_0()) bm = &OSDSYMBOL(SYMBOL_DD20); else if (m_Receiver->AC3_2_0()) bm = &bmSymbol[SYMBOL_DD20];
else bm = &OSDSYMBOL(SYMBOL_DD); else bm = &bmSymbol[SYMBOL_DD];
OSDDRAWSTATUSBM(OSDSPACING); OSDDRAWSTATUSBM(OSDSPACING);
} }
if (m_Receiver) { if (m_Receiver) {
if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 1080)) {
switch (m_Receiver->VideoScan()) {
case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080i); break;
case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080p); break;
default: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080); break;
}
}
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 720)) {
switch (m_Receiver->VideoScan()) {
case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_720i); break;
case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_720p); break;
default: bm = &OSDSYMBOL(SYMBOL_FORMAT_720); break;
}
}
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 576)) {
switch (m_Receiver->VideoScan()) {
case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_576i); break;
case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_576p); break;
default: bm = &OSDSYMBOL(SYMBOL_FORMAT_576); break;
}
}
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 480)) {
switch (m_Receiver->VideoScan()) {
case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_480i); break;
case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_480p); break;
default: bm = &OSDSYMBOL(SYMBOL_FORMAT_480); break;
}
}
else
bm = NULL;
OSDDRAWSTATUSBM(OSDSPACING);
switch (m_Receiver->VideoCodec()) { switch (m_Receiver->VideoCodec()) {
case VIDEO_CODEC_MPEG2: bm = &OSDSYMBOL(SYMBOL_MPEG2); break; case VIDEO_CODEC_MPEG2: bm = &bmSymbol[SYMBOL_MPEG2]; break;
case VIDEO_CODEC_H264: bm = &OSDSYMBOL(SYMBOL_H264); break; case VIDEO_CODEC_H264: bm = &bmSymbol[SYMBOL_H264]; break;
default: bm = NULL; break;
}
OSDDRAWSTATUSBM(OSDSPACING);
switch (m_Receiver->VideoFormat()) {
case VIDEO_FORMAT_PAL: bm = &OSDSYMBOL(SYMBOL_PAL); break;
case VIDEO_FORMAT_NTSC: bm = &OSDSYMBOL(SYMBOL_NTSC); break;
default: bm = NULL; break; default: bm = NULL; break;
} }
OSDDRAWSTATUSBM(OSDSPACING); OSDDRAWSTATUSBM(OSDSPACING);
switch (m_Receiver->VideoFormat()) {
case VIDEO_FORMAT_PAL: bm = &bmSymbol[SYMBOL_PAL]; break;
case VIDEO_FORMAT_NTSC: bm = &bmSymbol[SYMBOL_NTSC]; break;
default: bm = NULL; break;
}
OSDDRAWSTATUSBM(OSDSPACING);
switch (m_Receiver->VideoAspectRatio()) { switch (m_Receiver->VideoAspectRatio()) {
case VIDEO_ASPECT_RATIO_1_1: bm = &OSDSYMBOL(SYMBOL_AR_1_1); break; case VIDEO_ASPECT_RATIO_1_1: bm = &bmSymbol[SYMBOL_AR_1_1]; break;
case VIDEO_ASPECT_RATIO_4_3: bm = &OSDSYMBOL(SYMBOL_AR_4_3); break; case VIDEO_ASPECT_RATIO_4_3: bm = &bmSymbol[SYMBOL_AR_4_3]; break;
case VIDEO_ASPECT_RATIO_16_9: bm = &OSDSYMBOL(SYMBOL_AR_16_9); break; case VIDEO_ASPECT_RATIO_16_9: bm = &bmSymbol[SYMBOL_AR_16_9]; break;
case VIDEO_ASPECT_RATIO_2_21_1: bm = &OSDSYMBOL(SYMBOL_AR_2_21_1); break; case VIDEO_ASPECT_RATIO_2_21_1: bm = &bmSymbol[SYMBOL_AR_2_21_1]; break;
default: bm = NULL; break; default: bm = NULL; break;
} }
OSDDRAWSTATUSBM(OSDSPACING); OSDDRAWSTATUSBM(OSDSPACING);
} }
if (channel->Ca() > 0xFF) { if (channel->Ca() > 0xFF) {
bm = &OSDSYMBOL(SYMBOL_ENCRYPTED); bm = &bmSymbol[SYMBOL_ENCRYPTED];
OSDDRAWSTATUSBM(OSDSPACING); OSDDRAWSTATUSBM(OSDSPACING);
} }
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
if (m_StrengthValid) OSDDRAWSTATUSBAR(signal);
OSDDRAWSTATUSBAR(m_Strength);
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
if (m_QualityValid) OSDDRAWSTATUSBAR(snr);
OSDDRAWSTATUSBAR(m_Quality);
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWSTATUSVALUES("STR:", m_SignalValid ? *cString::sprintf("%04x", m_Signal) : "", m_SignalValid ? *cString::sprintf("(%2d%%)", m_Signal / 655) : "", OSDDRAWSTATUSVALUES("STR:", *cString::sprintf("%04x", m_Signal), *cString::sprintf("(%2d%%)", m_Signal / 655), "BER:", *cString::sprintf("%08x", m_BER),
"BER:", m_BERValid ? *cString::sprintf("%08x", m_BER) : "", *cString::sprintf("%s:", tr("Video")), *cString::sprintf("%s:", tr("Video")), *getBitrateMbits(m_Receiver ? m_Receiver->VideoBitrate() : (m_SvdrpFrontend >= 0 ? m_SvdrpVideoBitrate : -1.0)));
*getBitrateMbits(m_Receiver ? m_Receiver->VideoBitrate() : (m_SvdrpFrontend >= 0 ? m_SvdrpVideoBitrate : -1.0)));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWSTATUSVALUES("SNR:", m_SNRValid ? *cString::sprintf("%04x", m_SNR) : "", m_SNRValid ? *cString::sprintf("(%2d%%)", m_SNR / 655) : "", OSDDRAWSTATUSVALUES("SNR:", *cString::sprintf("%04x", m_SNR), *cString::sprintf("(%2d%%)", m_SNR / 655), "UNC:", *cString::sprintf("%08x", m_UNC),
"UNC:", m_UNCValid ? *cString::sprintf("%08x", m_UNC) : "",
*cString::sprintf("%s:", (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) ? tr("AC-3") : tr("Audio")), *cString::sprintf("%s:", (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) ? tr("AC-3") : tr("Audio")),
*getBitrateKbits(m_Receiver ? ((m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) ? m_Receiver->AC3Bitrate() : m_Receiver->AudioBitrate()) : (m_SvdrpFrontend >= 0 ? m_SvdrpAudioBitrate : -1.0))); *getBitrateKbits(m_Receiver ? ((m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) ? m_Receiver->AC3Bitrate() : m_Receiver->AudioBitrate()) : (m_SvdrpFrontend >= 0 ? m_SvdrpAudioBitrate : -1.0)));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
x = OSDSYMBOL(SYMBOL_LOCK).Width(); x = bmSymbol[SYMBOL_LOCK].Width();
y = (OSDROWHEIGHT - OSDSYMBOL(SYMBOL_LOCK).Height()) / 2; y = (OSDROWHEIGHT - bmSymbol[SYMBOL_LOCK].Height()) / 2;
if (m_FrontendStatusValid) { OSDDRAWSTATUSFRONTEND(1, bmSymbol[SYMBOL_LOCK], FE_HAS_LOCK);
OSDDRAWSTATUSFRONTEND(1, OSDSYMBOL(SYMBOL_LOCK), FE_HAS_LOCK); OSDDRAWSTATUSFRONTEND(2, bmSymbol[SYMBOL_SIGNAL], FE_HAS_SIGNAL);
OSDDRAWSTATUSFRONTEND(2, OSDSYMBOL(SYMBOL_SIGNAL), FE_HAS_SIGNAL); OSDDRAWSTATUSFRONTEND(3, bmSymbol[SYMBOL_CARRIER], FE_HAS_CARRIER);
OSDDRAWSTATUSFRONTEND(3, OSDSYMBOL(SYMBOL_CARRIER), FE_HAS_CARRIER); OSDDRAWSTATUSFRONTEND(4, bmSymbol[SYMBOL_VITERBI], FE_HAS_VITERBI);
OSDDRAWSTATUSFRONTEND(4, OSDSYMBOL(SYMBOL_VITERBI), FE_HAS_VITERBI); OSDDRAWSTATUSFRONTEND(5, bmSymbol[SYMBOL_SYNC], FE_HAS_SYNC);
OSDDRAWSTATUSFRONTEND(5, OSDSYMBOL(SYMBOL_SYNC), FE_HAS_SYNC);
}
OSDDRAWSTATUSBOTTOMBAR(); OSDDRAWSTATUSBOTTOMBAR();
m_Osd->Flush(); m_Osd->Flush();
} }
@@ -392,12 +310,11 @@ void cFemonOsd::DrawStatusWindow(void)
void cFemonOsd::DrawInfoWindow(void) void cFemonOsd::DrawInfoWindow(void)
{ {
cMutexLock lock(&m_Mutex); cMutexLock lock(&m_Mutex);
int offset = 0;
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
if (m_Osd && channel) { if (m_Osd && channel) {
int offset = 0;
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
switch (m_DisplayMode) { switch (m_DisplayMode) {
case eFemonModeTransponder: case eFemonModeTransponder:
OSDDRAWINFOTITLEBAR(tr("Transponder Information")); OSDDRAWINFOTITLEBAR(tr("Transponder Information"));
@@ -420,78 +337,46 @@ void cFemonOsd::DrawInfoWindow(void)
OSDDRAWINFOLEFT( trVDR("CA"), *getCAids(channel)); OSDDRAWINFOLEFT( trVDR("CA"), *getCAids(channel));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
switch (channel->Source() & cSource::st_Mask) { switch (channel->Source() & cSource::st_Mask) {
case cSource::stSat: { case cSource::stSat:
cDvbTransponderParameters dtp(channel->Parameters()); OSDDRAWINFOLINE(*cString::sprintf("DVB-S #%d - %s", (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name));
OSDDRAWINFOLINE(*cString::sprintf("%s #%d - %s", *getSatelliteSystem(dtp.System()), (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), *m_FrontendName));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency())); OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency()));
OSDDRAWINFORIGHT(trVDR("Source"), *cSource::ToString(channel->Source())); OSDDRAWINFORIGHT(trVDR("Source"), *cSource::ToString(channel->Source()));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Srate"), *cString::sprintf("%d", channel->Srate())); OSDDRAWINFOLEFT( trVDR("Srate"), *cString::sprintf("%d", channel->Srate()));
OSDDRAWINFORIGHT(trVDR("Polarization"), *cString::sprintf("%c", toupper(dtp.Polarization()))); OSDDRAWINFORIGHT(trVDR("Polarization"), *cString::sprintf("%c", toupper(channel->Polarization())));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(dtp.Inversion())); OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(channel->Inversion()));
OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(dtp.CoderateH())); OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(channel->CoderateH()));
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("System"), *getSatelliteSystem(dtp.System()));
if (dtp.System())
OSDDRAWINFORIGHT(trVDR("RollOff"), *getRollOff(dtp.RollOff()));
}
break; break;
case cSource::stCable: { case cSource::stCable:
cDvbTransponderParameters dtp(channel->Parameters()); OSDDRAWINFOLINE(*cString::sprintf("DVB-C #%d - %s", (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name));
OSDDRAWINFOLINE(*cString::sprintf("DVB-C #%d - %s", (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), *m_FrontendName));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency())); OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency()));
OSDDRAWINFORIGHT(trVDR("Source"), *cSource::ToString(channel->Source())); OSDDRAWINFORIGHT(trVDR("Source"), *cSource::ToString(channel->Source()));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Srate"), *cString::sprintf("%d", channel->Srate())); OSDDRAWINFOLEFT( trVDR("Srate"), *cString::sprintf("%d", channel->Srate()));
OSDDRAWINFORIGHT(trVDR("Modulation"), *getModulation(dtp.Modulation())); OSDDRAWINFORIGHT(trVDR("Modulation"), *getModulation(channel->Modulation()));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(dtp.Inversion())); OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(channel->Inversion()));
OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(dtp.CoderateH())); OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(channel->CoderateH()));
}
break; break;
case cSource::stTerr: { case cSource::stTerr:
cDvbTransponderParameters dtp(channel->Parameters()); OSDDRAWINFOLINE(*cString::sprintf("DVB-T #%d - %s", (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name));
OSDDRAWINFOLINE(*cString::sprintf("%s #%d - %s", *getTerrestrialSystem(dtp.System()), (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), *m_FrontendName));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency())); OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency()));
OSDDRAWINFORIGHT(trVDR("Transmission"), *getTransmission(dtp.Transmission())); OSDDRAWINFORIGHT(trVDR("Transmission"), *getTransmission(channel->Transmission()));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Bandwidth"), *getBandwidth(dtp.Bandwidth())); OSDDRAWINFOLEFT( trVDR("Bandwidth"), *getBandwidth(channel->Bandwidth()));
OSDDRAWINFORIGHT(trVDR("Modulation"), *getModulation(dtp.Modulation())); OSDDRAWINFORIGHT(trVDR("Modulation"), *getModulation(channel->Modulation()));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(dtp.Inversion())); OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(channel->Inversion()));
OSDDRAWINFORIGHT(tr ("Coderate"), *cString::sprintf("%s (H) %s (L)", *getCoderate(dtp.CoderateH()), *getCoderate(dtp.CoderateL()))); OSDDRAWINFORIGHT(tr ("Coderate"), *cString::sprintf("%s (H) %s (L)", *getCoderate(channel->CoderateH()), *getCoderate(channel->CoderateL())));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Hierarchy"), *getHierarchy(dtp.Hierarchy())); OSDDRAWINFOLEFT( trVDR("Hierarchy"), *getHierarchy(channel->Hierarchy()));
OSDDRAWINFORIGHT(trVDR("Guard"), *getGuard(dtp.Guard())); OSDDRAWINFORIGHT(trVDR("Guard"), *getGuard(channel->Guard()));
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("System"), *getTerrestrialSystem(dtp.System()));
if (dtp.System())
OSDDRAWINFORIGHT(trVDR("PlpId"), *cString::sprintf("%d", dtp.PlpId()));
}
break;
case stIptv: {
OSDDRAWINFOLINE(*cString::sprintf("IPTV #%d - %s", (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), *m_FrontendName));
offset += OSDROWHEIGHT;
if (m_SvdrpFrontend < 0) {
cPlugin *p;
IptvService_v1_0 data;
data.cardIndex = cDevice::ActualDevice()->CardIndex();
p = cPluginManager::CallFirstService("IptvService-v1.0", &data);
if (p) {
OSDDRAWINFOLEFT(tr("Protocol"), *data.protocol);
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT(tr("Bitrate"), *data.bitrate);
offset += OSDROWHEIGHT;
}
}
}
break; break;
default: default:
@@ -549,7 +434,7 @@ void cFemonOsd::DrawInfoWindow(void)
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOINACTIVE(tr("Dolby Surround Mode"), *getAC3DolbySurroundMode(m_Receiver->AC3DolbySurroundMode())); OSDDRAWINFOINACTIVE(tr("Dolby Surround Mode"), *getAC3DolbySurroundMode(m_Receiver->AC3DolbySurroundMode()));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOINACTIVE(tr("Low Frequency Effects"), *cString::sprintf("%s", m_Receiver->AC3Lfe() ? trVDR("on") : trVDR("off"))); OSDDRAWINFOINACTIVE(tr("Low Frequency Effects"), *cString::sprintf("%s", m_Receiver->AC3Lfe() ? tr("on") : tr("off")));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOINACTIVE(tr("Dialogue Normalization"), *getAC3DialogLevel(m_Receiver->AC3DialogLevel())); OSDDRAWINFOINACTIVE(tr("Dialogue Normalization"), *getAC3DialogLevel(m_Receiver->AC3DialogLevel()));
} }
@@ -566,7 +451,7 @@ void cFemonOsd::DrawInfoWindow(void)
void cFemonOsd::Action(void) void cFemonOsd::Action(void)
{ {
debug("%s()\n", __PRETTY_FUNCTION__); Dprintf("%s()\n", __PRETTY_FUNCTION__);
cTimeMs t; cTimeMs t;
SvdrpCommand_v1_0 cmd; SvdrpCommand_v1_0 cmd;
cmd.command = cString::sprintf("PLUG %s INFO\r\n", PLUGIN_NAME_I18N); cmd.command = cString::sprintf("PLUG %s INFO\r\n", PLUGIN_NAME_I18N);
@@ -575,158 +460,76 @@ void cFemonOsd::Action(void)
m_SvdrpFrontend = -1; m_SvdrpFrontend = -1;
m_SvdrpVideoBitrate = -1.0; m_SvdrpVideoBitrate = -1.0;
m_SvdrpAudioBitrate = -1.0; m_SvdrpAudioBitrate = -1.0;
switch (m_DeviceSource) { if (m_Frontend != -1) {
case DEVICESOURCE_PVRINPUT: CHECK(ioctl(m_Frontend, FE_READ_STATUS, &m_FrontendStatus));
m_Quality = cDevice::ActualDevice()->SignalStrength(); CHECK(ioctl(m_Frontend, FE_READ_SIGNAL_STRENGTH, &m_Signal));
m_QualityValid = (m_Quality >= 0); CHECK(ioctl(m_Frontend, FE_READ_SNR, &m_SNR));
m_Strength = cDevice::ActualDevice()->SignalStrength(); CHECK(ioctl(m_Frontend, FE_READ_BER, &m_BER));
m_StrengthValid = (m_Strength >= 0); CHECK(ioctl(m_Frontend, FE_READ_UNCORRECTED_BLOCKS, &m_UNC));
m_FrontendName = cDevice::ActualDevice()->DeviceName(); DrawInfoWindow();
m_FrontendStatus = (fe_status_t)(m_StrengthValid ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0); DrawStatusWindow();
m_FrontendStatusValid = m_StrengthValid; }
m_Signal = uint16_t(m_Strength * 0xFFFF / 100); else if (m_SvdrpConnection.handle >= 0) {
m_SignalValid = m_StrengthValid; cmd.handle = m_SvdrpConnection.handle;
m_SNR = 0; m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd);
m_SNRValid = false; if (cmd.responseCode == 900) {
m_BER = 0; for (cLine *line = cmd.reply.First(); line; line = cmd.reply.Next(line)) {
m_BERValid = false; const char *s = line->Text();
m_UNC = 0; if (!strncasecmp(s, "CARD:", 5))
m_UNCValid = false; m_SvdrpFrontend = (int)strtol(s + 5, NULL, 10);
break; else if (!strncasecmp(s, "TYPE:", 5))
case DEVICESOURCE_IPTV: m_FrontendInfo.type = (fe_type_t)strtol(s + 5, NULL, 10);
m_Quality = cDevice::ActualDevice()->SignalQuality(); else if (!strncasecmp(s, "NAME:", 5))
m_QualityValid = (m_Quality >= 0); strn0cpy(m_FrontendInfo.name, s + 5, sizeof(m_FrontendInfo.name));
m_Strength = cDevice::ActualDevice()->SignalStrength(); else if (!strncasecmp(s, "STAT:", 5))
m_StrengthValid = (m_Strength >= 0); m_FrontendStatus = (fe_status_t)strtol(s + 5, NULL, 16);
m_FrontendName = cDevice::ActualDevice()->DeviceName(); else if (!strncasecmp(s, "SGNL:", 5))
m_FrontendStatus = (fe_status_t)(m_StrengthValid ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0); m_Signal = (uint16_t)strtol(s + 5, NULL, 16);
m_FrontendStatusValid = m_StrengthValid; else if (!strncasecmp(s, "SNRA:", 5))
m_Signal = uint16_t(m_Strength * 0xFFFF / 100); m_SNR = (uint16_t)strtol(s + 5, NULL, 16);
m_SignalValid = m_StrengthValid; else if (!strncasecmp(s, "BERA:", 5))
m_SNR = uint16_t(m_Quality * 0xFFFF / 100); m_BER = (uint32_t)strtol(s + 5, NULL, 16);
m_SNRValid = m_QualityValid; else if (!strncasecmp(s, "UNCB:", 5))
m_BER = 0; m_UNC = (uint32_t)strtol(s + 5, NULL, 16);
m_BERValid = false; else if (!strncasecmp(s, "VIBR:", 5))
m_UNC = 0; m_SvdrpVideoBitrate = (double)strtol(s + 5, NULL, 10);
m_UNCValid = false; else if (!strncasecmp(s, "AUBR:", 5))
break; m_SvdrpAudioBitrate = (double)strtol(s + 5, NULL, 10);
default:
case DEVICESOURCE_DVBAPI:
if (m_Frontend != -1) {
m_Quality = cDevice::ActualDevice()->SignalQuality();
m_QualityValid = (m_Quality >= 0);
m_Strength = cDevice::ActualDevice()->SignalStrength();
m_StrengthValid = (m_Strength >= 0);
m_FrontendName = cDevice::ActualDevice()->DeviceName();
m_FrontendStatusValid = (ioctl(m_Frontend, FE_READ_STATUS, &m_FrontendStatus) >= 0);
m_SignalValid = (ioctl(m_Frontend, FE_READ_SIGNAL_STRENGTH, &m_Signal) >= 0);
m_SNRValid = (ioctl(m_Frontend, FE_READ_SNR, &m_SNR) >= 0);
m_BERValid = (ioctl(m_Frontend, FE_READ_BER, &m_BER) >= 0);
m_UNCValid = (ioctl(m_Frontend, FE_READ_UNCORRECTED_BLOCKS, &m_UNC) >= 0);
} }
else if (m_SvdrpConnection.handle >= 0) { }
cmd.handle = m_SvdrpConnection.handle; DrawInfoWindow();
m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd); DrawStatusWindow();
if (cmd.responseCode == 900) { }
m_StrengthValid = false;
m_QualityValid = false;
m_FrontendStatusValid = false;
m_SignalValid = false;
m_SNRValid = false;
m_BERValid = false;
m_UNCValid = false;
for (cLine *line = cmd.reply.First(); line; line = cmd.reply.Next(line)) {
const char *s = line->Text();
if (!strncasecmp(s, "CARD:", 5))
m_SvdrpFrontend = (int)strtol(s + 5, NULL, 10);
else if (!strncasecmp(s, "STRG:", 5)) {
m_Strength = (int)strtol(s + 5, NULL, 10);
m_StrengthValid = (m_Strength >= 0);
}
else if (!strncasecmp(s, "QUAL:", 5)) {
m_Quality = (int)strtol(s + 5, NULL, 10);
m_QualityValid = (m_Quality >= 0);
}
else if (!strncasecmp(s, "TYPE:", 5))
m_FrontendInfo.type = (fe_type_t)strtol(s + 5, NULL, 10);
else if (!strncasecmp(s, "NAME:", 5)) {
m_FrontendName = s + 5;
}
else if (!strncasecmp(s, "STAT:", 5)) {
m_FrontendStatus = (fe_status_t)strtol(s + 5, NULL, 16);
m_FrontendStatusValid = true;
}
else if (!strncasecmp(s, "SGNL:", 5)) {
m_Signal = (uint16_t)strtol(s + 5, NULL, 16);
m_SignalValid = true;
}
else if (!strncasecmp(s, "SNRA:", 5)) {
m_SNR = (uint16_t)strtol(s + 5, NULL, 16);
m_SNRValid = true;
}
else if (!strncasecmp(s, "BERA:", 5)) {
m_BER = (uint32_t)strtol(s + 5, NULL, 16);
m_BERValid = true;
}
else if (!strncasecmp(s, "UNCB:", 5)) {
m_UNC = (uint32_t)strtol(s + 5, NULL, 16);
m_UNCValid = true;
}
else if (!strncasecmp(s, "VIBR:", 5))
m_SvdrpVideoBitrate = (double)strtol(s + 5, NULL, 10);
else if (!strncasecmp(s, "AUBR:", 5))
m_SvdrpAudioBitrate = (double)strtol(s + 5, NULL, 10);
}
}
}
break;
}
DrawInfoWindow();
DrawStatusWindow();
m_Sleep.Wait(max((int)(100 * femonConfig.updateinterval - t.Elapsed()), 3)); m_Sleep.Wait(max((int)(100 * femonConfig.updateinterval - t.Elapsed()), 3));
} }
} }
void cFemonOsd::Show(void) void cFemonOsd::Show(void)
{ {
debug("%s()\n", __PRETTY_FUNCTION__); Dprintf("%s()\n", __PRETTY_FUNCTION__);
int apid[2] = {0, 0};
int dpid[2] = {0, 0};
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); cString dev = cString::sprintf(FRONTEND_DEVICE, cDevice::ActualDevice()->CardIndex(), 0);
m_Frontend = open(dev, O_RDONLY | O_NONBLOCK);
m_DeviceSource = DEVICESOURCE_DVBAPI; if (m_Frontend >= 0) {
if (channel) { if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) {
if (channel->IsSourceType('I')) esyslog("ERROR: cFemonOsd::Show() cannot read frontend info.");
m_DeviceSource = DEVICESOURCE_IPTV; close(m_Frontend);
else if (channel->IsSourceType('V')) m_Frontend = -1;
m_DeviceSource = DEVICESOURCE_PVRINPUT;
}
if (m_DeviceSource == DEVICESOURCE_DVBAPI) {
cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice());
m_Frontend = dev ? open(*cString::sprintf(FRONTEND_DEVICE, dev->Adapter(), dev->Frontend()), O_RDONLY | O_NONBLOCK) : -1;
if (m_Frontend >= 0) {
if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) {
if (!femonConfig.usesvdrp)
error("cFemonOsd::Show() cannot read frontend info.");
close(m_Frontend);
m_Frontend = -1;
memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo));
return;
}
}
else if (femonConfig.usesvdrp) {
if (!SvdrpConnect() || !SvdrpTune())
return;
}
else {
error("cFemonOsd::Show() cannot open frontend device.");
return; return;
} }
} }
else else if (femonConfig.usesvdrp) {
m_Frontend = -1; if (!SvdrpConnect() || !SvdrpTune())
return;
}
else {
esyslog("ERROR: cFemonOsd::Show() cannot open frontend device.");
return;
}
m_Osd = cOsdProvider::NewOsd(m_OsdLeft, m_OsdTop); m_Osd = cOsdProvider::NewOsd(((cOsd::OsdWidth() - OSDWIDTH) / 2) + cOsd::OsdLeft() + femonConfig.osdoffset, ((cOsd::OsdHeight() - OSDHEIGHT) / 2) + cOsd::OsdTop());
if (m_Osd) { if (m_Osd) {
tArea Areas1[] = { { 0, 0, OSDWIDTH - 1, OSDHEIGHT - 1, 8 } }; tArea Areas1[] = { { 0, 0, OSDWIDTH - 1, OSDHEIGHT - 1, 8 } };
if (Setup.AntiAlias && m_Osd->CanHandleAreas(Areas1, sizeof(Areas1) / sizeof(tArea)) == oeOk) { if (Setup.AntiAlias && m_Osd->CanHandleAreas(Areas1, sizeof(Areas1) / sizeof(tArea)) == oeOk) {
@@ -745,81 +548,78 @@ void cFemonOsd::Show(void)
m_Receiver->Deactivate(); m_Receiver->Deactivate();
DELETENULL(m_Receiver); DELETENULL(m_Receiver);
} }
if (femonConfig.analyzestream && channel) { if (femonConfig.analyzestream) {
m_Receiver = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
cDevice::ActualDevice()->AttachReceiver(m_Receiver); if (channel) {
IS_AUDIO_TRACK(track) ? apid[0] = channel->Apid(int(track - ttAudioFirst)) : apid[0] = channel->Apid(0);
IS_DOLBY_TRACK(track) ? dpid[0] = channel->Dpid(int(track - ttDolbyFirst)) : dpid[0] = channel->Dpid(0);
m_Receiver = new cFemonReceiver(channel->GetChannelID(), channel->Ca(), channel->Vpid(), apid, dpid);
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
} }
Start(); Start();
} }
} }
void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber, bool liveView) void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
{ {
debug("%s(%d,%d)\n", __PRETTY_FUNCTION__, device->DeviceNumber(), channelNumber); Dprintf("%s(%d,%d)\n", __PRETTY_FUNCTION__, device->DeviceNumber(), channelNumber);
int apid[2] = {0, 0};
int dpid[2] = {0, 0};
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); if (!device->IsPrimaryDevice() || !channelNumber || cDevice::PrimaryDevice()->CurrentChannel() != channelNumber)
if (!liveView || !channelNumber || !channel || channel->Number() != channelNumber)
return; return;
close(m_Frontend);
m_DeviceSource = DEVICESOURCE_DVBAPI; cString dev = cString::sprintf(FRONTEND_DEVICE, cDevice::ActualDevice()->CardIndex(), 0);
if (channel) { m_Frontend = open(dev, O_RDONLY | O_NONBLOCK);
if (channel->IsSourceType('I'))
m_DeviceSource = DEVICESOURCE_IPTV;
else if (channel->IsSourceType('V'))
m_DeviceSource = DEVICESOURCE_PVRINPUT;
}
if (m_Frontend >= 0) { if (m_Frontend >= 0) {
close(m_Frontend); if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) {
m_Frontend = -1; esyslog("ERROR: cFemonOsd::ChannelSwitch() cannot read frontend info.");
} close(m_Frontend);
m_Frontend = -1;
if (m_DeviceSource == DEVICESOURCE_DVBAPI) {
cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice());
m_Frontend = dev ? open(*cString::sprintf(FRONTEND_DEVICE, dev->Adapter(), dev->Frontend()), O_RDONLY | O_NONBLOCK) : -1;
if (m_Frontend >= 0) {
if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) {
if (!femonConfig.usesvdrp)
error("cFemonOsd::ChannelSwitch() cannot read frontend info.");
close(m_Frontend);
m_Frontend = -1;
memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo));
return;
}
}
else if (femonConfig.usesvdrp) {
if (!SvdrpConnect() || !SvdrpTune())
return;
}
else {
error("cFemonOsd::ChannelSwitch() cannot open frontend device.");
return; return;
} }
} }
else if (femonConfig.usesvdrp) {
if (!SvdrpConnect() || !SvdrpTune())
return;
}
else {
esyslog("ERROR: cFemonOsd::ChannelSwitch() cannot open frontend device.");
return;
}
if (m_Receiver) { if (m_Receiver) {
m_Receiver->Deactivate(); m_Receiver->Deactivate();
DELETENULL(m_Receiver); DELETENULL(m_Receiver);
} }
if (femonConfig.analyzestream && channel) { if (femonConfig.analyzestream) {
m_Receiver = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
cDevice::ActualDevice()->AttachReceiver(m_Receiver); if (channel) {
IS_AUDIO_TRACK(track) ? apid[0] = channel->Apid(int(track - ttAudioFirst)) : apid[0] = channel->Apid(0);
IS_DOLBY_TRACK(track) ? dpid[0] = channel->Dpid(int(track - ttDolbyFirst)) : dpid[0] = channel->Dpid(0);
m_Receiver = new cFemonReceiver(channel->GetChannelID(), channel->Ca(), channel->Vpid(), apid, dpid);
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
} }
} }
void cFemonOsd::SetAudioTrack(int Index, const char * const *Tracks) void cFemonOsd::SetAudioTrack(int Index, const char * const *Tracks)
{ {
debug("%s()\n", __PRETTY_FUNCTION__); Dprintf("%s()\n", __PRETTY_FUNCTION__);
int apid[2] = {0, 0};
int dpid[2] = {0, 0};
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
if (m_Receiver) { if (m_Receiver) {
m_Receiver->Deactivate(); m_Receiver->Deactivate();
DELETENULL(m_Receiver); DELETENULL(m_Receiver);
} }
if (femonConfig.analyzestream) { if (femonConfig.analyzestream) {
const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (channel) { if (channel) {
m_Receiver = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0); IS_AUDIO_TRACK(track) ? apid[0] = channel->Apid(int(track - ttAudioFirst)) : apid[0] = channel->Apid(0);
IS_DOLBY_TRACK(track) ? dpid[0] = channel->Dpid(int(track - ttDolbyFirst)) : dpid[0] = channel->Dpid(0);
m_Receiver = new cFemonReceiver(channel->GetChannelID(), channel->Ca(), channel->Vpid(), apid, dpid);
cDevice::ActualDevice()->AttachReceiver(m_Receiver); cDevice::ActualDevice()->AttachReceiver(m_Receiver);
} }
} }
@@ -827,14 +627,14 @@ void cFemonOsd::SetAudioTrack(int Index, const char * const *Tracks)
bool cFemonOsd::DeviceSwitch(int direction) bool cFemonOsd::DeviceSwitch(int direction)
{ {
debug("%s()\n", __PRETTY_FUNCTION__); Dprintf("%s()\n", __PRETTY_FUNCTION__);
int device = cDevice::ActualDevice()->DeviceNumber(); int device = cDevice::ActualDevice()->DeviceNumber();
direction = sgn(direction); direction = sgn(direction);
if (device >= 0) { if (device >= 0) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); 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) {
if (++device >= cDevice::NumDevices()) if (++device >= cDevice::NumDevices())
device = 0; device = 0;
} }
@@ -843,14 +643,14 @@ bool cFemonOsd::DeviceSwitch(int direction)
device = cDevice::NumDevices() - 1; device = cDevice::NumDevices() - 1;
} }
if (cDevice::GetDevice(device)->ProvidesChannel(channel, 0)) { if (cDevice::GetDevice(device)->ProvidesChannel(channel, 0)) {
debug("%s(%d) device(%d)\n", __PRETTY_FUNCTION__, direction, device); Dprintf("%s(%d) device(%d)\n", __PRETTY_FUNCTION__, direction, device);
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), 0, true); cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), 0);
cControl::Shutdown(); cControl::Shutdown();
cDevice::GetDevice(device)->SwitchChannel(channel, true); cDevice::GetDevice(device)->SwitchChannel(channel, true);
if (cDevice::GetDevice(device) == cDevice::PrimaryDevice()) if (cDevice::GetDevice(device) == cDevice::PrimaryDevice())
cDevice::GetDevice(device)->ForceTransferMode(); cDevice::GetDevice(device)->ForceTransferMode();
cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel)); cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel->GetChannelID(), channel->Vpid(), channel->Apids(), channel->Dpids(), channel->Spids()));
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), channel->Number(), true); cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), channel->Number());
return (true); return (true);
} }
} }
@@ -870,19 +670,19 @@ bool cFemonOsd::SvdrpConnect(void)
m_SvdrpPlugin->Service("SvdrpConnection-v1.0", &m_SvdrpConnection); m_SvdrpPlugin->Service("SvdrpConnection-v1.0", &m_SvdrpConnection);
if (m_SvdrpConnection.handle >= 0) { if (m_SvdrpConnection.handle >= 0) {
SvdrpCommand_v1_0 cmd; SvdrpCommand_v1_0 cmd;
cmd.handle = m_SvdrpConnection.handle; cmd.handle = m_SvdrpConnection.handle;
cmd.command = cString::sprintf("PLUG %s\r\n", PLUGIN_NAME_I18N); cmd.command = cString::sprintf("PLUG %s\r\n", PLUGIN_NAME_I18N);
m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd); m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd);
if (cmd.responseCode != 214) { if (cmd.responseCode != 214) {
m_SvdrpPlugin->Service("SvdrpConnection-v1.0", &m_SvdrpConnection); // close connection m_SvdrpPlugin->Service("SvdrpConnection-v1.0", &m_SvdrpConnection); // close connection
error("cFemonOsd::SvdrpConnect() cannot find plugin '%s' on server %s.", PLUGIN_NAME_I18N, *m_SvdrpConnection.serverIp); esyslog("ERROR: cFemonOsd::SvdrpConnect() cannot find plugin '%s' on server %s.", PLUGIN_NAME_I18N, *m_SvdrpConnection.serverIp);
} }
} }
else else
error("cFemonOsd::SvdrpConnect() cannot connect to SVDRP server."); esyslog("ERROR: cFemonOsd::SvdrpConnect() cannot connect to SVDRP server.");
} }
else else
error("cFemonOsd::SvdrpConnect() cannot find plugin '%s'.", SVDRPPLUGIN); esyslog("ERROR: cFemonOsd::SvdrpConnect() cannot find plugin '%s'.", SVDRPPLUGIN);
} }
return m_SvdrpConnection.handle >= 0; return m_SvdrpConnection.handle >= 0;
} }
@@ -893,24 +693,24 @@ bool cFemonOsd::SvdrpTune(void)
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (channel) { if (channel) {
SvdrpCommand_v1_0 cmd; SvdrpCommand_v1_0 cmd;
cmd.handle = m_SvdrpConnection.handle; cmd.handle = m_SvdrpConnection.handle;
cmd.command = cString::sprintf("CHAN %s\r\n", *channel->GetChannelID().ToString()); cmd.command = cString::sprintf("CHAN %s\r\n", *channel->GetChannelID().ToString());
m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd); m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd);
if (cmd.responseCode == 250) if (cmd.responseCode == 250)
return true; return true;
error("cFemonOsd::SvdrpTune() cannot tune server channel."); esyslog("ERROR: cFemonOsd::SvdrpTune() cannot tune server channel.");
} }
else else
error("cFemonOsd::SvdrpTune() invalid channel."); esyslog("ERROR: cFemonOsd::SvdrpTune() invalid channel.");
} }
else else
error("cFemonOsd::SvdrpTune() unexpected connection state."); esyslog("ERROR: cFemonOsd::SvdrpTune() unexpected connection state.");
return false; return false;
} }
double cFemonOsd::GetVideoBitrate(void) double cFemonOsd::GetVideoBitrate(void)
{ {
debug("%s()\n", __PRETTY_FUNCTION__); Dprintf("%s()\n", __PRETTY_FUNCTION__);
double value = 0.0; double value = 0.0;
if (m_Receiver) if (m_Receiver)
@@ -921,7 +721,7 @@ double cFemonOsd::GetVideoBitrate(void)
double cFemonOsd::GetAudioBitrate(void) double cFemonOsd::GetAudioBitrate(void)
{ {
debug("%s()\n", __PRETTY_FUNCTION__); Dprintf("%s()\n", __PRETTY_FUNCTION__);
double value = 0.0; double value = 0.0;
if (m_Receiver) if (m_Receiver)
@@ -932,7 +732,7 @@ double cFemonOsd::GetAudioBitrate(void)
double cFemonOsd::GetDolbyBitrate(void) double cFemonOsd::GetDolbyBitrate(void)
{ {
debug("%s()\n", __PRETTY_FUNCTION__); Dprintf("%s()\n", __PRETTY_FUNCTION__);
double value = 0.0; double value = 0.0;
if (m_Receiver) if (m_Receiver)
@@ -942,10 +742,10 @@ double cFemonOsd::GetDolbyBitrate(void)
} }
eOSState cFemonOsd::ProcessKey(eKeys Key) eOSState cFemonOsd::ProcessKey(eKeys Key)
{ {
eOSState state = cOsdObject::ProcessKey(Key); eOSState state = cOsdObject::ProcessKey(Key);
if (state == osUnknown) { if (state == osUnknown) {
switch (int(Key)) { switch (Key) {
case k0: case k0:
if ((m_Number == 0) && (m_OldNumber != 0)) { if ((m_Number == 0) && (m_OldNumber != 0)) {
m_Number = m_OldNumber; m_Number = m_OldNumber;

View File

@@ -24,13 +24,6 @@
class cFemonOsd : public cOsdObject, public cThread, public cStatus { class cFemonOsd : public cOsdObject, public cThread, public cStatus {
private: private:
enum eDeviceSourceType {
DEVICESOURCE_DVBAPI = 0,
DEVICESOURCE_IPTV,
DEVICESOURCE_PVRINPUT,
DEVICESOURCE_COUNT
};
static cFemonOsd *pInstance; static cFemonOsd *pInstance;
cOsd *m_Osd; cOsd *m_Osd;
@@ -41,30 +34,15 @@ private:
double m_SvdrpAudioBitrate; double m_SvdrpAudioBitrate;
SvdrpConnection_v1_0 m_SvdrpConnection; SvdrpConnection_v1_0 m_SvdrpConnection;
cPlugin *m_SvdrpPlugin; cPlugin *m_SvdrpPlugin;
dvb_frontend_info m_FrontendInfo;
int m_Number; int m_Number;
int m_OldNumber; int m_OldNumber;
int m_Quality;
bool m_QualityValid;
int m_Strength;
bool m_StrengthValid;
uint16_t m_SNR; uint16_t m_SNR;
bool m_SNRValid;
uint16_t m_Signal; uint16_t m_Signal;
bool m_SignalValid;
uint32_t m_BER; uint32_t m_BER;
bool m_BERValid;
uint32_t m_UNC; uint32_t m_UNC;
bool m_UNCValid;
cString m_FrontendName;
fe_status_t m_FrontendStatus; fe_status_t m_FrontendStatus;
bool m_FrontendStatusValid;
dvb_frontend_info m_FrontendInfo;
eDeviceSourceType m_DeviceSource;
int m_DisplayMode; int m_DisplayMode;
int m_OsdWidth;
int m_OsdHeight;
int m_OsdLeft;
int m_OsdTop;
cFont *m_Font; cFont *m_Font;
cTimeMs m_InputTime; cTimeMs m_InputTime;
cCondWait m_Sleep; cCondWait m_Sleep;
@@ -80,7 +58,7 @@ protected:
cFemonOsd(const cFemonOsd&); cFemonOsd(const cFemonOsd&);
cFemonOsd& operator= (const cFemonOsd&); cFemonOsd& operator= (const cFemonOsd&);
virtual void Action(void); virtual void Action(void);
virtual void ChannelSwitch(const cDevice *device, int channelNumber, bool liveView); virtual void ChannelSwitch(const cDevice * device, int channelNumber);
virtual void SetAudioTrack(int Index, const char * const *Tracks); virtual void SetAudioTrack(int Index, const char * const *Tracks);
public: public:

View File

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

View File

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

View File

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

View File

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

View File

@@ -5,11 +5,6 @@
* *
*/ */
#ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS
#endif
#include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
@@ -25,101 +20,71 @@ static cString getCA(int value)
switch (value) { switch (value) {
case 0x0000: return cString::sprintf("%s (%X)", trVDR("Free To Air"), value); // Reserved case 0x0000: return cString::sprintf("%s (%X)", trVDR("Free To Air"), value); // Reserved
case 0x0001 ... 0x009F: case 0x0001 ... 0x009F:
case 0x00A2 ... 0x00FF: return cString::sprintf("%s (%X)", tr("Fixed"), value); // Standardized systems case 0x00A2 ... 0x00FF: return cString::sprintf("%s (%X)", tr("Fixed"), value); // Standardized systems
case 0x00A0 ... 0x00A1: return cString::sprintf("%s (%X)", tr("Analog"), value); // Analog signals case 0x00A0 ... 0x00A1: return cString::sprintf("%s (%X)", tr("Analog"), value); // Analog signals
case 0x0100 ... 0x01FF: return cString::sprintf("SECA Mediaguard (%X)", value); // Canal Plus case 0x0100 ... 0x01FF: return cString::sprintf("%s (%X)", "SECA Mediaguard", value); // Canal Plus
case 0x0464: return cString::sprintf("EuroDec (%X)", value); // EuroDec case 0x0464: return cString::sprintf("%s (%X)", "EuroDec", value); // EuroDec
case 0x0500 ... 0x05FF: return cString::sprintf("Viaccess (%X)", value); // France Telecom case 0x0500 ... 0x05FF: return cString::sprintf("%s (%X)", "Viaccess", value); // France Telecom
case 0x0600 ... 0x06FF: return cString::sprintf("Irdeto (%X)", value); // Irdeto case 0x0600 ... 0x06FF: return cString::sprintf("%s (%X)", "Irdeto", value); // Irdeto
case 0x0900 ... 0x09FF: return cString::sprintf("NDS Videoguard (%X)", value); // News Datacom case 0x0900 ... 0x09FF: return cString::sprintf("%s (%X)", "NDS Videoguard", value); // News Datacom
case 0x0B00 ... 0x0BFF: return cString::sprintf("Conax (%X)", value); // Norwegian Telekom case 0x0B00 ... 0x0BFF: return cString::sprintf("%s (%X)", "Conax", value); // Norwegian Telekom
case 0x0D00 ... 0x0DFF: return cString::sprintf("CryptoWorks (%X)", value); // Philips case 0x0D00 ... 0x0DFF: return cString::sprintf("%s (%X)", "CryptoWorks", value); // Philips
case 0x0E00 ... 0x0EFF: return cString::sprintf("PowerVu (%X)", value); // Scientific Atlanta case 0x0E00 ... 0x0EFF: return cString::sprintf("%s (%X)", "PowerVu", value); // Scientific Atlanta
case 0x1000: return cString::sprintf("RAS (%X)", value); // Tandberg Television case 0x1000: return cString::sprintf("%s (%X)", "RAS", value); // Tandberg Television
case 0x1200 ... 0x12FF: return cString::sprintf("NagraVision (%X)", value); // BellVu Express case 0x1200 ... 0x12FF: return cString::sprintf("%s (%X)", "NagraVision", value); // BellVu Express
case 0x1700 ... 0x17FF: return cString::sprintf("BetaCrypt (%X)", value); // BetaTechnik case 0x1700 ... 0x17FF: return cString::sprintf("%s (%X)", "BetaCrypt", value); // BetaTechnik
case 0x1800 ... 0x18FF: return cString::sprintf("NagraVision (%X)", value); // Kudelski SA case 0x1800 ... 0x18FF: return cString::sprintf("%s (%X)", "NagraVision", value); // Kudelski SA
case 0x22F0: return cString::sprintf("Codicrypt (%X)", value); // Scopus Network Technologies case 0x22F0: return cString::sprintf("%s (%X)", "Codicrypt", value); // Scopus Network Technologies
case 0x2600: return cString::sprintf("BISS (%X)", value); // European Broadcasting Union case 0x2600: return cString::sprintf("%s (%X)", "BISS", value); // European Broadcasting Union
case 0x4347: return cString::sprintf("CryptOn (%X)", value); // CryptOn case 0x4347: return cString::sprintf("%s (%X)", "CryptOn", value); // CryptOn
case 0x4800: return cString::sprintf("Accessgate (%X)", value); // Telemann case 0x4800: return cString::sprintf("%s (%X)", "Accessgate", value); // Telemann
case 0x4900: return cString::sprintf("China Crypt (%X)", value); // CryptoWorks case 0x4900: return cString::sprintf("%s (%X)", "China Crypt", value); // CryptoWorks
case 0x4A10: return cString::sprintf("EasyCas (%X)", value); // EasyCas case 0x4A10: return cString::sprintf("%s (%X)", "EasyCas", value); // EasyCas
case 0x4A20: return cString::sprintf("AlphaCrypt (%X)", value); // AlphaCrypt case 0x4A20: return cString::sprintf("%s (%X)", "AlphaCrypt", value); // AlphaCrypt
case 0x4A70: return cString::sprintf("DreamCrypt (%X)", value); // Dream Multimedia case 0x4A70: return cString::sprintf("%s (%X)", "DreamCrypt", value); // Dream Multimedia
case 0x4A60: return cString::sprintf("SkyCrypt (%X)", value); // @Sky case 0x4A60: return cString::sprintf("%s (%X)", "SkyCrypt", value); // @Sky
case 0x4A61: return cString::sprintf("Neotioncrypt (%X)", value); // Neotion case 0x4A61: return cString::sprintf("%s (%X)", "Neotioncrypt", value); // Neotion
case 0x4A62: return cString::sprintf("SkyCrypt (%X)", value); // @Sky case 0x4A62: return cString::sprintf("%s (%X)", "SkyCrypt", value); // @Sky
case 0x4A63: return cString::sprintf("Neotion SHL (%X)", value); // Neotion case 0x4A63: return cString::sprintf("%s (%X)", "Neotion SHL", value); // Neotion
case 0x4A64 ... 0x4A6F: return cString::sprintf("SkyCrypt (%X)", value); // @Sky case 0x4A64 ... 0x4A6F: return cString::sprintf("%s (%X)", "SkyCrypt", value); // @Sky
case 0x4A80: return cString::sprintf("ThalesCrypt (%X)", value); // TPS case 0x4A80: return cString::sprintf("%s (%X)", "ThalesCrypt", value); // TPS
case 0x4AA1: return cString::sprintf("KeyFly (%X)", value); // SIDSA case 0x4AA1: return cString::sprintf("%s (%X)", "KeyFly", value); // SIDSA
case 0x4ABF: return cString::sprintf("DG-Crypt (%X)", value); // Beijing Compunicate Technology Inc. case 0x4ABF: return cString::sprintf("%s (%X)", "DG-Crypt", value); // Beijing Compunicate Technology Inc.
case 0x4AD0 ... 0x4AD1: return cString::sprintf("X-Crypt (%X)", value); // XCrypt Inc. case 0x4AD0 ... 0x4AD1: return cString::sprintf("%s (%X)", "X-Crypt", value); // XCrypt Inc.
case 0x4AD4: return cString::sprintf("OmniCrypt (%X)", value); // Widevine Technologies, Inc. case 0x4AD4: return cString::sprintf("%s (%X)", "OmniCrypt", value); // Widevine Technologies, Inc.
case 0x4AE0: return cString::sprintf("RossCrypt (%X)", value); // Digi Raum Electronics Co. Ltd. case 0x4AE0: return cString::sprintf("%s (%X)", "RossCrypt", value); // Digi Raum Electronics Co. Ltd.
case 0x5500: return cString::sprintf("Z-Crypt (%X)", value); // Digi Raum Electronics Co. Ltd. case 0x5500: return cString::sprintf("%s (%X)", "Z-Crypt", value); // Digi Raum Electronics Co. Ltd.
case 0x5501: return cString::sprintf("Griffin (%X)", value); // Griffin case 0x5501: return cString::sprintf("%s (%X)", "Griffin", value); // Griffin
default: break; default: break;
} }
return cString::sprintf("%X", value); return cString::sprintf("%X", value);
} }
static const char *getUserString(int Value, const tDvbParameterMap *Map) cString getFrontendInfo(int cardIndex)
{
const tDvbParameterMap *map = Map;
while (map && map->userValue != -1) {
if (map->driverValue == Value)
return map->userString ? trVDR(map->userString) : "---";
map++;
}
return "---";
}
cDvbDevice *getDvbDevice(cDevice* device)
{
cDvbDevice *dev = dynamic_cast<cDvbDevice*>(device);
#ifdef __DYNAMIC_DEVICE_PROBE
if (!dev && device && device->HasSubDevice())
dev = dynamic_cast<cDvbDevice*>(device->SubDevice());
#endif
return dev;
}
cString getFrontendInfo(cDvbDevice *device)
{ {
cString info;
struct dvb_frontend_info value; struct dvb_frontend_info value;
fe_status_t status; fe_status_t status;
cString info = "";
uint16_t signal = 0; uint16_t signal = 0;
uint16_t snr = 0; uint16_t snr = 0;
uint32_t ber = 0; uint32_t ber = 0;
uint32_t unc = 0; uint32_t unc = 0;
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
if (!device) int fe = open(dev, O_RDONLY | O_NONBLOCK);
return info;
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0) if (fe < 0)
return info; return NULL;
CHECK(ioctl(fe, FE_GET_INFO, &value));
info = cString::sprintf("CARD:%d\nSTRG:%d\nQUAL:%d", device->CardIndex(), device->SignalStrength(), device->SignalQuality()); CHECK(ioctl(fe, FE_READ_STATUS, &status));
CHECK(ioctl(fe, FE_READ_SIGNAL_STRENGTH, &signal));
if (ioctl(fe, FE_GET_INFO, &value) >= 0) CHECK(ioctl(fe, FE_READ_SNR, &snr));
info = cString::sprintf("%s\nTYPE:%d\nNAME:%s", *info, value.type, *device->DeviceName()); CHECK(ioctl(fe, FE_READ_BER, &ber));
if (ioctl(fe, FE_READ_STATUS, &status) >= 0) CHECK(ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &unc));
info = cString::sprintf("%s\nSTAT:%02X", *info, status);
if (ioctl(fe, FE_READ_SIGNAL_STRENGTH, &signal) >= 0)
info = cString::sprintf("%s\nSGNL:%04X", *info, signal);
if (ioctl(fe, FE_READ_SNR, &snr) >= 0)
info = cString::sprintf("%s\nSNRA:%04X", *info, snr);
if (ioctl(fe, FE_READ_BER, &ber) >= 0)
info = cString::sprintf("%s\nBERA:%08X", *info, ber);
if (ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &unc) >= 0)
info = cString::sprintf("%s\nUNCB:%08X", *info, unc);
close(fe); close(fe);
info = cString::sprintf("CARD:%d\nTYPE:%d\nNAME:%s\nSTAT:%02X\nSGNL:%04X\nSNRA:%04X\nBERA:%08X\nUNCB:%08X", cardIndex, value.type, value.name, status, signal, snr, ber, unc);
if (cFemonOsd::Instance()) if (cFemonOsd::Instance())
info = cString::sprintf("%s\nVIBR:%.0f\nAUBR:%.0f\nDDBR:%.0f", *info, cFemonOsd::Instance()->GetVideoBitrate(), cFemonOsd::Instance()->GetAudioBitrate(), cFemonOsd::Instance()->GetDolbyBitrate()); info = cString::sprintf("%s\nVIBR:%.0f\nAUBR:%.0f\nDDBR:%.0f", *info, cFemonOsd::Instance()->GetVideoBitrate(), cFemonOsd::Instance()->GetAudioBitrate(), cFemonOsd::Instance()->GetDolbyBitrate());
@@ -129,90 +94,85 @@ cString getFrontendInfo(cDvbDevice *device)
return info; return info;
} }
cString getFrontendName(cDvbDevice *device) cString getFrontendName(int cardIndex)
{ {
if (!device) struct dvb_frontend_info value;
return NULL; cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
return (cString::sprintf("%s on device #%d", *device->DeviceName(), device->CardIndex())); int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (fe < 0)
return NULL;
CHECK(ioctl(fe, FE_GET_INFO, &value));
close(fe);
return (cString::sprintf("%s on device #%d", value.name, cardIndex));
} }
cString getFrontendStatus(cDvbDevice *device) cString getFrontendStatus(int cardIndex)
{ {
fe_status_t value; fe_status_t value;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
if (!device) int fe = open(dev, O_RDONLY | O_NONBLOCK);
return NULL;
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0) if (fe < 0)
return NULL; return NULL;
memset(&value, 0, sizeof(value)); CHECK(ioctl(fe, FE_READ_STATUS, &value));
ioctl(fe, FE_READ_STATUS, &value);
close(fe); close(fe);
return (cString::sprintf("Status %s:%s:%s:%s:%s on device #%d", (value & FE_HAS_LOCK) ? "LOCKED" : "-", (value & FE_HAS_SIGNAL) ? "SIGNAL" : "-", (value & FE_HAS_CARRIER) ? "CARRIER" : "-", (value & FE_HAS_VITERBI) ? "VITERBI" : "-", (value & FE_HAS_SYNC) ? "SYNC" : "-", device->CardIndex())); return (cString::sprintf("Status %s:%s:%s:%s:%s on device #%d", (value & FE_HAS_LOCK) ? "LOCKED" : "-", (value & FE_HAS_SIGNAL) ? "SIGNAL" : "-", (value & FE_HAS_CARRIER) ? "CARRIER" : "-", (value & FE_HAS_VITERBI) ? "VITERBI" : "-", (value & FE_HAS_SYNC) ? "SYNC" : "-", cardIndex));
} }
uint16_t getSignal(cDvbDevice *device) uint16_t getSignal(int cardIndex)
{ {
uint16_t value = 0; uint16_t value = 0;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
if (!device) int fe = open(dev, O_RDONLY | O_NONBLOCK);
return (value);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0) if (fe < 0)
return (value); return (value);
ioctl(fe, FE_READ_SIGNAL_STRENGTH, &value); CHECK(ioctl(fe, FE_READ_SIGNAL_STRENGTH, &value));
close(fe); close(fe);
return (value); return (value);
} }
uint16_t getSNR(cDvbDevice *device) uint16_t getSNR(int cardIndex)
{ {
uint16_t value = 0; uint16_t value = 0;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
if (!device) int fe = open(dev, O_RDONLY | O_NONBLOCK);
return (value);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0) if (fe < 0)
return (value); return (value);
ioctl(fe, FE_READ_SNR, &value); CHECK(ioctl(fe, FE_READ_SNR, &value));
close(fe); close(fe);
return (value); return (value);
} }
uint32_t getBER(cDvbDevice *device) uint32_t getBER(int cardIndex)
{ {
uint32_t value = 0; uint32_t value = 0;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
if (!device) int fe = open(dev, O_RDONLY | O_NONBLOCK);
return (value);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0) if (fe < 0)
return (value); return (value);
ioctl(fe, FE_READ_BER, &value); CHECK(ioctl(fe, FE_READ_BER, &value));
close(fe); close(fe);
return (value); return (value);
} }
uint32_t getUNC(cDvbDevice *device) uint32_t getUNC(int cardIndex)
{ {
uint32_t value = 0; uint32_t value = 0;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
if (!device) int fe = open(dev, O_RDONLY | O_NONBLOCK);
return (value);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0) if (fe < 0)
return (value); return (value);
ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &value); CHECK(ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &value));
close(fe); close(fe);
return (value); return (value);
@@ -309,7 +269,6 @@ cString getAudioCodec(int value)
case AUDIO_CODEC_MPEG2_II: return cString::sprintf("%s", tr("MPEG-2 Layer II")); case AUDIO_CODEC_MPEG2_II: return cString::sprintf("%s", tr("MPEG-2 Layer II"));
case AUDIO_CODEC_MPEG2_III: return cString::sprintf("%s", tr("MPEG-2 Layer III")); case AUDIO_CODEC_MPEG2_III: return cString::sprintf("%s", tr("MPEG-2 Layer III"));
case AUDIO_CODEC_HEAAC: return cString::sprintf("%s", tr("HE-AAC")); case AUDIO_CODEC_HEAAC: return cString::sprintf("%s", tr("HE-AAC"));
case AUDIO_CODEC_LATM: return cString::sprintf("%s", tr("LATM"));
default: break; default: break;
} }
return cString::sprintf("---"); return cString::sprintf("---");
@@ -329,52 +288,95 @@ cString getAudioChannelMode(int value)
cString getCoderate(int value) cString getCoderate(int value)
{ {
return cString::sprintf("%s", getUserString(value, CoderateValues)); switch (value) {
case FEC_NONE: return cString::sprintf("%s", trVDR("none"));
case FEC_1_2: return cString::sprintf("1/2");
case FEC_2_3: return cString::sprintf("2/3");
case FEC_3_4: return cString::sprintf("3/4");
case FEC_4_5: return cString::sprintf("4/5");
case FEC_5_6: return cString::sprintf("5/6");
case FEC_6_7: return cString::sprintf("6/7");
case FEC_7_8: return cString::sprintf("7/8");
case FEC_8_9: return cString::sprintf("8/9");
case FEC_AUTO: return cString::sprintf("%s", trVDR("auto"));
default: break;
}
return cString::sprintf("---");
} }
cString getTransmission(int value) cString getTransmission(int value)
{ {
return cString::sprintf("%s", getUserString(value, TransmissionValues)); switch (value) {
case TRANSMISSION_MODE_2K: return cString::sprintf("2K");
case TRANSMISSION_MODE_8K: return cString::sprintf("8K");
case TRANSMISSION_MODE_AUTO: return cString::sprintf("%s", trVDR("auto"));
default: break;
}
return cString::sprintf("---");
} }
cString getBandwidth(int value) cString getBandwidth(int value)
{ {
return cString::sprintf("%s", getUserString(value, BandwidthValues)); switch (value) {
case BANDWIDTH_8_MHZ: return cString::sprintf("8 %s", tr("MHz"));
case BANDWIDTH_7_MHZ: return cString::sprintf("7 %s", tr("MHz"));
case BANDWIDTH_6_MHZ: return cString::sprintf("6 %s", tr("MHz"));
case BANDWIDTH_AUTO: return cString::sprintf("%s", trVDR("auto"));
default: break;
}
return cString::sprintf("---");
} }
cString getInversion(int value) cString getInversion(int value)
{ {
return cString::sprintf("%s", getUserString(value, InversionValues)); switch (value) {
case INVERSION_OFF: return cString::sprintf("%s", tr("off"));
case INVERSION_ON: return cString::sprintf("%s", tr("on"));
case INVERSION_AUTO: return cString::sprintf("%s", trVDR("auto"));
default: break;
}
return cString::sprintf("---");
} }
cString getHierarchy(int value) cString getHierarchy(int value)
{ {
return cString::sprintf("%s", getUserString(value, HierarchyValues)); switch (value) {
case HIERARCHY_NONE: return cString::sprintf("%s", trVDR("none"));
case HIERARCHY_1: return cString::sprintf("1");
case HIERARCHY_2: return cString::sprintf("2");
case HIERARCHY_4: return cString::sprintf("4");
case HIERARCHY_AUTO: return cString::sprintf("%s", trVDR("auto"));
default: break;
}
return cString::sprintf("---");
} }
cString getGuard(int value) cString getGuard(int value)
{ {
return cString::sprintf("%s", getUserString(value, GuardValues)); switch (value) {
case GUARD_INTERVAL_1_32: return cString::sprintf("1/32");
case GUARD_INTERVAL_1_16: return cString::sprintf("1/16");
case GUARD_INTERVAL_1_8: return cString::sprintf("1/8");
case GUARD_INTERVAL_1_4: return cString::sprintf("1/4");
case GUARD_INTERVAL_AUTO: return cString::sprintf("%s", trVDR("auto"));
default: break;
}
return cString::sprintf("---");
} }
cString getModulation(int value) cString getModulation(int value)
{ {
return cString::sprintf("%s", getUserString(value, ModulationValues)); switch (value) {
} case QPSK: return cString::sprintf("QPSK");
case QAM_16: return cString::sprintf("QAM 16");
cString getTerrestrialSystem(int value) case QAM_32: return cString::sprintf("QAM 32");
{ case QAM_64: return cString::sprintf("QAM 64");
return cString::sprintf("%s", getUserString(value, SystemValuesTerr)); case QAM_128: return cString::sprintf("QAM 128");
} case QAM_256: return cString::sprintf("QAM 256");
case QAM_AUTO: return cString::sprintf("QAM %s", trVDR("auto"));
cString getSatelliteSystem(int value) default: break;
{ }
return cString::sprintf("%s", getUserString(value, SystemValuesSat)); return cString::sprintf("---");
}
cString getRollOff(int value)
{
return cString::sprintf("%s", getUserString(value, RollOffValues));
} }
cString getResolution(int width, int height, int scan) cString getResolution(int width, int height, int scan)
@@ -557,36 +559,7 @@ cString getBitrateMbits(double value)
cString getBitrateKbits(double value) cString getBitrateKbits(double value)
{ {
if (value > 0) if (value > 0)
return cString::sprintf("%.0f %s", value / 1000.0, tr("kbit/s")); return cString::sprintf("%.0f %s", value / 1000.0, tr("kbit/s"));
return cString::sprintf("---"); return cString::sprintf("---");
} }
// --- cFemonBitStream -------------------------------------------------------
uint32_t cFemonBitStream::GetUeGolomb()
{
int n = 0;
while (!GetBit() && (n < 32))
n++;
return (n ? ((1 << n) - 1) + GetBits(n) : 0);
}
int32_t cFemonBitStream::GetSeGolomb()
{
uint32_t r = GetUeGolomb() + 1;
return ((r & 1) ? -(r >> 1) : (r >> 1));
}
void cFemonBitStream::SkipGolomb()
{
int n = 0;
while (!GetBit() && (n < 32))
n++;
SkipBits(n);
}

View File

@@ -10,33 +10,27 @@
#include <stdint.h> #include <stdint.h>
#include <vdr/channels.h> #include <vdr/channels.h>
#include <vdr/dvbdevice.h>
#include <vdr/remux.h>
#include <vdr/tools.h> #include <vdr/tools.h>
#ifdef DEBUG #ifdef DEBUG
#define debug(x...) dsyslog("FEMON: " x); #define Dprintf(x...) printf(x);
#define error(x...) esyslog("ERROR: " x);
#else #else
#define debug(x...) ; #define Dprintf(x...) ;
#define error(x...) esyslog("ERROR: " x);
#endif #endif
#define ELEMENTS(x) (sizeof(x) / sizeof(x[0])) #define ELEMENTS(x) (sizeof(x) / sizeof(x[0]))
#define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d" #define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d"
cDvbDevice *getDvbDevice(cDevice* device); cString getFrontendInfo(int cardIndex = 0);
cString getFrontendName(int cardIndex = 0);
cString getFrontendStatus(int cardIndex = 0);
cString getFrontendInfo(cDvbDevice *device); uint16_t getSNR(int cardIndex = 0);
cString getFrontendName(cDvbDevice *device); uint16_t getSignal(int cardIndex = 0);
cString getFrontendStatus(cDvbDevice *device);
uint16_t getSNR(cDvbDevice *device); uint32_t getBER(int cardIndex = 0);
uint16_t getSignal(cDvbDevice *device); uint32_t getUNC(int cardIndex = 0);
uint32_t getBER(cDvbDevice *device);
uint32_t getUNC(cDvbDevice *device);
cString getApids(const cChannel *channel); cString getApids(const cChannel *channel);
cString getDpids(const cChannel *channel); cString getDpids(const cChannel *channel);
@@ -54,9 +48,6 @@ cString getInversion(int value);
cString getHierarchy(int value); cString getHierarchy(int value);
cString getGuard(int value); cString getGuard(int value);
cString getModulation(int value); cString getModulation(int value);
cString getTerrestrialSystem(int value);
cString getSatelliteSystem(int value);
cString getRollOff(int value);
cString getResolution(int width, int height, int scan); cString getResolution(int width, int height, int scan);
cString getAspectRatio(int value); cString getAspectRatio(int value);
cString getVideoFormat(int value); cString getVideoFormat(int value);
@@ -75,14 +66,4 @@ cString getVideoBitrate(double value, double stream);
cString getBitrateMbits(double value); cString getBitrateMbits(double value);
cString getBitrateKbits(double value); cString getBitrateKbits(double value);
class cFemonBitStream : public cBitStream {
public:
cFemonBitStream(const uint8_t *Data, const int Length) : cBitStream(Data, Length) {}
uint32_t GetUeGolomb();
int32_t GetSeGolomb();
void SkipGolomb();
void SkipUeGolomb() { SkipGolomb(); }
void SkipSeGolomb() { SkipGolomb(); }
};
#endif // __FEMONTOOLS_H #endif // __FEMONTOOLS_H

View File

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

View File

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

View File

@@ -7,13 +7,12 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-femon 1.7.18\n" "Project-Id-Version: femon 1.6.5\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n" "POT-Creation-Date: 2008-12-16 12:08+0200\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n" "PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Christian Wieninger\n" "Last-Translator: Christian Wieninger\n"
"Language-Team: German <vdr@linuxtv.org>\n" "Language-Team: <vdr@linuxtv.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-15\n" "Content-Type: text/plain; charset=ISO-8859-15\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
@@ -66,9 +65,6 @@ msgstr "Duotone"
msgid "SilverGreen" msgid "SilverGreen"
msgstr "SilverGreen" msgstr "SilverGreen"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry" msgid "Hide main menu entry"
msgstr "Hauptmen<65>eintrag verstecken" msgstr "Hauptmen<65>eintrag verstecken"
@@ -93,10 +89,13 @@ msgstr "Position"
msgid "Define the position of OSD." msgid "Define the position of OSD."
msgstr "" msgstr ""
msgid "Downscale OSD size [%]" msgid "Define the height of OSD."
msgstr "" msgstr ""
msgid "Define the downscale ratio for OSD size." msgid "Horizontal offset"
msgstr "Horizontaler Offset"
msgid "Define the horizontal offset of OSD."
msgstr "" msgstr ""
msgid "Red limit [%]" msgid "Red limit [%]"
@@ -180,12 +179,6 @@ msgstr "Rid"
msgid "Coderate" msgid "Coderate"
msgstr "Coderate" msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Bitrate"
msgid "Stream Information" msgid "Stream Information"
msgstr "Streaminformation" msgstr "Streaminformation"
@@ -195,6 +188,9 @@ msgstr "Video Stream"
msgid "Codec" msgid "Codec"
msgstr "" msgstr ""
msgid "Bitrate"
msgstr "Bitrate"
msgid "Aspect Ratio" msgid "Aspect Ratio"
msgstr "Seitenverh<72>ltnis" msgstr "Seitenverh<72>ltnis"
@@ -237,6 +233,12 @@ msgstr "Dolby Surround Modus"
msgid "Low Frequency Effects" msgid "Low Frequency Effects"
msgstr "Tieft<66>ner Effekte" msgstr "Tieft<66>ner Effekte"
msgid "on"
msgstr "Ein"
msgid "off"
msgstr "Aus"
msgid "Dialogue Normalization" msgid "Dialogue Normalization"
msgstr "Dialog Normalisierung" msgstr "Dialog Normalisierung"
@@ -273,9 +275,6 @@ msgstr ""
msgid "HE-AAC" msgid "HE-AAC"
msgstr "" msgstr ""
msgid "LATM"
msgstr ""
msgid "stereo" msgid "stereo"
msgstr "" msgstr ""
@@ -288,6 +287,9 @@ msgstr ""
msgid "mono" msgid "mono"
msgstr "" msgstr ""
msgid "MHz"
msgstr "MHz"
msgid "interlaced" msgid "interlaced"
msgstr "" msgstr ""
@@ -378,9 +380,6 @@ msgstr "dB"
msgid "not indicated" msgid "not indicated"
msgstr "nicht angegeben" msgstr "nicht angegeben"
msgid "MHz"
msgstr "MHz"
msgid "free" msgid "free"
msgstr "frei" msgstr "frei"

View File

@@ -5,13 +5,12 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-femon 1.7.18\n" "Project-Id-Version: femon 1.6.5\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n" "POT-Creation-Date: 2008-12-16 12:08+0200\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n" "PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Luis Palacios\n" "Last-Translator: Luis Palacios\n"
"Language-Team: Spanish <vdr@linuxtv.org>\n" "Language-Team: <vdr@linuxtv.org>\n"
"Language: es\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-15\n" "Content-Type: text/plain; charset=ISO-8859-15\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
@@ -64,9 +63,6 @@ msgstr "Duotone"
msgid "SilverGreen" msgid "SilverGreen"
msgstr "SilverGreen" msgstr "SilverGreen"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry" msgid "Hide main menu entry"
msgstr "Ocultar en el men<65> principal" msgstr "Ocultar en el men<65> principal"
@@ -91,10 +87,13 @@ msgstr "Posici
msgid "Define the position of OSD." msgid "Define the position of OSD."
msgstr "" msgstr ""
msgid "Downscale OSD size [%]" msgid "Define the height of OSD."
msgstr "" msgstr ""
msgid "Define the downscale ratio for OSD size." msgid "Horizontal offset"
msgstr "Desplazamiento horizontal"
msgid "Define the horizontal offset of OSD."
msgstr "" msgstr ""
msgid "Red limit [%]" msgid "Red limit [%]"
@@ -178,12 +177,6 @@ msgstr "Rid"
msgid "Coderate" msgid "Coderate"
msgstr "Coderate" msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Tasa de bits"
msgid "Stream Information" msgid "Stream Information"
msgstr "Informaci<63>n del flujo" msgstr "Informaci<63>n del flujo"
@@ -193,6 +186,9 @@ msgstr "Flujo de video"
msgid "Codec" msgid "Codec"
msgstr "" msgstr ""
msgid "Bitrate"
msgstr "Tasa de bits"
msgid "Aspect Ratio" msgid "Aspect Ratio"
msgstr "Proporciones de la imagen" msgstr "Proporciones de la imagen"
@@ -235,6 +231,12 @@ msgstr "Nivel sonoro Dolby Surround"
msgid "Low Frequency Effects" msgid "Low Frequency Effects"
msgstr "Efectos de baja frecuencia" msgstr "Efectos de baja frecuencia"
msgid "on"
msgstr "on"
msgid "off"
msgstr "off"
msgid "Dialogue Normalization" msgid "Dialogue Normalization"
msgstr "Normalizaci<63>n del di<64>logo" msgstr "Normalizaci<63>n del di<64>logo"
@@ -271,9 +273,6 @@ msgstr ""
msgid "HE-AAC" msgid "HE-AAC"
msgstr "" msgstr ""
msgid "LATM"
msgstr ""
msgid "stereo" msgid "stereo"
msgstr "" msgstr ""
@@ -286,6 +285,9 @@ msgstr ""
msgid "mono" msgid "mono"
msgstr "o" msgstr "o"
msgid "MHz"
msgstr "MHz"
msgid "interlaced" msgid "interlaced"
msgstr "" msgstr ""
@@ -376,9 +378,6 @@ msgstr "dB"
msgid "not indicated" msgid "not indicated"
msgstr "no indicado" msgstr "no indicado"
msgid "MHz"
msgstr "MHz"
msgid "free" msgid "free"
msgstr "libre" msgstr "libre"

View File

@@ -5,13 +5,12 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-femon 1.7.18\n" "Project-Id-Version: femon 1.6.5\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n" "POT-Creation-Date: 2008-12-16 12:08+0200\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n" "PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Arthur Konovalov\n" "Last-Translator: Arthur Konovalov\n"
"Language-Team: Estonian <vdr@linuxtv.org>\n" "Language-Team: <vdr@linuxtv.org>\n"
"Language: et\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-13\n" "Content-Type: text/plain; charset=ISO-8859-13\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
@@ -23,7 +22,7 @@ msgid "Signal Information"
msgstr "Signaaliinfo" msgstr "Signaaliinfo"
msgid "Femon not available" msgid "Femon not available"
msgstr "Femon ei ole k<>ttesaadav" msgstr ""
msgid "basic" msgid "basic"
msgstr "standard" msgstr "standard"
@@ -38,7 +37,7 @@ msgid "AC-3"
msgstr "AC-3" msgstr "AC-3"
msgid "Classic" msgid "Classic"
msgstr "Classic" msgstr "Klassikaline"
msgid "Elchi" msgid "Elchi"
msgstr "Elchi" msgstr "Elchi"
@@ -64,89 +63,89 @@ msgstr "Duotone"
msgid "SilverGreen" msgid "SilverGreen"
msgstr "SilverGreen" msgstr "SilverGreen"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry" msgid "Hide main menu entry"
msgstr "Peita valik peamen<65><6E>s" msgstr "Peida valik peamen<65><6E>s"
msgid "Define whether the main menu entry is hidden." msgid "Define whether the main menu entry is hidden."
msgstr "Valiku peamen<65><6E>s peitmise m<><6D>ritlemine." msgstr ""
msgid "Default display mode" msgid "Default display mode"
msgstr "Vaikemoodus" msgstr "Vaikimisi displei moodus"
msgid "Define the default display mode at startup." msgid "Define the default display mode at startup."
msgstr "K<EFBFBD>ivitamisel vaikemooduse m<><6D>ritlemine." msgstr ""
msgid "Define the used OSD skin." msgid "Define the used OSD skin."
msgstr "Kasutatava ekraanikesta m<><6D>ritlemine." msgstr ""
msgid "Define the used OSD theme." msgid "Define the used OSD theme."
msgstr "Kasutatava teema m<><6D>ritlemine." msgstr ""
msgid "Position" msgid "Position"
msgstr "Positsioon" msgstr "Positsioon"
msgid "Define the position of OSD." msgid "Define the position of OSD."
msgstr "Ekraaniinfo positsiooni m<><6D>ritlemine." msgstr ""
msgid "Downscale OSD size [%]" msgid "Define the height of OSD."
msgstr "Ekraanimen<EFBFBD><EFBFBD> v<>hendamine [%]" msgstr ""
msgid "Define the downscale ratio for OSD size." msgid "Horizontal offset"
msgstr "Ekraanimen<EFBFBD><EFBFBD> suuruse v<>hendamise m<><6D>ritlemine" msgstr "Horisontaalne nihe"
msgid "Define the horizontal offset of OSD."
msgstr ""
msgid "Red limit [%]" msgid "Red limit [%]"
msgstr "Punase limiit [%]" msgstr "Punase limiit [%]"
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 "Seaded punasele limiidile. Iseloomustab kehva signaali." msgstr ""
msgid "Green limit [%]" msgid "Green limit [%]"
msgstr "Rohelise limiit [%]" msgstr "Rohelise limiit [%]"
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 "Seaded rohelisele limiidile. Iseloomustab head signaali." msgstr ""
msgid "OSD update interval [0.1s]" msgid "OSD update interval [0.1s]"
msgstr "Uuendusintervall [0,1s]" msgstr "Uuendusintervall [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 "Ekraaniinfo uuendamise intervalli m<><6D>ritlemine. V<>iksem intervall- suurem CPU koormus." msgstr ""
msgid "Analyze stream" msgid "Analyze stream"
msgstr "Voo anal<61><6C>s" msgstr "Voo anal<61><6C>s"
msgid "Define whether the DVB stream is analyzed and bitrates calculated." msgid "Define whether the DVB stream is analyzed and bitrates calculated."
msgstr "DVB voo bitikiiruse rehkendamise m<><6D>ritlemine." msgstr ""
msgid "Calculation interval [0.1s]" msgid "Calculation interval [0.1s]"
msgstr "Arvutamise intervall [0,1s]" msgstr "Kalkulatsiooni intervall [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 "Arvutamise intervalli m<><6D>ritlemine. Suurem intervall annab stabiilsemaid tulemusi." msgstr ""
msgid "Use SVDRP service" msgid "Use SVDRP service"
msgstr "SVDRP teenus" msgstr ""
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 "SVDRP teenuse klient/server seadete m<><6D>ritlemine." msgstr ""
msgid "SVDRP service port" msgid "SVDRP service port"
msgstr "SVDRP port" msgstr ""
msgid "Define the port number of SVDRP service." msgid "Define the port number of SVDRP service."
msgstr "SVDRP teenuse pordi m<><6D>ritlemine." msgstr ""
msgid "SVDRP service IP" msgid "SVDRP service IP"
msgstr "SVDRP IP" msgstr ""
msgid "Define the IP address of SVDRP service." msgid "Define the IP address of SVDRP service."
msgstr "SVDRP teenuse IP aadressi m<><6D>ritlemine." msgstr ""
msgid "Help" msgid "Help"
msgstr "Abi" msgstr ""
msgid "Video" msgid "Video"
msgstr "Video" msgstr "Video"
@@ -178,20 +177,17 @@ msgstr "Rid"
msgid "Coderate" msgid "Coderate"
msgstr "Coderate" msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Bitikiirus"
msgid "Stream Information" msgid "Stream Information"
msgstr "Vooinfo" msgstr "Voo info"
msgid "Video Stream" msgid "Video Stream"
msgstr "Videovoog" msgstr "Videovoog"
msgid "Codec" msgid "Codec"
msgstr "Koodek" msgstr ""
msgid "Bitrate"
msgstr "Bitikiirus"
msgid "Aspect Ratio" msgid "Aspect Ratio"
msgstr "K<>lgsuhe" msgstr "K<>lgsuhe"
@@ -209,7 +205,7 @@ msgid "Audio Stream"
msgstr "Audiovoog" msgstr "Audiovoog"
msgid "Channel Mode" msgid "Channel Mode"
msgstr "Kanalimoodus" msgstr ""
msgid "Sampling Frequency" msgid "Sampling Frequency"
msgstr "S<>mplimissagedus" msgstr "S<>mplimissagedus"
@@ -235,6 +231,12 @@ msgstr "Dolby Surround'i t
msgid "Low Frequency Effects" msgid "Low Frequency Effects"
msgstr "LFE kanal" msgstr "LFE kanal"
msgid "on"
msgstr "Sees"
msgid "off"
msgstr "V<>ljas"
msgid "Dialogue Normalization" msgid "Dialogue Normalization"
msgstr "Dialoogi normalisatsioon" msgstr "Dialoogi normalisatsioon"
@@ -242,67 +244,67 @@ msgid "Fixed"
msgstr "Fikseeritud" msgstr "Fikseeritud"
msgid "Analog" msgid "Analog"
msgstr "Analoog" msgstr ""
msgid "MPEG-2" msgid "MPEG-2"
msgstr "MPEG-2" msgstr ""
msgid "H.264" msgid "H.264"
msgstr "H.264" msgstr ""
msgid "MPEG-1 Layer I" msgid "MPEG-1 Layer I"
msgstr "MPEG-1 Layet 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"
msgstr "LATM"
msgid "stereo" msgid "stereo"
msgstr "stereo" msgstr ""
msgid "joint Stereo" msgid "joint Stereo"
msgstr "joint stereo" msgstr ""
msgid "dual" msgid "dual"
msgstr "duaalne" msgstr ""
msgid "mono" msgid "mono"
msgstr "mono" msgstr ""
msgid "MHz"
msgstr "MHz"
msgid "interlaced" msgid "interlaced"
msgstr "<EFBFBD>lerealaotus" msgstr ""
msgid "progressive" msgid "progressive"
msgstr "progressiivne" msgstr ""
msgid "reserved" msgid "reserved"
msgstr "reserv." msgstr "reserveeritud"
msgid "extended" msgid "extended"
msgstr "laiendatud" msgstr ""
msgid "unknown" msgid "unknown"
msgstr "tundmatu" msgstr "tundmatu"
msgid "component" msgid "component"
msgstr "komponentne" msgstr ""
msgid "PAL" msgid "PAL"
msgstr "PAL" msgstr "PAL"
@@ -311,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"
@@ -347,10 +349,10 @@ msgid "Karaoke"
msgstr "Karaoke" msgstr "Karaoke"
msgid "Ch1" msgid "Ch1"
msgstr "Kan.1" msgstr "Kan. 1"
msgid "Ch2" msgid "Ch2"
msgstr "Kan.2" msgstr "Kan. 2"
msgid "C" msgid "C"
msgstr "C" msgstr "C"
@@ -376,9 +378,6 @@ msgstr "dB"
msgid "not indicated" msgid "not indicated"
msgstr "m<>rkimata" msgstr "m<>rkimata"
msgid "MHz"
msgstr "MHz"
msgid "free" msgid "free"
msgstr "vaba" msgstr "vaba"

View File

@@ -5,13 +5,12 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-femon 1.7.18\n" "Project-Id-Version: femon 1.6.5\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n" "POT-Creation-Date: 2008-12-16 12:08+0200\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n" "PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Rolf Ahrenberg\n" "Last-Translator: Rolf Ahrenberg\n"
"Language-Team: Finnish <vdr@linuxtv.org>\n" "Language-Team: <vdr@linuxtv.org>\n"
"Language: fi\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
@@ -64,9 +63,6 @@ msgstr "Duotone"
msgid "SilverGreen" msgid "SilverGreen"
msgstr "SilverGreen" msgstr "SilverGreen"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry" msgid "Hide main menu entry"
msgstr "Piilota valinta päävalikosta" msgstr "Piilota valinta päävalikosta"
@@ -91,11 +87,14 @@ msgstr "Sijainti"
msgid "Define the position of OSD." msgid "Define the position of OSD."
msgstr "Määrittele näytön sijainti." msgstr "Määrittele näytön sijainti."
msgid "Downscale OSD size [%]" msgid "Define the height of OSD."
msgstr "Pienennä näytön kokoa [%]" msgstr "Määrittele näytön korkeus."
msgid "Define the downscale ratio for OSD size." msgid "Horizontal offset"
msgstr "Määrittele näytön pienennyssuhde." msgstr "Vaakakeskitys"
msgid "Define the horizontal offset of OSD."
msgstr "Määrittele näytön vaakakeskitys."
msgid "Red limit [%]" msgid "Red limit [%]"
msgstr "Punaisen taso [%]" msgstr "Punaisen taso [%]"
@@ -178,12 +177,6 @@ msgstr "Radio-ID"
msgid "Coderate" msgid "Coderate"
msgstr "Suojaustaso" msgstr "Suojaustaso"
msgid "Protocol"
msgstr "Protokolla"
msgid "Bitrate"
msgstr "Bittinopeus"
msgid "Stream Information" msgid "Stream Information"
msgstr "Lähetteen tiedot" msgstr "Lähetteen tiedot"
@@ -193,6 +186,9 @@ msgstr "Kuvaraita"
msgid "Codec" msgid "Codec"
msgstr "Koodekki" msgstr "Koodekki"
msgid "Bitrate"
msgstr "Bittinopeus"
msgid "Aspect Ratio" msgid "Aspect Ratio"
msgstr "Kuvasuhde" msgstr "Kuvasuhde"
@@ -235,6 +231,12 @@ msgstr "Dolby Surround -tehoste"
msgid "Low Frequency Effects" msgid "Low Frequency Effects"
msgstr "LFE-kanava" msgstr "LFE-kanava"
msgid "on"
msgstr "päällä"
msgid "off"
msgstr "poissa"
msgid "Dialogue Normalization" msgid "Dialogue Normalization"
msgstr "Dialogin normalisointi" msgstr "Dialogin normalisointi"
@@ -271,9 +273,6 @@ msgstr "MPEG-2 kerros III"
msgid "HE-AAC" msgid "HE-AAC"
msgstr "HE-AAC" msgstr "HE-AAC"
msgid "LATM"
msgstr "LATM"
msgid "stereo" msgid "stereo"
msgstr "stereo" msgstr "stereo"
@@ -286,6 +285,9 @@ msgstr "kaksikanavainen"
msgid "mono" msgid "mono"
msgstr "mono" msgstr "mono"
msgid "MHz"
msgstr "MHz"
msgid "interlaced" msgid "interlaced"
msgstr "lomiteltu" msgstr "lomiteltu"
@@ -376,9 +378,6 @@ msgstr "dB"
msgid "not indicated" msgid "not indicated"
msgstr "ei ilmaistu" msgstr "ei ilmaistu"
msgid "MHz"
msgstr "MHz"
msgid "free" msgid "free"
msgstr "vapaa" msgstr "vapaa"
@@ -387,9 +386,3 @@ msgstr "Mbit/s"
msgid "kbit/s" msgid "kbit/s"
msgstr "kbit/s" msgstr "kbit/s"
#~ msgid "Information"
#~ msgstr "Tiedot"
#~ msgid "Statistics"
#~ msgstr "Tilastot"

View File

@@ -5,13 +5,12 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-femon 1.7.18\n" "Project-Id-Version: femon 1.6.5\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n" "POT-Creation-Date: 2008-12-16 12:08+0200\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n" "PO-Revision-Date: 2008-01-26 09:59+0100\n"
"Last-Translator: NIVAL Micha<68>l <mnival@club-internet.fr>\n" "Last-Translator: NIVAL Micha<68>l <mnival@club-internet.fr>\n"
"Language-Team: French <vdr@linuxtv.org>\n" "Language-Team: <vdr@linuxtv.org>\n"
"Language: fr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
@@ -64,9 +63,6 @@ msgstr "Duotone"
msgid "SilverGreen" msgid "SilverGreen"
msgstr "SilverGreen" msgstr "SilverGreen"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry" msgid "Hide main menu entry"
msgstr "Masquer dans le menu principal" msgstr "Masquer dans le menu principal"
@@ -91,11 +87,14 @@ msgstr "Position"
msgid "Define the position of OSD." msgid "Define the position of OSD."
msgstr "D<>finit la position de l'OSD." msgstr "D<>finit la position de l'OSD."
msgid "Downscale OSD size [%]" msgid "Define the height of OSD."
msgstr "" msgstr "D<EFBFBD>finit l'hauteur de l'OSD."
msgid "Define the downscale ratio for OSD size." msgid "Horizontal offset"
msgstr "" msgstr "D<EFBFBD>placement horizontal"
msgid "Define the horizontal offset of OSD."
msgstr "D<>finit le d<>placement horizontal de l'OSD."
msgid "Red limit [%]" msgid "Red limit [%]"
msgstr "Limite du rouge (%)" msgstr "Limite du rouge (%)"
@@ -178,12 +177,6 @@ msgstr "Rid"
msgid "Coderate" msgid "Coderate"
msgstr "Coderate" msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Bitrate"
msgid "Stream Information" msgid "Stream Information"
msgstr "Information flux" msgstr "Information flux"
@@ -193,6 +186,9 @@ msgstr "Flux vid
msgid "Codec" msgid "Codec"
msgstr "" msgstr ""
msgid "Bitrate"
msgstr "Bitrate"
msgid "Aspect Ratio" msgid "Aspect Ratio"
msgstr "Proportions d'image" msgstr "Proportions d'image"
@@ -235,6 +231,12 @@ msgstr "Mode Dolby Surround"
msgid "Low Frequency Effects" msgid "Low Frequency Effects"
msgstr "Effets de basses" msgstr "Effets de basses"
msgid "on"
msgstr "Oui"
msgid "off"
msgstr "Non"
msgid "Dialogue Normalization" msgid "Dialogue Normalization"
msgstr "Normalisation des dialogues" msgstr "Normalisation des dialogues"
@@ -271,9 +273,6 @@ msgstr ""
msgid "HE-AAC" msgid "HE-AAC"
msgstr "" msgstr ""
msgid "LATM"
msgstr ""
msgid "stereo" msgid "stereo"
msgstr "" msgstr ""
@@ -286,6 +285,9 @@ msgstr ""
msgid "mono" msgid "mono"
msgstr "" msgstr ""
msgid "MHz"
msgstr "MHz"
msgid "interlaced" msgid "interlaced"
msgstr "" msgstr ""
@@ -376,9 +378,6 @@ msgstr "dB"
msgid "not indicated" msgid "not indicated"
msgstr "non indiqu<71>" msgstr "non indiqu<71>"
msgid "MHz"
msgstr "MHz"
msgid "free" msgid "free"
msgstr "libre" msgstr "libre"

View File

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

View File

@@ -6,19 +6,15 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-femon 1.7.18\n" "Project-Id-Version: femon 1.6.5\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n" "POT-Creation-Date: 2008-12-16 12:08+0200\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n" "PO-Revision-Date: 2008-11-10 23:37+0100\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: <vdr@linuxtv.org>\n"
"Language: it\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"
"X-Poedit-Language: Italian\n"
"X-Poedit-Country: ITALY\n"
"X-Poedit-SourceCharset: utf-8\n"
msgid "DVB Signal Information Monitor (OSD)" msgid "DVB Signal Information Monitor (OSD)"
msgstr "Mostra info segnale DVB (OSD)" msgstr "Mostra info segnale DVB (OSD)"
@@ -68,20 +64,17 @@ msgstr "Duotone"
msgid "SilverGreen" msgid "SilverGreen"
msgstr "SilverGreen" msgstr "SilverGreen"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry" msgid "Hide main menu entry"
msgstr "Nascondi voce menu principale" msgstr "Nascondi voce menu principale"
msgid "Define whether the main menu entry is hidden." msgid "Define whether the main menu entry is hidden."
msgstr "Definisci se la voce del menu principale è nascosta." msgstr "Definisci se la voce del menu principale <EFBFBD> nascosta."
msgid "Default display mode" msgid "Default display mode"
msgstr "Modalità visualizz. predefinita" msgstr "Modalit<EFBFBD> visualizz. predefinita"
msgid "Define the default display mode at startup." msgid "Define the default display mode at startup."
msgstr "Definisci la modalità di visualizz. predefinita all'avvio." msgstr "Definisci la modalit<EFBFBD> di visualizz. predefinita all'avvio."
msgid "Define the used OSD skin." msgid "Define the used OSD skin."
msgstr "Definisci lo stile interfaccia OSD utilizzato." msgstr "Definisci lo stile interfaccia OSD utilizzato."
@@ -95,11 +88,14 @@ msgstr "Posizione"
msgid "Define the position of OSD." msgid "Define the position of OSD."
msgstr "Definisci la posizione dell'OSD." msgstr "Definisci la posizione dell'OSD."
msgid "Downscale OSD size [%]" msgid "Define the height of OSD."
msgstr "Riduci dimensione OSD [%]" msgstr "Definisci l'altezza dell'OSD."
msgid "Define the downscale ratio for OSD size." msgid "Horizontal offset"
msgstr "Definisci il rapporto di riduzione della dimensione OSD." msgstr "Limite orizzontale"
msgid "Define the horizontal offset of OSD."
msgstr "Definisci il limite orizzontale dell'OSD."
msgid "Red limit [%]" msgid "Red limit [%]"
msgstr "Limite rosso [%]" msgstr "Limite rosso [%]"
@@ -117,19 +113,19 @@ msgid "OSD update interval [0.1s]"
msgstr "Intervallo agg. OSD [0.1s]" msgstr "Intervallo agg. OSD [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 "Definisci un intervallo per gli agg. OSD. Più piccolo è l'intervallo maggiore sarà l'uso di CPU." msgstr "Definisci un intervallo per gli agg. OSD. Pi<EFBFBD> piccolo <EFBFBD> l'intervallo maggiore sar<EFBFBD> l'uso di CPU."
msgid "Analyze stream" msgid "Analyze stream"
msgstr "Analizza flusso" msgstr "Analizza flusso"
msgid "Define whether the DVB stream is analyzed and bitrates calculated." msgid "Define whether the DVB stream is analyzed and bitrates calculated."
msgstr "Definisci se il flusso DVB è analizzato e i bitrate calcolati." msgstr "Definisci se il flusso DVB <EFBFBD> analizzato e i bitrate calcolati."
msgid "Calculation interval [0.1s]" msgid "Calculation interval [0.1s]"
msgstr "Intervallo di calcolo [0.1s]" msgstr "Intervallo di calcolo [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 "Definisci un intervallo di calcolo. L'intervallo più grande genera valori più stabili." msgstr "Definisci un intervallo di calcolo. L'intervallo pi<EFBFBD> grande genera valori pi<EFBFBD> stabili."
msgid "Use SVDRP service" msgid "Use SVDRP service"
msgstr "Utilizza servizio SVDRP" msgstr "Utilizza servizio SVDRP"
@@ -182,12 +178,6 @@ msgstr "Rid"
msgid "Coderate" msgid "Coderate"
msgstr "Coderate" msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Bitrate"
msgid "Stream Information" msgid "Stream Information"
msgstr "Informazioni flusso" msgstr "Informazioni flusso"
@@ -197,6 +187,9 @@ msgstr "Flusso video"
msgid "Codec" msgid "Codec"
msgstr "Codifica" msgstr "Codifica"
msgid "Bitrate"
msgstr "Bitrate"
msgid "Aspect Ratio" msgid "Aspect Ratio"
msgstr "Formato immagine" msgstr "Formato immagine"
@@ -213,7 +206,7 @@ msgid "Audio Stream"
msgstr "Flusso audio" msgstr "Flusso audio"
msgid "Channel Mode" msgid "Channel Mode"
msgstr "Modalità canale" msgstr "Modalit<EFBFBD> canale"
msgid "Sampling Frequency" msgid "Sampling Frequency"
msgstr "Frequenza campionamento" msgstr "Frequenza campionamento"
@@ -222,10 +215,10 @@ msgid "AC-3 Stream"
msgstr "Flusso AC-3" msgstr "Flusso AC-3"
msgid "Bit Stream Mode" msgid "Bit Stream Mode"
msgstr "Modalità bitstream" msgstr "Modalit<EFBFBD> bitstream"
msgid "Audio Coding Mode" msgid "Audio Coding Mode"
msgstr "Modalità codifica audio" msgstr "Modalit<EFBFBD> codifica audio"
msgid "Center Mix Level" msgid "Center Mix Level"
msgstr "Livello sonoro centrale" msgstr "Livello sonoro centrale"
@@ -234,11 +227,17 @@ msgid "Surround Mix Level"
msgstr "Livello sonoro surround" msgstr "Livello sonoro surround"
msgid "Dolby Surround Mode" msgid "Dolby Surround Mode"
msgstr "Modalità Dolby Surround" msgstr "Modalit<EFBFBD> Dolby Surround"
msgid "Low Frequency Effects" msgid "Low Frequency Effects"
msgstr "Effetti bassa frequenza" msgstr "Effetti bassa frequenza"
msgid "on"
msgstr "Attivo"
msgid "off"
msgstr "Disattivo"
msgid "Dialogue Normalization" msgid "Dialogue Normalization"
msgstr "Normalizzazione dialoghi" msgstr "Normalizzazione dialoghi"
@@ -275,9 +274,6 @@ msgstr "MPEG-2 Layer III"
msgid "HE-AAC" msgid "HE-AAC"
msgstr "HE-AAC" msgstr "HE-AAC"
msgid "LATM"
msgstr "LATM"
msgid "stereo" msgid "stereo"
msgstr "stereo" msgstr "stereo"
@@ -290,6 +286,9 @@ msgstr "dual"
msgid "mono" msgid "mono"
msgstr "mono" msgstr "mono"
msgid "MHz"
msgstr "MHz"
msgid "interlaced" msgid "interlaced"
msgstr "interlacciato" msgstr "interlacciato"
@@ -380,9 +379,6 @@ msgstr "dB"
msgid "not indicated" msgid "not indicated"
msgstr "non indicato" msgstr "non indicato"
msgid "MHz"
msgstr "MHz"
msgid "free" msgid "free"
msgstr "libero" msgstr "libero"

View File

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

View File

@@ -5,13 +5,12 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: vdr-femon 1.7.18\n" "Project-Id-Version: femon 1.6.5\n"
"Report-Msgid-Bugs-To: <see README>\n" "Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n" "POT-Creation-Date: 2008-12-16 12:08+0200\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n" "PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Vyacheslav Dikonov\n" "Last-Translator: Vyacheslav Dikonov\n"
"Language-Team: Russian <vdr@linuxtv.org>\n" "Language-Team: <vdr@linuxtv.org>\n"
"Language: ru\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-5\n" "Content-Type: text/plain; charset=ISO-8859-5\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
@@ -64,9 +63,6 @@ msgstr "Duotone"
msgid "SilverGreen" msgid "SilverGreen"
msgstr "SilverGreen" msgstr "SilverGreen"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry" msgid "Hide main menu entry"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>" msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"
@@ -91,10 +87,13 @@ msgstr "
msgid "Define the position of OSD." msgid "Define the position of OSD."
msgstr "" msgstr ""
msgid "Downscale OSD size [%]" msgid "Define the height of OSD."
msgstr "" msgstr ""
msgid "Define the downscale ratio for OSD size." msgid "Horizontal offset"
msgstr ""
msgid "Define the horizontal offset of OSD."
msgstr "" msgstr ""
msgid "Red limit [%]" msgid "Red limit [%]"
@@ -178,12 +177,6 @@ msgstr "Rid"
msgid "Coderate" msgid "Coderate"
msgstr "Coderate" msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr ""
msgid "Stream Information" msgid "Stream Information"
msgstr "" msgstr ""
@@ -193,6 +186,9 @@ msgstr ""
msgid "Codec" msgid "Codec"
msgstr "" msgstr ""
msgid "Bitrate"
msgstr ""
msgid "Aspect Ratio" msgid "Aspect Ratio"
msgstr "" msgstr ""
@@ -235,6 +231,12 @@ msgstr ""
msgid "Low Frequency Effects" msgid "Low Frequency Effects"
msgstr "" msgstr ""
msgid "on"
msgstr "<22><><EFBFBD>"
msgid "off"
msgstr "<22><><EFBFBD><EFBFBD>"
msgid "Dialogue Normalization" msgid "Dialogue Normalization"
msgstr "" msgstr ""
@@ -271,9 +273,6 @@ msgstr ""
msgid "HE-AAC" msgid "HE-AAC"
msgstr "" msgstr ""
msgid "LATM"
msgstr ""
msgid "stereo" msgid "stereo"
msgstr "" msgstr ""
@@ -286,6 +285,9 @@ msgstr ""
msgid "mono" msgid "mono"
msgstr "" msgstr ""
msgid "MHz"
msgstr "<22><><EFBFBD>"
msgid "interlaced" msgid "interlaced"
msgstr "" msgstr ""
@@ -376,9 +378,6 @@ msgstr "dB"
msgid "not indicated" msgid "not indicated"
msgstr "" msgstr ""
msgid "MHz"
msgstr "<22><><EFBFBD>"
msgid "free" msgid "free"
msgstr "" msgstr ""

View File

@@ -1,399 +0,0 @@
# Ukrainian translation.
# Copyright (C) 2010 The Claws Mail Team
# This file is distributed under the same license as the claws-mail package.
# Yarema aka Knedlyk <yupadmin@gmail.com>, 2010.
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 1.7.18\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-10-10 10:10+0300\n"
"PO-Revision-Date: 2010-10-10 10:10+0300\n"
"Last-Translator: Yarema aka Knedlyk <yupadmin@gmail.com>\n"
"Language-Team: Ukrainian <translation@linux.org.ua>\n"
"Language: uk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\\n\n"
msgid "DVB Signal Information Monitor (OSD)"
msgstr "Монітор інформації про DVB сигнал"
msgid "Signal Information"
msgstr "Інформація про сигнал"
msgid "Femon not available"
msgstr "Femon не доступний"
msgid "basic"
msgstr "основне"
msgid "transponder"
msgstr "транспондер"
msgid "stream"
msgstr "потік"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "Класичний"
msgid "Elchi"
msgstr "Elchi"
msgid "ST:TNG"
msgstr "ST:TNG"
msgid "DeepBlue"
msgstr "DeepBlue"
msgid "Moronimo"
msgstr "Moronimo"
msgid "Enigma"
msgstr "Enigma"
msgid "EgalsTry"
msgstr "EgalsTry"
msgid "Duotone"
msgstr "Duotone"
msgid "SilverGreen"
msgstr "SilverGreen"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry"
msgstr "Сховати в головному меню"
msgid "Define whether the main menu entry is hidden."
msgstr "Визначення, чи приховувати в головному меню"
msgid "Default display mode"
msgstr "Типовий режим показу"
msgid "Define the default display mode at startup."
msgstr "Визначення типового режиму показу при запуску"
msgid "Define the used OSD skin."
msgstr "Визначення шкірки для повідомлень"
msgid "Define the used OSD theme."
msgstr "Визначення теми повідомлень"
msgid "Position"
msgstr "Позиція"
msgid "Define the position of OSD."
msgstr "Визначити позицію показу повідомлень"
msgid "Downscale OSD size [%]"
msgstr "Масштаб розміру повідомлень [%]"
msgid "Define the downscale ratio for OSD size."
msgstr "Визначити коефіцієнт масштабування розміру повідомлень"
msgid "Red limit [%]"
msgstr "Червона границя [%]"
msgid "Define a limit for red bar, which is used to indicate a bad signal."
msgstr "Визначення границі червоної поділки, яка показує поганий сигнал."
msgid "Green limit [%]"
msgstr "Зелена границя [%]"
msgid "Define a limit for green bar, which is used to indicate a good signal."
msgstr "Визначення границі зеленої поділки, яка показує добрий сигнал."
msgid "OSD update interval [0.1s]"
msgstr "Інтервал оновлення повідомлень [0.1с]"
msgid ""
"Define an interval for OSD updates. The smaller interval generates higher "
"CPU load."
msgstr ""
"Визначення інтервалу оновлення повідомлень. Малий інтервал спричинює більше "
"завантаження процесора."
msgid "Analyze stream"
msgstr "Аналіз потоку"
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
msgstr "Визначення, чи проводити аналіз DVB потоку і обчислення бітрейту"
msgid "Calculation interval [0.1s]"
msgstr "Інтервал обчислення [0.1с]"
msgid ""
"Define an interval for calculation. The bigger interval generates more "
"stable values."
msgstr ""
"Визначення інтервалу обчислення. Більший інтервал дає стабільніші значення."
msgid "Use SVDRP service"
msgstr "Використати SVDRP сервіс"
msgid "Define whether the SVDRP service is used in client/server setups."
msgstr ""
"Визначення чи буде використовуватися SVDRP сервіс в налаштуваннях клієнта/"
"сервера"
msgid "SVDRP service port"
msgstr "Порт SVDRP сервісу"
msgid "Define the port number of SVDRP service."
msgstr "Визначення номеру порту SVDRP сервісу"
msgid "SVDRP service IP"
msgstr "IP сервісу SVDRP"
msgid "Define the IP address of SVDRP service."
msgstr "Визначення IP адреси сервісу SVDRP."
msgid "Help"
msgstr "Допомога"
msgid "Video"
msgstr "Відео"
msgid "Audio"
msgstr "Аудіо"
msgid "Transponder Information"
msgstr "Інформація про транспондер"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "Шв. кодування"
msgid "Protocol"
msgstr "Протокол"
msgid "Bitrate"
msgstr "Бітрейт"
msgid "Stream Information"
msgstr "Інформація про потік"
msgid "Video Stream"
msgstr "Відео потік"
msgid "Codec"
msgstr "Кодек"
msgid "Aspect Ratio"
msgstr "Співвідношення сторін"
msgid "Frame Rate"
msgstr "Частота кадрів"
msgid "Video Format"
msgstr "Формат відео"
msgid "Resolution"
msgstr "Роздільна здатність"
msgid "Audio Stream"
msgstr "Аудіо потік"
msgid "Channel Mode"
msgstr "Режим каналу"
msgid "Sampling Frequency"
msgstr "Частота"
msgid "AC-3 Stream"
msgstr "AC-3 потік"
msgid "Bit Stream Mode"
msgstr "Режим бітового потоку:"
msgid "Audio Coding Mode"
msgstr "Режим кодування малюнка"
msgid "Center Mix Level"
msgstr "Рівень міксування в центрі"
msgid "Surround Mix Level"
msgstr "Рівень міксування заповнення"
msgid "Dolby Surround Mode"
msgstr "Режим Dolby Surround"
msgid "Low Frequency Effects"
msgstr "Ефекти низької частоти"
msgid "Dialogue Normalization"
msgstr "Нормалізація гучності"
msgid "Fixed"
msgstr "Фіксовано"
msgid "Analog"
msgstr "Аналог."
msgid "MPEG-2"
msgstr "MPEG-2"
msgid "H.264"
msgstr "H.264"
msgid "MPEG-1 Layer I"
msgstr "MPEG-1 Layer I"
msgid "MPEG-1 Layer II"
msgstr "MPEG-1 Layer II"
msgid "MPEG-1 Layer III"
msgstr "MPEG-1 Layer III"
msgid "MPEG-2 Layer I"
msgstr "MPEG-2 Layer I"
msgid "MPEG-2 Layer II"
msgstr "MPEG-2 Layer II"
msgid "MPEG-2 Layer III"
msgstr "MPEG-2 Layer III"
msgid "HE-AAC"
msgstr "HE-AAC"
msgid "LATM"
msgstr "LATM"
msgid "stereo"
msgstr "стерео"
msgid "joint Stereo"
msgstr "об’єднане стерео"
msgid "dual"
msgstr "дуальний"
msgid "mono"
msgstr "моно"
msgid "interlaced"
msgstr "черезрядкове"
msgid "progressive"
msgstr "прогресивне"
msgid "reserved"
msgstr "зарезервовано"
msgid "extended"
msgstr "розширено"
msgid "unknown"
msgstr "невідомо"
msgid "component"
msgstr "компонентно"
msgid "PAL"
msgstr "PAL"
msgid "NTSC"
msgstr "NTSC"
msgid "SECAM"
msgstr "SECAM"
msgid "MAC"
msgstr "MAC"
msgid "Hz"
msgstr "Гц"
msgid "Complete Main (CM)"
msgstr "Заповнення основного (CM)"
msgid "Music and Effects (ME)"
msgstr "Музика і ефекти (ME)"
msgid "Visually Impaired (VI)"
msgstr "Слабозорі (VI)"
msgid "Hearing Impaired (HI)"
msgstr "Погіршений слух (HI)"
msgid "Dialogue (D)"
msgstr "Діалог (D)"
msgid "Commentary (C)"
msgstr "Коментарі (C)"
msgid "Emergency (E)"
msgstr "Аварійне (E)"
msgid "Voice Over (VO)"
msgstr "Голос через (VO)"
msgid "Karaoke"
msgstr "Караоке"
msgid "Ch1"
msgstr "Кан.1"
msgid "Ch2"
msgstr "Кан.2"
msgid "C"
msgstr "C"
msgid "L"
msgstr "L"
msgid "R"
msgstr "R"
msgid "S"
msgstr "S"
msgid "SL"
msgstr "SL"
msgid "SR"
msgstr "Симв.шв."
msgid "dB"
msgstr "дБ"
msgid "not indicated"
msgstr "не вказано"
msgid "MHz"
msgstr "МГц"
msgid "free"
msgstr "вільний"
msgid "Mbit/s"
msgstr "Мбіт/c"
msgid "kbit/s"
msgstr "кбіт/с"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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