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

Compare commits

..

84 Commits

Author SHA1 Message Date
Rolf Ahrenberg
136c9fb73c Refactored the SAT>IP support. 2014-03-15 12:35:49 +02:00
Rolf Ahrenberg
9ca1fcb378 Added support for SAT>IP devices. 2014-03-08 13:28:31 +02:00
Rolf Ahrenberg
1cfbd0b730 Updated translation files and HISTORY. 2014-01-19 00:14:13 +02:00
Rolf Ahrenberg
152e87d443 Updated version number. 2014-01-12 22:27:23 +02:00
Rolf Ahrenberg
08223cf6c4 Added initial support for CAMs. 2014-01-12 22:24:50 +02:00
Rolf Ahrenberg
84572d2187 Fixed indentation. 2014-01-12 01:02:03 +02:00
Rolf Ahrenberg
78554b53b6 Updated translation files and HISTORY. 2014-01-11 00:08:06 +02:00
Rolf Ahrenberg
11554a8d7e Updated the femonclient package. 2014-01-06 22:40:31 +02:00
Rolf Ahrenberg
0d06635520 Fixed freeing memory. 2014-01-06 22:36:54 +02:00
Rolf Ahrenberg
eedab47c35 Updated Makefile. 2014-01-06 22:00:59 +02:00
Rolf Ahrenberg
cba5171a09 Fixed scan-build issues. 2014-01-02 21:33:34 +02:00
Rolf Ahrenberg
91d6cb4074 Fixed a crash in SVDRP (Thanks for Lothar Englisch for reporting). 2013-11-19 22:29:36 +02:00
Rolf Ahrenberg
bf222dc7ff Updated for vdr-2.0.0. 2013-04-01 22:35:11 +03:00
Rolf Ahrenberg
33176e9a77 Updated French translation (Thanks to Bernard Jaulin). 2013-03-23 19:13:35 +02:00
Rolf Ahrenberg
0a4e5d912c Added Slovak translation (Thanks to Milan Hrala). 2013-03-20 21:43:45 +02:00
Rolf Ahrenberg
3648b46fa2 Added SetMenuCategory(mcSetupPlugins). 2013-03-13 23:36:15 +02:00
Rolf Ahrenberg
c5267f5390 Updated HISTORY. 2013-03-10 21:18:23 +02:00
Rolf Ahrenberg
30d7eea514 Fixed Rolloff/StreamId layouts and updated Finnish translation. 2013-03-10 20:12:17 +02:00
Rolf Ahrenberg
09d17772d2 Updated for vdr-1.7.40. 2013-03-10 18:52:01 +02:00
Rolf Ahrenberg
ee43f5936f Updated French translation (Thanks to Bernard Jaulin). 2013-03-09 13:19:03 +02:00
Rolf Ahrenberg
10b8463283 Fixed cppcheck warnings. 2013-03-06 09:28:16 +02:00
Rolf Ahrenberg
046c94d39c Updated vdr-femonclient. 2013-02-10 17:23:49 +02:00
Rolf Ahrenberg
c3506e2279 Updated for vdr-1.7.37. 2013-02-10 16:51:51 +02:00
Rolf Ahrenberg
d0b6944292 Declared cppcheck as a PHONY target. 2013-01-22 22:11:23 +02:00
Rolf Ahrenberg
932f727e91 Removed OBJS dependency from cppcheck target. 2013-01-22 22:05:20 +02:00
Rolf Ahrenberg
e8fa85929a Updated for vdr-1.7.36. 2013-01-20 21:30:51 +02:00
Rolf Ahrenberg
70cda8a640 Updated translation files. 2013-01-04 00:18:20 +02:00
Rolf Ahrenberg
655b5a1865 Updated for vdr-1.7.35. Modified how the receiver is detached. Updated the femonclient plugin. 2013-01-03 23:34:19 +02:00
Rolf Ahrenberg
2f6b971c92 Added Ukrainian translation (Thanks to Yarema aka Knedlyk). 2012-12-01 00:10:47 +02:00
Rolf Ahrenberg
379de93bee Remove the obsolete notes. 2012-04-04 22:02:59 +03:00
Rolf Ahrenberg
5b5f704ea8 Removed cppcheck warnings and updated HISTORY. 2012-04-02 19:25:31 +03:00
Rolf Ahrenberg
2d849b4fb8 Added transponder info window support for IPTV devices. 2012-04-01 22:39:33 +03:00
Rolf Ahrenberg
0e6457ab42 Added an info line for IPTV devices. 2012-03-31 13:22:11 +03:00
Rolf Ahrenberg
0f8cc6c9ce Modified cFemonReceiver constructor. 2012-03-31 11:47:57 +03:00
Rolf Ahrenberg
f1d9b112a4 Added a new theme: PearlHD (Thanks to Taipan @ VDRPortal). 2012-03-30 20:48:25 +03:00
Rolf Ahrenberg
4431cf57d9 Silenced error log messages when accessing pseudo devices. 2012-03-29 23:31:44 +03:00
Rolf Ahrenberg
18840de217 Added the dynamite compatibility patch (Thanks to Lars Hanisch). 2012-03-29 21:48:52 +03:00
Rolf Ahrenberg
315a3365ba Updated for vdr-1.7.27. 2012-03-25 16:55:42 +03:00
Rolf Ahrenberg
8e1e025b0f Updated default CXXFLAGS. 2012-03-25 16:02:16 +03:00
Rolf Ahrenberg
543accdd06 Cleaned up compilation warnings again. 2012-03-19 18:09:16 +02:00
Rolf Ahrenberg
66eca7f8b5 Fixed channel switching.
Cleaned up compilation warnings.
2012-03-12 21:59:34 +02:00
Rolf Ahrenberg
905b7c0870 Updated for a new release version. 2012-03-10 23:07:03 +02:00
Rolf Ahrenberg
597425a271 Updated for vdr-1.7.26. 2012-03-10 23:05:38 +02:00
Rolf Ahrenberg
86210928b8 Updated for vdr-1.7.25. 2012-03-03 15:19:18 +02:00
Rolf Ahrenberg
c98fe8ca87 Added a GIT tag into the version string. 2012-02-26 22:54:18 +02:00
Rolf Ahrenberg
5598f7cc43 Silenced compilation warnings. 2012-02-19 18:54:19 +02:00
Rolf Ahrenberg
62f1f5f776 Updated Makefile. 2012-02-19 17:48:21 +02:00
Rolf Ahrenberg
8ba74bf5c4 Silenced compilation warnings - again. 2012-02-05 18:21:07 +02:00
Rolf Ahrenberg
38fbb2d47d Updated translation files. 2012-02-05 14:08:01 +02:00
Rolf Ahrenberg
09cf40f215 Added initial support for PVRINPUT devices (Thanks to Winfried Köhler).
Added initial support for IPTV devices.
2012-02-05 14:04:04 +02:00
Rolf Ahrenberg
d809e98052 Silenced a compilation warning. 2012-02-05 11:39:14 +02:00
Rolf Ahrenberg
5e16064c33 Fixed an invalid character. 2012-01-15 23:25:31 +02:00
Rolf Ahrenberg
cf8920ddd6 Updated for vdr-1.7.23.
Updated SVDRP interface.
2012-01-15 23:07:53 +02:00
Rolf Ahrenberg
1e3b10faa7 Added Hungarian translation (Thanks to Fuley Istvan) and incremented version number. 2011-12-23 15:28:06 +02:00
Rolf Ahrenberg
b7a41c8d78 Merge branch 'master' of ssh://arabuusimiehet.com/git/femon 2011-12-09 16:00:40 +02:00
Rolf Ahrenberg
3b776594ef Adapted cFemonBitStream for vdr-1.7.22. 2011-12-04 19:30:24 +02:00
Rolf Ahrenberg
635f99fda6 Merge branch 'master' of ssh://arabuusimiehet.com/git/femon 2011-11-28 16:30:56 +02:00
Rolf Ahrenberg
313bbd10ef Fixed scan/framerate settings in the H.264 analyzer. 2011-11-27 14:18:43 +02:00
Rolf Ahrenberg
7ab150cd3c Added some new symbols. 2011-11-27 02:09:27 +02:00
Rolf Ahrenberg
0f45bd7f51 Fixed scan/framerate settings in the H.264 analyzer. 2011-11-21 13:48:46 +02:00
Rolf Ahrenberg
f1cb78664c Cleaned up some whitespace bugs. 2011-11-20 19:04:24 +02:00
Rolf Ahrenberg
f1a671650f Enchanced both progressive frame and frame rate detection. 2011-11-19 19:56:51 +02:00
Rolf Ahrenberg
ac4d414597 Refactored bitstream code. 2011-11-19 16:02:16 +02:00
Rolf Ahrenberg
5003faabc4 Updated for vdr-1.7.19: New API functions for signal strength and quality used to provide information for the OSD. 2011-09-03 23:00:33 +03:00
Rolf Ahrenberg
131a61c80c Updated I18N target. 2011-06-19 16:55:07 +03:00
Rolf Ahrenberg
c408ea1cd9 Added cppcheck target into Makefile. 2011-06-15 17:50:03 +03:00
Rolf Ahrenberg
a840fc9931 Updated HISTORY. 2011-05-15 11:18:40 +03:00
Rolf Ahrenberg
997ff44b18 Use horizontal scaling only for frontend status symbols. 2011-04-21 10:59:40 +03:00
Rolf Ahrenberg
4dd3c4a184 Changed std::vector to cVector. 2011-04-20 18:09:31 +03:00
Rolf Ahrenberg
de92daf5f0 Added scaling for symbols.
Updated for vdr-1.7.18.
2011-04-20 17:41:17 +03:00
Rolf Ahrenberg
0fd4062c76 Added package name and version to xgettext and made 'dist' target dependent on up to date *.po files.
Updated for vdr-1.7.17.
2011-03-13 19:09:01 +02:00
Rolf Ahrenberg
d9f977e302 Updated HISTORY. 2010-12-27 10:30:43 +02:00
Rolf Ahrenberg
ebfc153940 Added support for LDFLAGS. 2010-12-14 19:25:09 +02:00
Rolf Ahrenberg
f3c52fab6e Tweaked translation files. 2010-12-08 10:47:24 +02:00
Rolf Ahrenberg
b682dbf0fe Updated translation files. 2010-12-04 19:06:15 +02:00
Rolf Ahrenberg
b4673bdece Fixed detection of replaying. 2010-10-29 21:16:01 +03:00
Rolf Ahrenberg
c3b0254b2e Added Makefile depencency for objects. 2010-10-11 23:27:30 +03:00
Rolf Ahrenberg
b8c7fdddb7 Updated for vdr-1.7.16. 2010-09-19 23:19:33 +03:00
Rolf Ahrenberg
23a8a72c38 Modified LATM parser. 2010-06-23 20:12:35 +03:00
Rolf Ahrenberg
f37f428670 Added preliminary support for LATM. 2010-06-23 12:16:17 +03:00
Rolf Ahrenberg
3235c67256 Fixed a crash in femon service (Thanks to Wolfgang Astleitner). 2010-05-31 16:55:19 +03:00
Rolf Ahrenberg
a21ed98163 Updated Italian translation (Thanks to Diego Pierotto). 2010-03-31 14:44:39 +03:00
Rolf Ahrenberg
0b38358442 Fixed a typo. 2010-03-09 15:31:18 +02:00
Rolf Ahrenberg
9c085fea51 Fixed device switching. 2010-03-06 22:01:42 +02:00
48 changed files with 3032 additions and 926 deletions

99
HISTORY
View File

@@ -1,4 +1,3 @@
=================================== ===================================
VDR Plugin 'femon' Revision History VDR Plugin 'femon' Revision History
=================================== ===================================
@@ -66,6 +65,7 @@ VDR Plugin 'femon' Revision History
- Backported changes and fixes from version 0.1.6. - Backported changes and fixes from version 0.1.6.
=================================== ===================================
VDR Plugin 'femon' Revision History VDR Plugin 'femon' Revision History
=================================== ===================================
@@ -343,6 +343,7 @@ VDR Plugin 'femon' Revision History
- Backported from 1.7.2. - Backported from 1.7.2.
=================================== ===================================
VDR Plugin 'femon' Revision History VDR Plugin 'femon' Revision History
=================================== ===================================
@@ -395,3 +396,99 @@ VDR Plugin 'femon' Revision History
- Updated for vdr-1.7.13. - Updated for vdr-1.7.13.
- Added a setup option to downscale the OSD size. - Added a setup option to downscale the OSD size.
- Updated Estonian translation (Thanks to Arthur Konovalov). - 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).
2013-03-10: Version 1.7.19
- Updated for vdr-1.7.40.
- Updated French translation (Thanks to Bernard Jaulin).
===================================
VDR Plugin 'femon' Revision History
===================================
2013-04-01: Version 2.0.0
- Updated for vdr-2.0.0.
- Added Slovak translation (Thanks to Milan Hrala).
2014-01-10: Version 2.0.1
- Fixed a crash in SVDRP (Thanks for Lothar Englisch for reporting).
- Fixed a memory leak and issues reported by scan-build tool.
2014-01-18: Version 2.0.2
- Added initial support for CAMs.
2014-03-08: Version 2.0.3
- Added support for SAT>IP devices.
2014-03-15: Version 2.0.4
- Refactored the SAT>IP support.

View File

@@ -2,122 +2,136 @@
# 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:
VDRDIR = ../../.. # Use package data if installed...otherwise assume we're under the VDR source directory:
LIBDIR = ../../lib PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
TMPDIR = /tmp LIBDIR = $(call PKGCFG,libdir)
LOCDIR = $(call PKGCFG,locdir)
PLGCFG = $(call PKGCFG,plgcfg)
#
TMPDIR ?= /tmp
### Make sure that necessary options are included: ### The compiler options:
include $(VDRDIR)/Make.global 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 $(VDRDIR)/Make.config -include $(PLGCFG)
### 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 += -I$(VDRDIR)/include INCLUDES +=
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"' DEFINES += -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 = femon.o femonosd.o femonreceiver.o femoncfg.o femontools.o femonmpeg.o femonac3.o femonaac.o femonh264.o femonsymbol.o OBJS = $(PLUGIN).o femonosd.o femonreceiver.o femoncfg.o femontools.o femonmpeg.o femonac3.o femonaac.o femonlatm.o femonh264.o femonsymbol.o
### The main target: ### The main target:
all: libvdr-$(PLUGIN).so i18n all: $(SOFILE) i18n
### Implicit rules: ### Implicit rules:
%.o: %.c %.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $< $(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
### Dependencies: ### Dependencies:
MAKEDEP = $(CXX) -MM -MG MAKEDEP = $(CXX) -MM -MG
DEPFILE = .dependencies DEPFILE = .dependencies
$(DEPFILE): Makefile $(DEPFILE): Makefile
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@ @$(MAKEDEP) $(CXXFLAGS) $(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)
I18Nmsgs = $(addprefix $(LOCALEDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file)))))) I18Nmo = $(addsuffix .mo, $(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 --msgid-bugs-address='Rolf Ahrenberg' -o $@ $^ xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
%.po: $(I18Npot) %.po: $(I18Npot)
msgmerge -U --no-wrap --no-location --backup=none -q $@ $< msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
@touch $@ @touch $@
$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo $(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
@mkdir -p $(dir $@) install -D -m644 $< $@
cp $< $@
.PHONY: i18n .PHONY: i18n
i18n: $(I18Nmsgs) $(I18Npot) i18n: $(I18Nmo) $(I18Npot)
install-i18n: $(I18Nmsgs)
### Targets: ### Targets:
libvdr-$(PLUGIN).so: $(OBJS) $(SOFILE): $(OBJS)
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@ $(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
ifndef FEMON_DEBUG ifndef FEMON_DEBUG
@$(STRIP) $@ @$(STRIP) $@
endif endif
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
dist: clean install-lib: $(SOFILE)
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)
@@ -126,4 +140,9 @@ dist: clean
@echo Distribution package created as $(PACKAGE).tgz @echo Distribution package created as $(PACKAGE).tgz
clean: clean:
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ $(PODIR)/*.mo $(PODIR)/*.pot @-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
.PHONY: cppcheck
cppcheck:
@cppcheck --language=c++ --enable=all -v -f $(OBJS:%.o=%.c)

18
README
View File

@@ -32,15 +32,15 @@ Terminology:
-------------------------------------------------------------- --------------------------------------------------------------
|## Channel Name ################### [SVDRP][AR][VF][A/DD][D]| |## Channel Name ################### [SVDRP][AR][VF][A/DD][D]|
|[=====Signal Strength in % ==============|=================]| |[=====Signal Strength ===================|=================]|
|[=====Signal-to-Noise Ratio in % ========|=================]| |[=====Signal Quality ================|=====================]|
| STR: #0000 (0%) BER: #00000000 Video: 0 Mbit/s | | STR: #0000 (0%) BER: #00000000 Video: 0 Mbit/s |
| SNR: #0000 (0%) UNC: #00000000 Audio: 0 kbit/s | | SNR: #0000 (0%) UNC: #00000000 Audio: 0 kbit/s |
| [LOCK] [SIGNAL] [CARRIER] [VITERBI] [SYNC] | | [LOCK] [SIGNAL] [CARRIER] [VITERBI] [SYNC] |
-------------------------------------------------------------- --------------------------------------------------------------
STR - Signal strength STR - Signal strength from driver
SNR - Signal-to-noise ratio SNR - Signal-to-noise ratio from driver
BER - Bit error rate BER - Bit error rate
UNC - Uncorrected blocks UNC - Uncorrected blocks
Video - Calculated video bitrate in Mbit/s Video - Calculated video bitrate in Mbit/s
@@ -71,13 +71,8 @@ Left/Right - Switch to next/previous device that provides the current channel
Installation: Installation:
cd /put/your/path/here/VDR/PLUGINS/src
tar -xzf /put/your/path/here/vdr-femon-X.Y.Z.tgz tar -xzf /put/your/path/here/vdr-femon-X.Y.Z.tgz
ln -s femon-X.Y.Z femon make -C femon-X.Y.Z install
cd /put/your/path/here/VDR
make
make plugins
./vdr -P femon
Client-server architecture: Client-server architecture:
@@ -97,9 +92,6 @@ 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

114
femon.c
View File

@@ -7,18 +7,22 @@
#include <vdr/menu.h> #include <vdr/menu.h>
#include <vdr/remote.h> #include <vdr/remote.h>
#include <vdr/menu.h> #include <vdr/player.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 < 10713 #if defined(APIVERSNUM) && APIVERSNUM < 20000
#error "VDR-1.7.13 API version or greater is required!" #error "VDR-2.0.0 API version or greater is required!"
#endif #endif
static const char VERSION[] = "1.7.7"; #ifndef GITVERSION
#define GITVERSION ""
#endif
static const char VERSION[] = "2.0.4" 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");
@@ -97,7 +101,7 @@ cOsdObject *cPluginFemon::MainMenuAction(void)
{ {
// Perform the action when selected from the main VDR menu. // Perform the action when selected from the main VDR menu.
debug("%s()\n", __PRETTY_FUNCTION__); debug("%s()\n", __PRETTY_FUNCTION__);
if (cReplayControl::NowReplaying() || (Channels.Count() <= 0)) if (cControl::Control() || (Channels.Count() <= 0))
Skins.Message(mtInfo, tr("Femon not available")); Skins.Message(mtInfo, tr("Femon not available"));
else else
return cFemonOsd::Instance(true); return cFemonOsd::Instance(true);
@@ -132,14 +136,16 @@ 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 = reinterpret_cast<FemonService_v1_0*>(Data);
int ndx = cDevice::ActualDevice()->CardIndex(); if (!cDevice::ActualDevice())
data->fe_name = getFrontendName(ndx); return false;
data->fe_status = getFrontendStatus(ndx); cDvbDevice *dev = getDvbDevice(cDevice::ActualDevice());
data->fe_snr = getSNR(ndx); data->fe_name = getFrontendName(dev);
data->fe_signal = getSignal(ndx); data->fe_status = getFrontendStatus(dev);
data->fe_ber = getBER(ndx); data->fe_snr = getSNR(dev);
data->fe_unc = getUNC(ndx); data->fe_signal = getSignal(dev);
data->fe_ber = getBER(dev);
data->fe_unc = getUNC(dev);
data->video_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetVideoBitrate() : 0.0; data->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;
@@ -151,7 +157,7 @@ bool cPluginFemon::Service(const char *Id, void *Data)
} }
const char **cPluginFemon::SVDRPHelpPages(void) const char **cPluginFemon::SVDRPHelpPages(void)
{ {
static const char *HelpPages[] = { static const char *HelpPages[] = {
"OPEN\n" "OPEN\n"
" Open femon plugin.", " Open femon plugin.",
@@ -161,26 +167,30 @@ const char **cPluginFemon::SVDRPHelpPages(void)
" Switch to next possible device.", " Switch to next possible device.",
"PREV\n" "PREV\n"
" Switch to previous possible device.", " Switch to previous possible device.",
"INFO\n" "INFO <card index>\n"
" Print the current frontend information.", " Print the frontend information.",
"NAME\n" "NAME <card index>\n"
" Print the current frontend name.", " Print the frontend name.",
"STAT\n" "STAT <card index>\n"
" Print the current frontend status.", " Print the frontend status.",
"SGNL\n" "STRG <card index>\n"
" Print the current signal strength.", " Print the signal strength.",
"SNRA\n" "QUAL <card index>\n"
" Print the current signal-to-noise ratio.", " Print the signal quality.",
"BERA\n" "SGNL <card index>\n"
" Print the current bit error rate.", " Print the signal strength from driver.",
"UNCB\n" "SNRA <card index>\n"
" Print the current uncorrected blocks rate.", " Print the signal-to-noise ratio from driver.",
"BERA <card index>\n"
" Print the bit error rate.",
"UNCB <card index>\n"
" Print the uncorrected blocks rate.",
"VIBR\n" "VIBR\n"
" Print the actual device and current video bitrate [Mbit/s].", " Print the current video bitrate [Mbit/s].",
"AUBR\n" "AUBR\n"
" Print the actual device and current audio bitrate [kbit/s].", " Print the current audio bitrate [kbit/s].",
"DDBR\n" "DDBR\n"
" Print the actual device and current dolby bitrate [kbit/s].", " Print the current dolby bitrate [kbit/s].",
NULL NULL
}; };
return HelpPages; return HelpPages;
@@ -188,13 +198,19 @@ 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 (cReplayControl::NowReplaying() || !dev) {
ReplyCode = 550; // Requested action not taken
return cString("Cannot open femon plugin while replaying");
}
if (strcasecmp(Command, "OPEN") == 0) { if (strcasecmp(Command, "OPEN") == 0) {
if (cReplayControl::NowReplaying()) {
ReplyCode = 550; // Requested action not taken
return cString("Cannot open femon plugin while replaying");
}
if (!cFemonOsd::Instance()) if (!cFemonOsd::Instance())
cRemote::CallPlugin("femon"); cRemote::CallPlugin(Name());
return cString("Opening femon plugin"); return cString("Opening femon plugin");
} }
else if (strcasecmp(Command, "QUIT") == 0) { else if (strcasecmp(Command, "QUIT") == 0) {
@@ -215,27 +231,33 @@ cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int
return cString("Cannot switch device"); return cString("Cannot switch device");
} }
else if (strcasecmp(Command, "INFO") == 0) { else if (strcasecmp(Command, "INFO") == 0) {
return getFrontendInfo(cDevice::ActualDevice()->CardIndex()); return getFrontendInfo(dev);
} }
else if (strcasecmp(Command, "NAME") == 0) { else if (strcasecmp(Command, "NAME") == 0) {
return getFrontendName(cDevice::ActualDevice()->CardIndex()); return getFrontendName(dev);
} }
else if (strcasecmp(Command, "STAT") == 0) { else if (strcasecmp(Command, "STAT") == 0) {
return getFrontendStatus(cDevice::ActualDevice()->CardIndex()); return getFrontendStatus(dev);
}
else if (strcasecmp(Command, "STRG") == 0) {
return cString::sprintf("%d on device #%d", dev->SignalStrength(), dev->CardIndex());
}
else if (strcasecmp(Command, "QUAL") == 0) {
return cString::sprintf("%d on device #%d", dev->SignalQuality(), dev->CardIndex());
} }
else if (strcasecmp(Command, "SGNL") == 0) { else if (strcasecmp(Command, "SGNL") == 0) {
int value = getSignal(cDevice::ActualDevice()->CardIndex()); int value = getSignal(dev);
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, cDevice::ActualDevice()->CardIndex()); return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, dev->CardIndex());
} }
else if (strcasecmp(Command, "SNRA") == 0) { else if (strcasecmp(Command, "SNRA") == 0) {
int value = getSNR(cDevice::ActualDevice()->CardIndex()); int value = getSNR(dev);
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, cDevice::ActualDevice()->CardIndex()); return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, dev->CardIndex());
} }
else if (strcasecmp(Command, "BERA") == 0) { else if (strcasecmp(Command, "BERA") == 0) {
return cString::sprintf("%08X on device #%d", getBER(cDevice::ActualDevice()->CardIndex()), cDevice::ActualDevice()->CardIndex()); return cString::sprintf("%08X on device #%d", getBER(dev), dev->CardIndex());
} }
else if (strcasecmp(Command, "UNCB") == 0) { else if (strcasecmp(Command, "UNCB") == 0) {
return cString::sprintf("%08X on device #%d", getUNC(cDevice::ActualDevice()->CardIndex()), cDevice::ActualDevice()->CardIndex()); return cString::sprintf("%08X on device #%d", getUNC(dev), dev->CardIndex());
} }
else if (strcasecmp(Command, "VIBR") == 0) { else if (strcasecmp(Command, "VIBR") == 0) {
if (cFemonOsd::Instance()) if (cFemonOsd::Instance())
@@ -293,8 +315,10 @@ 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;
SetMenuCategory(mcSetupPlugins);
Setup(); Setup();
} }

View File

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

View File

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

View File

@@ -9,17 +9,17 @@
#include "femontools.h" #include "femontools.h"
#include "femonac3.h" #include "femonac3.h"
unsigned int cFemonAC3::s_Bitrates[32] = int cFemonAC3::s_Bitrates[32] =
{ {
32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 576, 640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 576, 640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
}; };
unsigned int cFemonAC3::s_Frequencies[4] = int cFemonAC3::s_Frequencies[4] =
{ {
480, 441, 320, 0 480, 441, 320, 0
}; };
unsigned int cFemonAC3::s_Frames[3][32] = int cFemonAC3::s_Frames[3][32] =
{ {
{64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 640, 768, 896, 1024, 1152, 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 640, 768, 896, 1024, 1152, 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{69, 87, 104, 121, 139, 174, 208, 243, 278, 348, 417, 487, 557, 696, 835, 975, 1114, 1253, 1393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, {69, 87, 104, 121, 139, 174, 208, 243, 278, 348, 417, 487, 557, 696, 835, 975, 1114, 1253, 1393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
@@ -41,7 +41,7 @@ bool cFemonAC3::processAudio(const uint8_t *buf, int len)
int centermixlevel = AUDIO_CENTER_MIX_LEVEL_INVALID; int centermixlevel = AUDIO_CENTER_MIX_LEVEL_INVALID;
int surroundmixlevel = AUDIO_SURROUND_MIX_LEVEL_INVALID; int surroundmixlevel = AUDIO_SURROUND_MIX_LEVEL_INVALID;
int dolbysurroundmode = AUDIO_DOLBY_SURROUND_MODE_INVALID; int dolbysurroundmode = AUDIO_DOLBY_SURROUND_MODE_INVALID;
cBitStream bs(buf, len * 8); cFemonBitStream bs(buf, len * 8);
if (!m_AudioHandler) if (!m_AudioHandler)
return false; return false;
@@ -49,34 +49,34 @@ bool cFemonAC3::processAudio(const uint8_t *buf, int len)
// skip PES header // skip PES header
if (!PesLongEnough(len)) if (!PesLongEnough(len))
return false; return false;
bs.skipBits(8 * PesPayloadOffset(buf)); bs.SkipBits(8 * PesPayloadOffset(buf));
// http://rmworkshop.com/dvd_info/related_info/ac3hdr.htm // http://rmworkshop.com/dvd_info/related_info/ac3hdr.htm
// AC3 audio detection // AC3 audio detection
if (bs.getU16() != 0x0B77) // syncword if (bs.GetBits(16) != 0x0B77) // syncword
return false; return false;
bs.skipBits(16); // CRC1 bs.SkipBits(16); // CRC1
fscod = bs.getBits(2); // sampling rate values fscod = bs.GetBits(2); // sampling rate values
frmsizcod = bs.getBits(6); // frame size code frmsizcod = bs.GetBits(6); // frame size code
bs.skipBits(5); // bitstream id bs.SkipBits(5); // bitstream id
bsmod = bs.getBits(3); // bitstream mode bsmod = bs.GetBits(3); // bitstream mode
acmod = bs.getBits(3); // audio coding mode acmod = bs.GetBits(3); // audio coding mode
// 3 front channels // 3 front channels
if ((acmod & 0x01) && (acmod != 0x01)) if ((acmod & 0x01) && (acmod != 0x01))
centermixlevel = bs.getBits(2); centermixlevel = bs.GetBits(2);
// if a surround channel exists // if a surround channel exists
if (acmod & 0x04) if (acmod & 0x04)
surroundmixlevel = bs.getBits(2); surroundmixlevel = bs.GetBits(2);
// if in 2/0 mode // if in 2/0 mode
if (acmod == 0x02) if (acmod == 0x02)
dolbysurroundmode = bs.getBits(2); dolbysurroundmode = bs.GetBits(2);
m_AudioHandler->SetAC3Bitrate(1000 * s_Bitrates[frmsizcod >> 1]); m_AudioHandler->SetAC3Bitrate(1000 * s_Bitrates[frmsizcod >> 1]);
m_AudioHandler->SetAC3SamplingFrequency(100 * s_Frequencies[fscod]); m_AudioHandler->SetAC3SamplingFrequency(100 * s_Frequencies[fscod]);
@@ -86,8 +86,8 @@ bool cFemonAC3::processAudio(const uint8_t *buf, int len)
m_AudioHandler->SetAC3SurroundMix(surroundmixlevel); m_AudioHandler->SetAC3SurroundMix(surroundmixlevel);
m_AudioHandler->SetAC3DolbySurround(dolbysurroundmode); m_AudioHandler->SetAC3DolbySurround(dolbysurroundmode);
m_AudioHandler->SetAC3LFE(bs.getBit()); // low frequency effects on m_AudioHandler->SetAC3LFE(bs.GetBit()); // low frequency effects on
m_AudioHandler->SetAC3Dialog(bs.getBits(5)); // dialog normalization m_AudioHandler->SetAC3Dialog(bs.GetBits(5)); // dialog normalization
return true; return true;
} }

View File

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

View File

@@ -17,7 +17,8 @@ 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 {

View File

@@ -24,7 +24,7 @@ cFemonConfig::cFemonConfig(void)
analyzestream = 1; analyzestream = 1;
calcinterval = 20; calcinterval = 20;
usesvdrp = 0; usesvdrp = 0;
svdrpport = 2001; svdrpport = 6419;
strncpy(svdrpip, "0.0.0.0", sizeof(svdrpip)); strncpy(svdrpip, "0.0.0.0", sizeof(svdrpip));
} }
@@ -138,4 +138,16 @@ 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

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

Binary file not shown.

View File

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

112
femonlatm.c Normal file
View File

@@ -0,0 +1,112 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#include "femontools.h"
#include "femonlatm.h"
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;
}

27
femonlatm.h Normal file
View File

@@ -0,0 +1,27 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONLATM_H
#define __FEMONLATM_H
#include "femonaudio.h"
class cFemonLATM {
private:
cFemonAudioIf *m_AudioHandler;
static 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

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

View File

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

View File

@@ -6,11 +6,12 @@
*/ */
#ifndef __STDC_FORMAT_MACROS #ifndef __STDC_FORMAT_MACROS
#define __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS
#endif #endif
#include <ctype.h> #include <ctype.h>
#include <math.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"
@@ -25,8 +26,9 @@
#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 OSDSPACING 5 #define OSDSYMBOL(id) femonSymbols.Get(id)
#define OSDROUNDING 10 #define OSDSPACING femonSymbols.GetSpacing()
#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 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)
@@ -144,6 +146,7 @@ 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;
@@ -169,6 +172,10 @@ cFemonOsd::cFemonOsd()
m_SvdrpPlugin(NULL), m_SvdrpPlugin(NULL),
m_Number(0), m_Number(0),
m_OldNumber(0), m_OldNumber(0),
m_Quality(0),
m_QualityValid(false),
m_Strength(0),
m_StrengthValid(false),
m_SNR(0), m_SNR(0),
m_SNRValid(false), m_SNRValid(false),
m_Signal(0), m_Signal(0),
@@ -177,7 +184,9 @@ cFemonOsd::cFemonOsd()
m_BERValid(false), m_BERValid(false),
m_UNC(0), m_UNC(0),
m_UNCValid(false), m_UNCValid(false),
m_FrontendName(""),
m_FrontendStatusValid(false), m_FrontendStatusValid(false),
m_DeviceSource(DEVICESOURCE_DVBAPI),
m_DisplayMode(femonConfig.displaymode), m_DisplayMode(femonConfig.displaymode),
m_OsdWidth(cOsd::OsdWidth() * (100 - femonConfig.downscale) / 100), m_OsdWidth(cOsd::OsdWidth() * (100 - femonConfig.downscale) / 100),
m_OsdHeight(cOsd::OsdHeight() * (100 - femonConfig.downscale) / 100), m_OsdHeight(cOsd::OsdHeight() * (100 - femonConfig.downscale) / 100),
@@ -192,12 +201,13 @@ cFemonOsd::cFemonOsd()
memset(&m_FrontendStatus, 0, sizeof(m_FrontendStatus)); memset(&m_FrontendStatus, 0, sizeof(m_FrontendStatus));
memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo)); memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo));
m_SvdrpConnection.handle = -1; m_SvdrpConnection.handle = -1;
m_Font = cFont::CreateFont(Setup.FontSml, min(max(Setup.FontSmlSize, MINFONTSIZE), MAXFONTSIZE)); femonSymbols.Refresh();
m_Font = cFont::CreateFont(Setup.FontSml, constrain(Setup.FontSmlSize, MINFONTSIZE, MAXFONTSIZE));
if (!m_Font || !m_Font->Height()) { if (!m_Font || !m_Font->Height()) {
m_Font = new cFemonDummyFont; m_Font = new cFemonDummyFont;
error("cFemonOsd::cFemonOsd() cannot create required font."); error("cFemonOsd::cFemonOsd() cannot create required font.");
} }
tmp = 5 * bmSymbol[SYMBOL_LOCK].Width() + 6 * OSDSPACING; tmp = 5 * OSDSYMBOL(SYMBOL_LOCK).Width() + 6 * OSDSPACING;
if (OSDWIDTH < tmp) { if (OSDWIDTH < tmp) {
error("cFemonOsd::cFemonOsd() OSD width (%d) smaller than required (%d).", OSDWIDTH, tmp); error("cFemonOsd::cFemonOsd() OSD width (%d) smaller than required (%d).", OSDWIDTH, tmp);
OSDWIDTH = tmp; OSDWIDTH = tmp;
@@ -238,102 +248,123 @@ cFemonOsd::~cFemonOsd(void)
void cFemonOsd::DrawStatusWindow(void) void cFemonOsd::DrawStatusWindow(void)
{ {
cMutexLock lock(&m_Mutex); cMutexLock lock(&m_Mutex);
cBitmap *bm = NULL;
int offset = 0;
int x = OSDWIDTH - OSDROUNDING;
int y = 0;
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (m_Osd && channel) { if (m_Osd && channel) {
cBitmap *bm = NULL;
int offset = 0;
int x = OSDWIDTH - OSDROUNDING;
int y = 0;
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
OSDDRAWSTATUSTITLEBAR(*cString::sprintf("%d%s %s", m_Number ? m_Number : channel->Number(), m_Number ? "-" : "", channel->ShortName(true))); OSDDRAWSTATUSTITLEBAR(*cString::sprintf("%d%s %s", m_Number ? m_Number : channel->Number(), m_Number ? "-" : "", channel->ShortName(true)));
if (m_SvdrpFrontend >= 0) { if (m_SvdrpFrontend >= 0) {
bm = &bmSymbol[SYMBOL_SVDRP]; bm = &OSDSYMBOL(SYMBOL_SVDRP);
OSDDRAWSTATUSBM(OSDSPACING); OSDDRAWSTATUSBM(OSDSPACING);
} }
switch (cDevice::ActualDevice()->CardIndex()) { switch (cDevice::ActualDevice()->CardIndex()) {
case 1: bm = &bmSymbol[SYMBOL_ONE]; break; case 1: bm = &OSDSYMBOL(SYMBOL_ONE); break;
case 2: bm = &bmSymbol[SYMBOL_TWO]; break; case 2: bm = &OSDSYMBOL(SYMBOL_TWO); break;
case 3: bm = &bmSymbol[SYMBOL_THREE]; break; case 3: bm = &OSDSYMBOL(SYMBOL_THREE); break;
case 4: bm = &bmSymbol[SYMBOL_FOUR]; break; case 4: bm = &OSDSYMBOL(SYMBOL_FOUR); break;
case 5: bm = &bmSymbol[SYMBOL_FIVE]; break; case 5: bm = &OSDSYMBOL(SYMBOL_FIVE); break;
case 6: bm = &bmSymbol[SYMBOL_SIX]; break; case 6: bm = &OSDSYMBOL(SYMBOL_SIX); break;
case 7: bm = &bmSymbol[SYMBOL_SEVEN]; break; case 7: bm = &OSDSYMBOL(SYMBOL_SEVEN); break;
case 8: bm = &bmSymbol[SYMBOL_EIGHT]; 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 = &bmSymbol[SYMBOL_DEVICE]; bm = &OSDSYMBOL(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 = &bmSymbol[SYMBOL_ONE]; break; case 1: bm = &OSDSYMBOL(SYMBOL_ONE); break;
case 2: bm = &bmSymbol[SYMBOL_TWO]; break; case 2: bm = &OSDSYMBOL(SYMBOL_TWO); break;
case 3: bm = &bmSymbol[SYMBOL_THREE]; break; case 3: bm = &OSDSYMBOL(SYMBOL_THREE); break;
case 4: bm = &bmSymbol[SYMBOL_FOUR]; break; case 4: bm = &OSDSYMBOL(SYMBOL_FOUR); break;
case 5: bm = &bmSymbol[SYMBOL_FIVE]; break; case 5: bm = &OSDSYMBOL(SYMBOL_FIVE); break;
case 6: bm = &bmSymbol[SYMBOL_SIX]; break; case 6: bm = &OSDSYMBOL(SYMBOL_SIX); break;
case 7: bm = &bmSymbol[SYMBOL_SEVEN]; break; case 7: bm = &OSDSYMBOL(SYMBOL_SEVEN); break;
case 8: bm = &bmSymbol[SYMBOL_EIGHT]; 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 = &bmSymbol[SYMBOL_MONO_LEFT]; break; case 1: bm = &OSDSYMBOL(SYMBOL_MONO_LEFT); break;
case 2: bm = &bmSymbol[SYMBOL_MONO_RIGHT]; break; case 2: bm = &OSDSYMBOL(SYMBOL_MONO_RIGHT); break;
default: bm = &bmSymbol[SYMBOL_STEREO]; break; default: bm = &OSDSYMBOL(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 = &bmSymbol[SYMBOL_DD51]; if (m_Receiver->AC3_5_1()) bm = &OSDSYMBOL(SYMBOL_DD51);
else if (m_Receiver->AC3_2_0()) bm = &bmSymbol[SYMBOL_DD20]; else if (m_Receiver->AC3_2_0()) bm = &OSDSYMBOL(SYMBOL_DD20);
else bm = &bmSymbol[SYMBOL_DD]; else bm = &OSDSYMBOL(SYMBOL_DD);
OSDDRAWSTATUSBM(OSDSPACING); OSDDRAWSTATUSBM(OSDSPACING);
} }
if (m_Receiver) { if (m_Receiver) {
if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 1080)) if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 1080)) {
bm = &bmSymbol[SYMBOL_FORMAT_1080]; switch (m_Receiver->VideoScan()) {
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 720)) case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080i); break;
bm = &bmSymbol[SYMBOL_FORMAT_720]; case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080p); break;
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 576)) default: bm = &OSDSYMBOL(SYMBOL_FORMAT_1080); break;
bm = &bmSymbol[SYMBOL_FORMAT_576]; }
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 480)) }
bm = &bmSymbol[SYMBOL_FORMAT_480]; else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 720)) {
switch (m_Receiver->VideoScan()) {
case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_720i); break;
case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_720p); break;
default: bm = &OSDSYMBOL(SYMBOL_FORMAT_720); break;
}
}
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 576)) {
switch (m_Receiver->VideoScan()) {
case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_576i); break;
case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_576p); break;
default: bm = &OSDSYMBOL(SYMBOL_FORMAT_576); break;
}
}
else if (IS_OSDRESOLUTION(m_Receiver->VideoVerticalSize(), 480)) {
switch (m_Receiver->VideoScan()) {
case VIDEO_SCAN_INTERLACED: bm = &OSDSYMBOL(SYMBOL_FORMAT_480i); break;
case VIDEO_SCAN_PROGRESSIVE: bm = &OSDSYMBOL(SYMBOL_FORMAT_480p); break;
default: bm = &OSDSYMBOL(SYMBOL_FORMAT_480); break;
}
}
else else
bm = NULL; bm = NULL;
OSDDRAWSTATUSBM(OSDSPACING); OSDDRAWSTATUSBM(OSDSPACING);
switch (m_Receiver->VideoCodec()) { switch (m_Receiver->VideoCodec()) {
case VIDEO_CODEC_MPEG2: bm = &bmSymbol[SYMBOL_MPEG2]; break; case VIDEO_CODEC_MPEG2: bm = &OSDSYMBOL(SYMBOL_MPEG2); break;
case VIDEO_CODEC_H264: bm = &bmSymbol[SYMBOL_H264]; break; case VIDEO_CODEC_H264: bm = &OSDSYMBOL(SYMBOL_H264); break;
default: bm = NULL; break; default: bm = NULL; break;
} }
OSDDRAWSTATUSBM(OSDSPACING); OSDDRAWSTATUSBM(OSDSPACING);
switch (m_Receiver->VideoFormat()) { switch (m_Receiver->VideoFormat()) {
case VIDEO_FORMAT_PAL: bm = &bmSymbol[SYMBOL_PAL]; break; case VIDEO_FORMAT_PAL: bm = &OSDSYMBOL(SYMBOL_PAL); break;
case VIDEO_FORMAT_NTSC: bm = &bmSymbol[SYMBOL_NTSC]; 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->VideoAspectRatio()) { switch (m_Receiver->VideoAspectRatio()) {
case VIDEO_ASPECT_RATIO_1_1: bm = &bmSymbol[SYMBOL_AR_1_1]; break; case VIDEO_ASPECT_RATIO_1_1: bm = &OSDSYMBOL(SYMBOL_AR_1_1); break;
case VIDEO_ASPECT_RATIO_4_3: bm = &bmSymbol[SYMBOL_AR_4_3]; break; case VIDEO_ASPECT_RATIO_4_3: bm = &OSDSYMBOL(SYMBOL_AR_4_3); break;
case VIDEO_ASPECT_RATIO_16_9: bm = &bmSymbol[SYMBOL_AR_16_9]; break; case VIDEO_ASPECT_RATIO_16_9: bm = &OSDSYMBOL(SYMBOL_AR_16_9); break;
case VIDEO_ASPECT_RATIO_2_21_1: bm = &bmSymbol[SYMBOL_AR_2_21_1]; break; case VIDEO_ASPECT_RATIO_2_21_1: bm = &OSDSYMBOL(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 = &bmSymbol[SYMBOL_ENCRYPTED]; bm = &OSDSYMBOL(SYMBOL_ENCRYPTED);
OSDDRAWSTATUSBM(OSDSPACING); OSDDRAWSTATUSBM(OSDSPACING);
} }
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
if (m_SignalValid) if (m_StrengthValid)
OSDDRAWSTATUSBAR(m_Signal / 655); OSDDRAWSTATUSBAR(m_Strength);
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
if (m_SNRValid) if (m_QualityValid)
OSDDRAWSTATUSBAR(m_SNR / 655); OSDDRAWSTATUSBAR(m_Quality);
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWSTATUSVALUES("STR:", m_SignalValid ? *cString::sprintf("%04x", m_Signal) : "", m_SignalValid ? *cString::sprintf("(%2d%%)", m_Signal / 655) : "", OSDDRAWSTATUSVALUES("STR:", m_SignalValid ? *cString::sprintf("%04x", m_Signal) : "", m_SignalValid ? *cString::sprintf("(%2d%%)", m_Signal / 655) : "",
"BER:", m_BERValid ? *cString::sprintf("%08x", m_BER) : "", *cString::sprintf("%s:", tr("Video")), "BER:", m_BERValid ? *cString::sprintf("%08x", m_BER) : "", *cString::sprintf("%s:", tr("Video")),
@@ -344,14 +375,14 @@ void cFemonOsd::DrawStatusWindow(void)
*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 = bmSymbol[SYMBOL_LOCK].Width(); x = OSDSYMBOL(SYMBOL_LOCK).Width();
y = (OSDROWHEIGHT - bmSymbol[SYMBOL_LOCK].Height()) / 2; y = (OSDROWHEIGHT - OSDSYMBOL(SYMBOL_LOCK).Height()) / 2;
if (m_FrontendStatusValid) { 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();
@@ -361,12 +392,12 @@ 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) {
cDvbTransponderParameters dtp(channel->Parameters()); 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"));
@@ -389,8 +420,9 @@ 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: {
OSDDRAWINFOLINE(*cString::sprintf("DVB-S%s #%d - %s", (m_FrontendInfo.caps & 0x10000000) ? "2" : "", (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name)); cDvbTransponderParameters dtp(channel->Parameters());
OSDDRAWINFOLINE(*cString::sprintf("%s #%d - %s", *getSatelliteSystem(dtp.System()), (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), *m_FrontendName));
offset += OSDROWHEIGHT; 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()));
@@ -401,12 +433,16 @@ void cFemonOsd::DrawInfoWindow(void)
OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(dtp.Inversion())); OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(dtp.Inversion()));
OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(dtp.CoderateH())); OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(dtp.CoderateH()));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("System"), *getSystem(dtp.System())); OSDDRAWINFOLEFT( trVDR("System"), *getSatelliteSystem(dtp.System()));
OSDDRAWINFORIGHT(trVDR("RollOff"), *getRollOff(dtp.RollOff())); if (dtp.System()) {
OSDDRAWINFORIGHT(trVDR("RollOff"), *getRollOff(dtp.RollOff()));
}
}
break; break;
case cSource::stCable: case cSource::stCable: {
OSDDRAWINFOLINE(*cString::sprintf("DVB-C #%d - %s", (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name)); cDvbTransponderParameters dtp(channel->Parameters());
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()));
@@ -416,10 +452,12 @@ void cFemonOsd::DrawInfoWindow(void)
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(dtp.Inversion())); OSDDRAWINFOLEFT( trVDR("Inversion"), *getInversion(dtp.Inversion()));
OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(dtp.CoderateH())); OSDDRAWINFORIGHT(trVDR("CoderateH"), *getCoderate(dtp.CoderateH()));
}
break; break;
case cSource::stTerr: case cSource::stTerr: {
OSDDRAWINFOLINE(*cString::sprintf("DVB-T #%d - %s", (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name)); cDvbTransponderParameters dtp(channel->Parameters());
OSDDRAWINFOLINE(*cString::sprintf("%s #%d - %s", *getTerrestrialSystem(dtp.System()), (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), *m_FrontendName));
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency())); OSDDRAWINFOLEFT( trVDR("Frequency"), *getFrequencyMHz(channel->Frequency()));
OSDDRAWINFORIGHT(trVDR("Transmission"), *getTransmission(dtp.Transmission())); OSDDRAWINFORIGHT(trVDR("Transmission"), *getTransmission(dtp.Transmission()));
@@ -432,6 +470,29 @@ void cFemonOsd::DrawInfoWindow(void)
offset += OSDROWHEIGHT; offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("Hierarchy"), *getHierarchy(dtp.Hierarchy())); OSDDRAWINFOLEFT( trVDR("Hierarchy"), *getHierarchy(dtp.Hierarchy()));
OSDDRAWINFORIGHT(trVDR("Guard"), *getGuard(dtp.Guard())); OSDDRAWINFORIGHT(trVDR("Guard"), *getGuard(dtp.Guard()));
offset += OSDROWHEIGHT;
OSDDRAWINFOLEFT( trVDR("System"), *getTerrestrialSystem(dtp.System()));
if (dtp.System()) {
OSDDRAWINFORIGHT(trVDR("StreamId"), *cString::sprintf("%d", dtp.StreamId()));
}
}
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);
}
}
}
break; break;
default: default:
@@ -515,62 +576,131 @@ void cFemonOsd::Action(void)
m_SvdrpFrontend = -1; m_SvdrpFrontend = -1;
m_SvdrpVideoBitrate = -1.0; m_SvdrpVideoBitrate = -1.0;
m_SvdrpAudioBitrate = -1.0; m_SvdrpAudioBitrate = -1.0;
if (m_Frontend != -1) { switch (m_DeviceSource) {
m_FrontendStatusValid = (ioctl(m_Frontend, FE_READ_STATUS, &m_FrontendStatus) >= 0); case DEVICESOURCE_PVRINPUT:
m_SignalValid = (ioctl(m_Frontend, FE_READ_SIGNAL_STRENGTH, &m_Signal) >= 0); m_Quality = cDevice::ActualDevice()->SignalStrength();
m_SNRValid = (ioctl(m_Frontend, FE_READ_SNR, &m_SNR) >= 0); m_QualityValid = (m_Quality >= 0);
m_BERValid = (ioctl(m_Frontend, FE_READ_BER, &m_BER) >= 0); m_Strength = cDevice::ActualDevice()->SignalStrength();
m_UNCValid = (ioctl(m_Frontend, FE_READ_UNCORRECTED_BLOCKS, &m_UNC) >= 0); m_StrengthValid = (m_Strength >= 0);
DrawInfoWindow(); m_FrontendName = cDevice::ActualDevice()->DeviceName();
DrawStatusWindow(); m_FrontendStatus = (fe_status_t)(m_StrengthValid ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0);
} m_FrontendStatusValid = m_StrengthValid;
else if (m_SvdrpConnection.handle >= 0) { m_Signal = uint16_t(m_Strength * 0xFFFF / 100);
cmd.handle = m_SvdrpConnection.handle; m_SignalValid = m_StrengthValid;
m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd); m_SNR = 0;
if (cmd.responseCode == 900) { m_SNRValid = false;
m_FrontendStatusValid = false; m_BER = 0;
m_SignalValid = false; m_BERValid = false;
m_SNRValid = false; m_UNC = 0;
m_BERValid = false; m_UNCValid = false;
m_UNCValid = false; break;
for (cLine *line = cmd.reply.First(); line; line = cmd.reply.Next(line)) { case DEVICESOURCE_IPTV:
const char *s = line->Text(); m_Quality = cDevice::ActualDevice()->SignalQuality();
if (!strncasecmp(s, "CARD:", 5)) m_QualityValid = (m_Quality >= 0);
m_SvdrpFrontend = (int)strtol(s + 5, NULL, 10); m_Strength = cDevice::ActualDevice()->SignalStrength();
else if (!strncasecmp(s, "TYPE:", 5)) m_StrengthValid = (m_Strength >= 0);
m_FrontendInfo.type = (fe_type_t)strtol(s + 5, NULL, 10); m_FrontendName = cDevice::ActualDevice()->DeviceName();
else if (!strncasecmp(s, "NAME:", 5)) { m_FrontendStatus = (fe_status_t)(m_StrengthValid ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0);
strn0cpy(m_FrontendInfo.name, s + 5, sizeof(m_FrontendInfo.name)); m_FrontendStatusValid = m_StrengthValid;
} m_Signal = uint16_t(m_Strength * 0xFFFF / 100);
else if (!strncasecmp(s, "STAT:", 5)) { m_SignalValid = m_StrengthValid;
m_FrontendStatus = (fe_status_t)strtol(s + 5, NULL, 16); m_SNR = uint16_t(m_Quality * 0xFFFF / 100);
m_FrontendStatusValid = true; m_SNRValid = m_QualityValid;
} m_BER = 0;
else if (!strncasecmp(s, "SGNL:", 5)) { m_BERValid = false;
m_Signal = (uint16_t)strtol(s + 5, NULL, 16); m_UNC = 0;
m_SignalValid = true; m_UNCValid = false;
} break;
else if (!strncasecmp(s, "SNRA:", 5)) { default:
m_SNR = (uint16_t)strtol(s + 5, NULL, 16); case DEVICESOURCE_DVBAPI:
m_SNRValid = true; if (m_Frontend != -1) {
} m_Quality = cDevice::ActualDevice()->SignalQuality();
else if (!strncasecmp(s, "BERA:", 5)) { m_QualityValid = (m_Quality >= 0);
m_BER = (uint32_t)strtol(s + 5, NULL, 16); m_Strength = cDevice::ActualDevice()->SignalStrength();
m_BERValid = true; m_StrengthValid = (m_Strength >= 0);
} m_FrontendName = cDevice::ActualDevice()->DeviceName();
else if (!strncasecmp(s, "UNCB:", 5)) { m_FrontendStatusValid = (ioctl(m_Frontend, FE_READ_STATUS, &m_FrontendStatus) >= 0);
m_UNC = (uint32_t)strtol(s + 5, NULL, 16); m_SignalValid = (ioctl(m_Frontend, FE_READ_SIGNAL_STRENGTH, &m_Signal) >= 0);
m_UNCValid = true; m_SNRValid = (ioctl(m_Frontend, FE_READ_SNR, &m_SNR) >= 0);
} m_BERValid = (ioctl(m_Frontend, FE_READ_BER, &m_BER) >= 0);
else if (!strncasecmp(s, "VIBR:", 5)) m_UNCValid = (ioctl(m_Frontend, FE_READ_UNCORRECTED_BLOCKS, &m_UNC) >= 0);
m_SvdrpVideoBitrate = (double)strtol(s + 5, NULL, 10);
else if (!strncasecmp(s, "AUBR:", 5))
m_SvdrpAudioBitrate = (double)strtol(s + 5, NULL, 10);
} }
} else if (strstr(*cDevice::ActualDevice()->DeviceType(), SATIP_DEVICE)) {
DrawInfoWindow(); m_Quality = cDevice::ActualDevice()->SignalQuality();
DrawStatusWindow(); m_QualityValid = (m_Quality >= 0);
} m_Strength = cDevice::ActualDevice()->SignalStrength();
m_StrengthValid = (m_Strength >= 0);
m_FrontendName = cDevice::ActualDevice()->DeviceName();
m_FrontendStatus = (fe_status_t)(cDevice::ActualDevice()->HasLock() ? (FE_HAS_LOCK | FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | FE_HAS_SYNC) : 0);
m_FrontendStatusValid = m_StrengthValid;
m_Signal = uint16_t(m_Strength * 0xFFFF / 100);
m_SignalValid = m_StrengthValid;
m_SNR = uint16_t(m_Quality * 0xFFFF / 100);
m_SNRValid = m_QualityValid;
m_BER = 0;
m_BERValid = false;
m_UNC = 0;
m_UNCValid = false;
}
else if (m_SvdrpConnection.handle >= 0) {
cmd.handle = m_SvdrpConnection.handle;
m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd);
if (cmd.responseCode == 900) {
m_StrengthValid = false;
m_QualityValid = false;
m_FrontendStatusValid = false;
m_SignalValid = false;
m_SNRValid = false;
m_BERValid = false;
m_UNCValid = false;
for (cLine *line = cmd.reply.First(); line; line = cmd.reply.Next(line)) {
const char *s = line->Text();
if (!strncasecmp(s, "CARD:", 5))
m_SvdrpFrontend = (int)strtol(s + 5, NULL, 10);
else if (!strncasecmp(s, "STRG:", 5)) {
m_Strength = (int)strtol(s + 5, NULL, 10);
m_StrengthValid = (m_Strength >= 0);
}
else if (!strncasecmp(s, "QUAL:", 5)) {
m_Quality = (int)strtol(s + 5, NULL, 10);
m_QualityValid = (m_Quality >= 0);
}
else if (!strncasecmp(s, "TYPE:", 5))
m_FrontendInfo.type = (fe_type_t)strtol(s + 5, NULL, 10);
else if (!strncasecmp(s, "NAME:", 5)) {
m_FrontendName = s + 5;
}
else if (!strncasecmp(s, "STAT:", 5)) {
m_FrontendStatus = (fe_status_t)strtol(s + 5, NULL, 16);
m_FrontendStatusValid = true;
}
else if (!strncasecmp(s, "SGNL:", 5)) {
m_Signal = (uint16_t)strtol(s + 5, NULL, 16);
m_SignalValid = true;
}
else if (!strncasecmp(s, "SNRA:", 5)) {
m_SNR = (uint16_t)strtol(s + 5, NULL, 16);
m_SNRValid = true;
}
else if (!strncasecmp(s, "BERA:", 5)) {
m_BER = (uint32_t)strtol(s + 5, NULL, 16);
m_BERValid = true;
}
else if (!strncasecmp(s, "UNCB:", 5)) {
m_UNC = (uint32_t)strtol(s + 5, NULL, 16);
m_UNCValid = true;
}
else if (!strncasecmp(s, "VIBR:", 5))
m_SvdrpVideoBitrate = (double)strtol(s + 5, NULL, 10);
else if (!strncasecmp(s, "AUBR:", 5))
m_SvdrpAudioBitrate = (double)strtol(s + 5, NULL, 10);
}
}
}
break;
}
DrawInfoWindow();
DrawStatusWindow();
m_Sleep.Wait(max((int)(100 * femonConfig.updateinterval - t.Elapsed()), 3)); m_Sleep.Wait(max((int)(100 * femonConfig.updateinterval - t.Elapsed()), 3));
} }
} }
@@ -579,26 +709,43 @@ void cFemonOsd::Show(void)
{ {
debug("%s()\n", __PRETTY_FUNCTION__); debug("%s()\n", __PRETTY_FUNCTION__);
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
cString dev = cString::sprintf(FRONTEND_DEVICE, cDevice::ActualDevice()->CardIndex(), 0); const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
m_Frontend = open(dev, O_RDONLY | O_NONBLOCK);
if (m_Frontend >= 0) { m_DeviceSource = DEVICESOURCE_DVBAPI;
if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) { if (channel) {
if (!femonConfig.usesvdrp) if (channel->IsSourceType('I'))
error("cFemonOsd::Show() cannot read frontend info."); m_DeviceSource = DEVICESOURCE_IPTV;
close(m_Frontend); else if (channel->IsSourceType('V'))
m_Frontend = -1; m_DeviceSource = DEVICESOURCE_PVRINPUT;
memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo)); }
if (m_DeviceSource == DEVICESOURCE_DVBAPI) {
cDvbDevice *dev = 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 (strstr(*cDevice::ActualDevice()->DeviceType(), SATIP_DEVICE)) {
// nop
}
else if (femonConfig.usesvdrp) {
if (!SvdrpConnect() || !SvdrpTune())
return;
}
else {
error("cFemonOsd::Show() cannot open frontend device.");
return; return;
} }
} }
else if (femonConfig.usesvdrp) { else
if (!SvdrpConnect() || !SvdrpTune()) m_Frontend = -1;
return;
}
else {
error("cFemonOsd::Show() cannot open frontend device.");
return;
}
m_Osd = cOsdProvider::NewOsd(m_OsdLeft, m_OsdTop); m_Osd = cOsdProvider::NewOsd(m_OsdLeft, m_OsdTop);
if (m_Osd) { if (m_Osd) {
@@ -619,55 +766,69 @@ void cFemonOsd::Show(void)
m_Receiver->Deactivate(); m_Receiver->Deactivate();
DELETENULL(m_Receiver); DELETENULL(m_Receiver);
} }
if (femonConfig.analyzestream) { if (femonConfig.analyzestream && channel) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); m_Receiver = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0);
if (channel) { cDevice::ActualDevice()->AttachReceiver(m_Receiver);
m_Receiver = new cFemonReceiver(channel->Vtype(), channel->Vpid(), channel->Apid(IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0), channel->Dpid(IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0));
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
} }
Start(); Start();
} }
} }
void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber) void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber, bool liveView)
{ {
debug("%s(%d,%d)\n", __PRETTY_FUNCTION__, device->DeviceNumber(), channelNumber); debug("%s(%d,%d)\n", __PRETTY_FUNCTION__, device->DeviceNumber(), channelNumber);
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack(); eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
if (!device->IsPrimaryDevice() || !channelNumber || cDevice::PrimaryDevice()->CurrentChannel() != channelNumber) const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (!liveView || !channelNumber || !channel || channel->Number() != channelNumber)
return; return;
close(m_Frontend);
cString dev = cString::sprintf(FRONTEND_DEVICE, cDevice::ActualDevice()->CardIndex(), 0); m_DeviceSource = DEVICESOURCE_DVBAPI;
m_Frontend = open(dev, O_RDONLY | O_NONBLOCK); if (channel) {
if (channel->IsSourceType('I'))
m_DeviceSource = DEVICESOURCE_IPTV;
else if (channel->IsSourceType('V'))
m_DeviceSource = DEVICESOURCE_PVRINPUT;
}
if (m_Frontend >= 0) { if (m_Frontend >= 0) {
if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) { close(m_Frontend);
if (!femonConfig.usesvdrp) m_Frontend = -1;
error("cFemonOsd::ChannelSwitch() cannot read frontend info."); }
close(m_Frontend);
m_Frontend = -1; if (m_DeviceSource == DEVICESOURCE_DVBAPI) {
memset(&m_FrontendInfo, 0, sizeof(m_FrontendInfo)); cDvbDevice *dev = 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 (strstr(*cDevice::ActualDevice()->DeviceType(), SATIP_DEVICE)) {
// nop
}
else if (femonConfig.usesvdrp) {
if (!SvdrpConnect() || !SvdrpTune())
return;
}
else {
error("cFemonOsd::ChannelSwitch() cannot open frontend device.");
return; return;
} }
} }
else if (femonConfig.usesvdrp) {
if (!SvdrpConnect() || !SvdrpTune())
return;
}
else {
error("cFemonOsd::ChannelSwitch() cannot open frontend device.");
return;
}
if (m_Receiver) { if (m_Receiver) {
m_Receiver->Deactivate(); m_Receiver->Deactivate();
DELETENULL(m_Receiver); DELETENULL(m_Receiver);
} }
if (femonConfig.analyzestream) { if (femonConfig.analyzestream && channel) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); m_Receiver = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0);
if (channel) { cDevice::ActualDevice()->AttachReceiver(m_Receiver);
m_Receiver = new cFemonReceiver(channel->Vtype(), channel->Vpid(), channel->Apid(IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0), channel->Dpid(IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0));
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
}
} }
} }
@@ -680,9 +841,9 @@ void cFemonOsd::SetAudioTrack(int Index, const char * const *Tracks)
DELETENULL(m_Receiver); DELETENULL(m_Receiver);
} }
if (femonConfig.analyzestream) { if (femonConfig.analyzestream) {
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel()); const cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
if (channel) { if (channel) {
m_Receiver = new cFemonReceiver(channel->Vtype(), channel->Vpid(), channel->Apid(IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0), channel->Dpid(IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0)); m_Receiver = new cFemonReceiver(channel, IS_AUDIO_TRACK(track) ? int(track - ttAudioFirst) : 0, IS_DOLBY_TRACK(track) ? int(track - ttDolbyFirst) : 0);
cDevice::ActualDevice()->AttachReceiver(m_Receiver); cDevice::ActualDevice()->AttachReceiver(m_Receiver);
} }
} }
@@ -697,26 +858,83 @@ bool cFemonOsd::DeviceSwitch(int direction)
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) { if (direction >= 0) {
if (++device >= cDevice::NumDevices()) if (++device >= cDevice::NumDevices())
device = 0; device = 0;
} }
else { else {
if (--device < 0) if (--device < 0)
device = cDevice::NumDevices() - 1; device = cDevice::NumDevices() - 1;
} }
if (cDevice::GetDevice(device)->ProvidesChannel(channel, 0)) { // Collect the current priorities of all CAM slots that can decrypt the channel:
debug("%s(%d) device(%d)\n", __PRETTY_FUNCTION__, direction, device); int NumCamSlots = CamSlots.Count();
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), 0); int SlotPriority[NumCamSlots];
cControl::Shutdown(); int NumUsableSlots = 0;
cDevice::GetDevice(device)->SwitchChannel(channel, true); bool NeedsDetachAllReceivers = false;
if (cDevice::GetDevice(device) == cDevice::PrimaryDevice()) bool InternalCamNeeded = false;
cDevice::GetDevice(device)->ForceTransferMode(); bool ValidDevice = false;
cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel)); cCamSlot *s = NULL;
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), channel->Number()); cDevice *d = cDevice::GetDevice(device);
return (true); if (channel->Ca() >= CA_ENCRYPTED_MIN) {
} for (cCamSlot *CamSlot = CamSlots.First(); CamSlot; CamSlot = CamSlots.Next(CamSlot)) {
} SlotPriority[CamSlot->Index()] = MAXPRIORITY + 1; // assumes it can't be used
if (CamSlot->ModuleStatus() == msReady) {
if (CamSlot->ProvidesCa(channel->Caids())) {
if (!ChannelCamRelations.CamChecked(channel->GetChannelID(), CamSlot->SlotNumber())) {
SlotPriority[CamSlot->Index()] = CamSlot->Priority();
NumUsableSlots++;
}
}
}
}
if (!NumUsableSlots)
InternalCamNeeded = true; // no CAM is able to decrypt this channel
}
for (int j = 0; j < NumCamSlots || !NumUsableSlots; ++j) {
if (NumUsableSlots && SlotPriority[j] > MAXPRIORITY)
continue; // there is no CAM available in this slot
bool HasInternalCam = d->HasInternalCam();
if (InternalCamNeeded && !HasInternalCam)
continue; // no CAM is able to decrypt this channel and the device uses vdr handled CAMs
if (NumUsableSlots && !HasInternalCam && !CamSlots.Get(j)->Assign(d, true))
continue; // CAM slot can't be used with this device
if (d->ProvidesChannel(channel, 0, &NeedsDetachAllReceivers)) { // this device is basically able to do the job
debug("%s(%d) device(%d)\n", __PRETTY_FUNCTION__, direction, device);
if (NumUsableSlots && !HasInternalCam && d->CamSlot() && d->CamSlot() != CamSlots.Get(j))
NeedsDetachAllReceivers = true; // using a different CAM slot requires detaching receivers
if (NumUsableSlots && !HasInternalCam)
s = CamSlots.Get(j);
ValidDevice = true;
break;
}
if (!NumUsableSlots)
break; // no CAM necessary, so just one loop over the devices
}
// Do the actual switch if valid device found
if (d && ValidDevice) {
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), 0, true);
cControl::Shutdown();
if (NeedsDetachAllReceivers)
d->DetachAllReceivers();
if (s) {
if (s->Device() != d) {
if (s->Device())
s->Device()->DetachAllReceivers();
if (d->CamSlot())
d->CamSlot()->Assign(NULL);
s->Assign(d);
}
}
else if (d->CamSlot() && !d->CamSlot()->IsDecrypting())
d->CamSlot()->Assign(NULL);
d->SwitchChannel(channel, true);
if (d == cDevice::PrimaryDevice())
d->ForceTransferMode();
cControl::Launch(new cTransferControl(d, channel));
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), channel->Number(), true);
return (true);
}
}
} }
} }
return (false); return (false);
@@ -808,7 +1026,7 @@ eOSState cFemonOsd::ProcessKey(eKeys Key)
{ {
eOSState state = cOsdObject::ProcessKey(Key); eOSState state = cOsdObject::ProcessKey(Key);
if (state == osUnknown) { if (state == osUnknown) {
switch (Key) { switch (int(Key)) {
case k0: case k0:
if ((m_Number == 0) && (m_OldNumber != 0)) { if ((m_Number == 0) && (m_OldNumber != 0)) {
m_Number = m_OldNumber; m_Number = m_OldNumber;

View File

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

View File

@@ -10,34 +10,37 @@
#include "femoncfg.h" #include "femoncfg.h"
#include "femonreceiver.h" #include "femonreceiver.h"
cFemonReceiver::cFemonReceiver(int Vtype, int Vpid, int Apid, int Dpid) cFemonReceiver::cFemonReceiver(const cChannel *Channel, int ATrack, int DTrack)
: cThread("femon receiver"), : cReceiver(Channel),
cThread("femon receiver"),
m_Mutex(), m_Mutex(),
m_Sleep(), m_Sleep(),
m_Active(false), m_Active(false),
m_DetectH264(this), m_DetectH264(this),
m_DetectMPEG(this, this), m_DetectMPEG(this, this),
m_DetectAAC(this), m_DetectAAC(this),
m_DetectLATM(this),
m_DetectAC3(this), m_DetectAC3(this),
m_VideoBuffer(KILOBYTE(512), TS_SIZE, false, "Femon video"), m_VideoBuffer(KILOBYTE(512), TS_SIZE, false, "Femon video"),
m_VideoType(Vtype), m_VideoType(Channel ? Channel->Vtype(): 0),
m_VideoPid(Vpid), 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_AudioBuffer(KILOBYTE(256), TS_SIZE, false, "Femon audio"),
m_AudioPid(Apid), m_AudioPid(Channel ? Channel->Apid(ATrack) : 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_AC3Buffer(KILOBYTE(256), TS_SIZE, false, "Femon AC3"),
m_AC3Pid(Dpid), m_AC3Pid(Channel ? Channel->Dpid(DTrack) : 0),
m_AC3PacketCount(0), m_AC3PacketCount(0),
m_AC3Bitrate(0), m_AC3Bitrate(0),
m_AC3Valid(false) m_AC3Valid(false)
{ {
debug("%s()\n", __PRETTY_FUNCTION__); debug("%s()\n", __PRETTY_FUNCTION__);
SetPids(NULL);
AddPid(m_VideoPid); AddPid(m_VideoPid);
AddPid(m_AudioPid); AddPid(m_AudioPid);
AddPid(m_AC3Pid); AddPid(m_AC3Pid);
@@ -78,12 +81,12 @@ cFemonReceiver::~cFemonReceiver(void)
void cFemonReceiver::Deactivate(void) void cFemonReceiver::Deactivate(void)
{ {
debug("%s()\n", __PRETTY_FUNCTION__); debug("%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();
} }
} }
@@ -141,10 +144,10 @@ void cFemonReceiver::Action(void)
bool processed = false; bool processed = false;
// process available video data // process available video data
while (Data = m_VideoBuffer.Get(Length)) { while ((Data = m_VideoBuffer.Get(Length))) {
if (!m_Active || (Length < TS_SIZE)) if (!m_Active || (Length < TS_SIZE))
break; break;
Length = TS_SIZE; Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) { if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) { for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) { if (Data[i] == TS_SYNC_BYTE) {
@@ -178,10 +181,10 @@ void cFemonReceiver::Action(void)
} }
// process available audio data // process available audio data
while (Data = m_AudioBuffer.Get(Length)) { while ((Data = m_AudioBuffer.Get(Length))) {
if (!m_Active || (Length < TS_SIZE)) if (!m_Active || (Length < TS_SIZE))
break; break;
Length = TS_SIZE; Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) { if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) { for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) { if (Data[i] == TS_SYNC_BYTE) {
@@ -194,7 +197,7 @@ void cFemonReceiver::Action(void)
} }
processed = true; processed = true;
if (const uint8_t *p = m_AudioAssembler.GetPes(len)) { if (const uint8_t *p = m_AudioAssembler.GetPes(len)) {
if (m_DetectAAC.processAudio(p, len) || m_DetectMPEG.processAudio(p, len)) if (m_DetectAAC.processAudio(p, len) || m_DetectLATM.processAudio(p, len) || m_DetectMPEG.processAudio(p, len))
m_AudioValid = true; m_AudioValid = true;
m_AudioAssembler.Reset(); m_AudioAssembler.Reset();
} }
@@ -203,10 +206,10 @@ void cFemonReceiver::Action(void)
} }
// process available dolby data // process available dolby data
while (Data = m_AC3Buffer.Get(Length)) { while ((Data = m_AC3Buffer.Get(Length))) {
if (!m_Active || (Length < TS_SIZE)) if (!m_Active || (Length < TS_SIZE))
break; break;
Length = TS_SIZE; Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) { if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) { for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) { if (Data[i] == TS_SYNC_BYTE) {

View File

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

View File

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

View File

@@ -8,9 +8,11 @@
#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 {
SYMBOL_ONEPIXEL,
SYMBOL_STEREO, SYMBOL_STEREO,
SYMBOL_MONO_LEFT, SYMBOL_MONO_LEFT,
SYMBOL_MONO_RIGHT, SYMBOL_MONO_RIGHT,
@@ -43,12 +45,43 @@ enum eSymbols {
SYMBOL_SEVEN, SYMBOL_SEVEN,
SYMBOL_EIGHT, SYMBOL_EIGHT,
SYMBOL_FORMAT_1080, SYMBOL_FORMAT_1080,
SYMBOL_FORMAT_1080i,
SYMBOL_FORMAT_1080p,
SYMBOL_FORMAT_720, SYMBOL_FORMAT_720,
SYMBOL_FORMAT_720i,
SYMBOL_FORMAT_720p,
SYMBOL_FORMAT_576, SYMBOL_FORMAT_576,
SYMBOL_FORMAT_576i,
SYMBOL_FORMAT_576p,
SYMBOL_FORMAT_480, SYMBOL_FORMAT_480,
SYMBOL_FORMAT_480i,
SYMBOL_FORMAT_480p,
SYMBOL_MAX_COUNT SYMBOL_MAX_COUNT
}; };
extern cBitmap bmSymbol[SYMBOL_MAX_COUNT]; class cFemonSymbolCache {
private:
enum {
DEFAULT_SPACING = 5,
DEFAULT_ROUNDING = 10,
DEFAULT_HEIGHT = 576,
DEFAULT_WIDTH = 720
};
double xFactorM;
double yFactorM;
bool antiAliasM;
cVector<cBitmap*> cacheM;
bool Populate(void);
bool Flush(void);
public:
cFemonSymbolCache();
~cFemonSymbolCache();
void Refresh();
cBitmap& Get(eSymbols symbolP);
int GetSpacing() { return int(yFactorM * cFemonSymbolCache::DEFAULT_SPACING); }
int GetRounding() { return int(yFactorM * cFemonSymbolCache::DEFAULT_ROUNDING); }
};
extern cFemonSymbolCache femonSymbols;
#endif // __FEMONSYMBOL_H #endif // __FEMONSYMBOL_H

View File

@@ -9,6 +9,7 @@
#define __STDC_FORMAT_MACROS #define __STDC_FORMAT_MACROS
#endif #endif
#include <ctype.h>
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
@@ -25,41 +26,41 @@ 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("%s (%X)", "SECA Mediaguard", value); // Canal Plus case 0x0100 ... 0x01FF: return cString::sprintf("SECA Mediaguard (%X)", value); // Canal Plus
case 0x0464: return cString::sprintf("%s (%X)", "EuroDec", value); // EuroDec case 0x0464: return cString::sprintf("EuroDec (%X)", value); // EuroDec
case 0x0500 ... 0x05FF: return cString::sprintf("%s (%X)", "Viaccess", value); // France Telecom case 0x0500 ... 0x05FF: return cString::sprintf("Viaccess (%X)", value); // France Telecom
case 0x0600 ... 0x06FF: return cString::sprintf("%s (%X)", "Irdeto", value); // Irdeto case 0x0600 ... 0x06FF: return cString::sprintf("Irdeto (%X)", value); // Irdeto
case 0x0900 ... 0x09FF: return cString::sprintf("%s (%X)", "NDS Videoguard", value); // News Datacom case 0x0900 ... 0x09FF: return cString::sprintf("NDS Videoguard (%X)", value); // News Datacom
case 0x0B00 ... 0x0BFF: return cString::sprintf("%s (%X)", "Conax", value); // Norwegian Telekom case 0x0B00 ... 0x0BFF: return cString::sprintf("Conax (%X)", value); // Norwegian Telekom
case 0x0D00 ... 0x0DFF: return cString::sprintf("%s (%X)", "CryptoWorks", value); // Philips case 0x0D00 ... 0x0DFF: return cString::sprintf("CryptoWorks (%X)", value); // Philips
case 0x0E00 ... 0x0EFF: return cString::sprintf("%s (%X)", "PowerVu", value); // Scientific Atlanta case 0x0E00 ... 0x0EFF: return cString::sprintf("PowerVu (%X)", value); // Scientific Atlanta
case 0x1000: return cString::sprintf("%s (%X)", "RAS", value); // Tandberg Television case 0x1000: return cString::sprintf("RAS (%X)", value); // Tandberg Television
case 0x1200 ... 0x12FF: return cString::sprintf("%s (%X)", "NagraVision", value); // BellVu Express case 0x1200 ... 0x12FF: return cString::sprintf("NagraVision (%X)", value); // BellVu Express
case 0x1700 ... 0x17FF: return cString::sprintf("%s (%X)", "BetaCrypt", value); // BetaTechnik case 0x1700 ... 0x17FF: return cString::sprintf("BetaCrypt (%X)", value); // BetaTechnik
case 0x1800 ... 0x18FF: return cString::sprintf("%s (%X)", "NagraVision", value); // Kudelski SA case 0x1800 ... 0x18FF: return cString::sprintf("NagraVision (%X)", value); // Kudelski SA
case 0x22F0: return cString::sprintf("%s (%X)", "Codicrypt", value); // Scopus Network Technologies case 0x22F0: return cString::sprintf("Codicrypt (%X)", value); // Scopus Network Technologies
case 0x2600: return cString::sprintf("%s (%X)", "BISS", value); // European Broadcasting Union case 0x2600: return cString::sprintf("BISS (%X)", value); // European Broadcasting Union
case 0x4347: return cString::sprintf("%s (%X)", "CryptOn", value); // CryptOn case 0x4347: return cString::sprintf("CryptOn (%X)", value); // CryptOn
case 0x4800: return cString::sprintf("%s (%X)", "Accessgate", value); // Telemann case 0x4800: return cString::sprintf("Accessgate (%X)", value); // Telemann
case 0x4900: return cString::sprintf("%s (%X)", "China Crypt", value); // CryptoWorks case 0x4900: return cString::sprintf("China Crypt (%X)", value); // CryptoWorks
case 0x4A10: return cString::sprintf("%s (%X)", "EasyCas", value); // EasyCas case 0x4A10: return cString::sprintf("EasyCas (%X)", value); // EasyCas
case 0x4A20: return cString::sprintf("%s (%X)", "AlphaCrypt", value); // AlphaCrypt case 0x4A20: return cString::sprintf("AlphaCrypt (%X)", value); // AlphaCrypt
case 0x4A70: return cString::sprintf("%s (%X)", "DreamCrypt", value); // Dream Multimedia case 0x4A70: return cString::sprintf("DreamCrypt (%X)", value); // Dream Multimedia
case 0x4A60: return cString::sprintf("%s (%X)", "SkyCrypt", value); // @Sky case 0x4A60: return cString::sprintf("SkyCrypt (%X)", value); // @Sky
case 0x4A61: return cString::sprintf("%s (%X)", "Neotioncrypt", value); // Neotion case 0x4A61: return cString::sprintf("Neotioncrypt (%X)", value); // Neotion
case 0x4A62: return cString::sprintf("%s (%X)", "SkyCrypt", value); // @Sky case 0x4A62: return cString::sprintf("SkyCrypt (%X)", value); // @Sky
case 0x4A63: return cString::sprintf("%s (%X)", "Neotion SHL", value); // Neotion case 0x4A63: return cString::sprintf("Neotion SHL (%X)", value); // Neotion
case 0x4A64 ... 0x4A6F: return cString::sprintf("%s (%X)", "SkyCrypt", value); // @Sky case 0x4A64 ... 0x4A6F: return cString::sprintf("SkyCrypt (%X)", value); // @Sky
case 0x4A80: return cString::sprintf("%s (%X)", "ThalesCrypt", value); // TPS case 0x4A80: return cString::sprintf("ThalesCrypt (%X)", value); // TPS
case 0x4AA1: return cString::sprintf("%s (%X)", "KeyFly", value); // SIDSA case 0x4AA1: return cString::sprintf("KeyFly (%X)", value); // SIDSA
case 0x4ABF: return cString::sprintf("%s (%X)", "DG-Crypt", value); // Beijing Compunicate Technology Inc. case 0x4ABF: return cString::sprintf("DG-Crypt (%X)", value); // Beijing Compunicate Technology Inc.
case 0x4AD0 ... 0x4AD1: return cString::sprintf("%s (%X)", "X-Crypt", value); // XCrypt Inc. case 0x4AD0 ... 0x4AD1: return cString::sprintf("X-Crypt (%X)", value); // XCrypt Inc.
case 0x4AD4: return cString::sprintf("%s (%X)", "OmniCrypt", value); // Widevine Technologies, Inc. case 0x4AD4: return cString::sprintf("OmniCrypt (%X)", value); // Widevine Technologies, Inc.
case 0x4AE0: return cString::sprintf("%s (%X)", "RossCrypt", value); // Digi Raum Electronics Co. Ltd. case 0x4AE0: return cString::sprintf("RossCrypt (%X)", value); // Digi Raum Electronics Co. Ltd.
case 0x5500: return cString::sprintf("%s (%X)", "Z-Crypt", value); // Digi Raum Electronics Co. Ltd. case 0x5500: return cString::sprintf("Z-Crypt (%X)", value); // Digi Raum Electronics Co. Ltd.
case 0x5501: return cString::sprintf("%s (%X)", "Griffin", value); // Griffin case 0x5501: return cString::sprintf("Griffin (%X)", value); // Griffin
default: break; default: break;
} }
return cString::sprintf("%X", value); return cString::sprintf("%X", value);
@@ -76,26 +77,38 @@ static const char *getUserString(int Value, const tDvbParameterMap *Map)
return "---"; return "---";
} }
cString getFrontendInfo(int cardIndex) cDvbDevice *getDvbDevice(cDevice* device)
{
cDvbDevice *dev = dynamic_cast<cDvbDevice*>(device);
#ifdef __DYNAMIC_DEVICE_PROBE
if (!dev && device && device->HasSubDevice())
dev = dynamic_cast<cDvbDevice*>(device->SubDevice());
#endif
return dev;
}
cString getFrontendInfo(cDvbDevice *device)
{ {
cString info;
struct dvb_frontend_info value; 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);
int fe = open(dev, O_RDONLY | O_NONBLOCK); if (!device)
return info;
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0) if (fe < 0)
return NULL; return info;
info = cString::sprintf("CARD:%d", cardIndex); info = cString::sprintf("CARD:%d\nSTRG:%d\nQUAL:%d", device->CardIndex(), device->SignalStrength(), device->SignalQuality());
if (ioctl(fe, FE_GET_INFO, &value) >= 0) if (ioctl(fe, FE_GET_INFO, &value) >= 0)
info = cString::sprintf("%s\nTYPE:%d\nNAME:%s", *info, value.type, value.name); info = cString::sprintf("%s\nTYPE:%d\nNAME:%s", *info, value.type, *device->DeviceName());
if (ioctl(fe, FE_READ_STATUS, &status) >= 0) if (ioctl(fe, FE_READ_STATUS, &status) >= 0)
info = cString::sprintf("%s\nSTAT:%02X", *info, status); info = cString::sprintf("%s\nSTAT:%02X", *info, status);
if (ioctl(fe, FE_READ_SIGNAL_STRENGTH, &signal) >= 0) if (ioctl(fe, FE_READ_SIGNAL_STRENGTH, &signal) >= 0)
@@ -117,42 +130,39 @@ cString getFrontendInfo(int cardIndex)
return info; return info;
} }
cString getFrontendName(int cardIndex) cString getFrontendName(cDvbDevice *device)
{ {
struct dvb_frontend_info value; if (!device)
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (fe < 0)
return NULL; return NULL;
memset(&value, 0, sizeof(value));
ioctl(fe, FE_GET_INFO, &value);
close(fe);
return (cString::sprintf("%s on device #%d", value.name, cardIndex)); return (cString::sprintf("%s on device #%d", *device->DeviceName(), device->CardIndex()));
} }
cString getFrontendStatus(int cardIndex) cString getFrontendStatus(cDvbDevice *device)
{ {
fe_status_t value; fe_status_t value;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK); if (!device)
return NULL;
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0) if (fe < 0)
return NULL; return NULL;
memset(&value, 0, sizeof(value)); memset(&value, 0, sizeof(value));
ioctl(fe, FE_READ_STATUS, &value); ioctl(fe, FE_READ_STATUS, &value);
close(fe); close(fe);
return (cString::sprintf("Status %s:%s:%s:%s:%s on device #%d", (value & FE_HAS_LOCK) ? "LOCKED" : "-", (value & FE_HAS_SIGNAL) ? "SIGNAL" : "-", (value & FE_HAS_CARRIER) ? "CARRIER" : "-", (value & FE_HAS_VITERBI) ? "VITERBI" : "-", (value & FE_HAS_SYNC) ? "SYNC" : "-", cardIndex)); return (cString::sprintf("Status %s:%s:%s:%s:%s on device #%d", (value & FE_HAS_LOCK) ? "LOCKED" : "-", (value & FE_HAS_SIGNAL) ? "SIGNAL" : "-", (value & FE_HAS_CARRIER) ? "CARRIER" : "-", (value & FE_HAS_VITERBI) ? "VITERBI" : "-", (value & FE_HAS_SYNC) ? "SYNC" : "-", device->CardIndex()));
} }
uint16_t getSignal(int cardIndex) uint16_t getSignal(cDvbDevice *device)
{ {
uint16_t value = 0; uint16_t value = 0;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK); if (!device)
return (value);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0) if (fe < 0)
return (value); return (value);
ioctl(fe, FE_READ_SIGNAL_STRENGTH, &value); ioctl(fe, FE_READ_SIGNAL_STRENGTH, &value);
@@ -161,12 +171,14 @@ uint16_t getSignal(int cardIndex)
return (value); return (value);
} }
uint16_t getSNR(int cardIndex) uint16_t getSNR(cDvbDevice *device)
{ {
uint16_t value = 0; uint16_t value = 0;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK); if (!device)
return (value);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0) if (fe < 0)
return (value); return (value);
ioctl(fe, FE_READ_SNR, &value); ioctl(fe, FE_READ_SNR, &value);
@@ -175,12 +187,14 @@ uint16_t getSNR(int cardIndex)
return (value); return (value);
} }
uint32_t getBER(int cardIndex) uint32_t getBER(cDvbDevice *device)
{ {
uint32_t value = 0; uint32_t value = 0;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK); if (!device)
return (value);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0) if (fe < 0)
return (value); return (value);
ioctl(fe, FE_READ_BER, &value); ioctl(fe, FE_READ_BER, &value);
@@ -189,12 +203,14 @@ uint32_t getBER(int cardIndex)
return (value); return (value);
} }
uint32_t getUNC(int cardIndex) uint32_t getUNC(cDvbDevice *device)
{ {
uint32_t value = 0; uint32_t value = 0;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK); if (!device)
return (value);
int fe = open(*cString::sprintf(FRONTEND_DEVICE, device->Adapter(), device->Frontend()), O_RDONLY | O_NONBLOCK);
if (fe < 0) if (fe < 0)
return (value); return (value);
ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &value); ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &value);
@@ -294,6 +310,7 @@ 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("---");
@@ -346,9 +363,14 @@ cString getModulation(int value)
return cString::sprintf("%s", getUserString(value, ModulationValues)); return cString::sprintf("%s", getUserString(value, ModulationValues));
} }
cString getSystem(int value) cString getTerrestrialSystem(int value)
{ {
return cString::sprintf("%s", getUserString(value, SystemValues)); return cString::sprintf("%s", getUserString(value, SystemValuesTerr));
}
cString getSatelliteSystem(int value)
{
return cString::sprintf("%s", getUserString(value, SystemValuesSat));
} }
cString getRollOff(int value) cString getRollOff(int value)
@@ -541,84 +563,31 @@ cString getBitrateKbits(double value)
return cString::sprintf("---"); return cString::sprintf("---");
} }
cBitStream::cBitStream(const uint8_t *buf, const int len) // --- cFemonBitStream -------------------------------------------------------
: data(buf),
count(len),
index(0)
{
}
cBitStream::~cBitStream() uint32_t cFemonBitStream::GetUeGolomb()
{
}
int cBitStream::getBit()
{
if (index >= count)
return (1); // -> no infinite colomb's ...
int r = (data[index >> 3] >> (7 - (index & 7))) & 1;
++index;
return (r);
}
uint32_t cBitStream::getBits(uint32_t n)
{
uint32_t r = 0;
while (n--)
r = (r | (getBit() << n));
return (r);
}
void cBitStream::skipBits(uint32_t n)
{
index += n;
}
uint32_t cBitStream::getUeGolomb()
{ {
int n = 0; int n = 0;
while (!getBit() && (n < 32)) while (!GetBit() && (n < 32))
n++; n++;
return (n ? ((1 << n) - 1) + getBits(n) : 0); return (n ? ((1 << n) - 1) + GetBits(n) : 0);
} }
int32_t cBitStream::getSeGolomb() int32_t cFemonBitStream::GetSeGolomb()
{ {
uint32_t r = getUeGolomb() + 1; uint32_t r = GetUeGolomb() + 1;
return ((r & 1) ? -(r >> 1) : (r >> 1)); return ((r & 1) ? -(r >> 1) : (r >> 1));
} }
void cBitStream::skipGolomb() void cFemonBitStream::SkipGolomb()
{ {
int n = 0; int n = 0;
while (!getBit() && (n < 32)) while (!GetBit() && (n < 32))
n++; n++;
skipBits(n); SkipBits(n);
}
void cBitStream::skipUeGolomb()
{
skipGolomb();
}
void cBitStream::skipSeGolomb()
{
skipGolomb();
}
void cBitStream::byteAlign()
{
int n = index % 8;
if (n > 0)
skipBits(8 - n);
} }

View File

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

22
iptvservice.h Normal file
View File

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

View File

@@ -1,5 +1,5 @@
# VDR plugin language source file. # VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg # Copyright (C) 2007-2014 Rolf Ahrenberg
# This file is distributed under the same license as the femon package. # This file is distributed under the same license as the femon package.
# Peter Marquardt # Peter Marquardt
# Andreas Brachold # Andreas Brachold
@@ -7,12 +7,13 @@
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: femon 1.7.7\n" "Project-Id-Version: vdr-femon 2.0.4\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n" "POT-Creation-Date: 2014-03-15 03:15+0200\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n" "PO-Revision-Date: 2014-03-15 03:15+0200\n"
"Last-Translator: Christian Wieninger\n" "Last-Translator: Christian Wieninger\n"
"Language-Team: <vdr@linuxtv.org>\n" "Language-Team: German <vdr@linuxtv.org>\n"
"Language: de\n"
"MIME-Version: 1.0\n" "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"
@@ -65,6 +66,9 @@ 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"
@@ -176,6 +180,12 @@ 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"
@@ -185,9 +195,6 @@ 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"
@@ -266,6 +273,9 @@ msgstr ""
msgid "HE-AAC" msgid "HE-AAC"
msgstr "" msgstr ""
msgid "LATM"
msgstr ""
msgid "stereo" msgid "stereo"
msgstr "" msgstr ""

View File

@@ -1,16 +1,17 @@
# VDR plugin language source file. # VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg # Copyright (C) 2007-2014 Rolf Ahrenberg
# This file is distributed under the same license as the femon package. # This file is distributed under the same license as the femon package.
# Luis Palacios # Luis Palacios
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: femon 1.7.7\n" "Project-Id-Version: vdr-femon 2.0.4\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n" "POT-Creation-Date: 2014-03-15 03:15+0200\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n" "PO-Revision-Date: 2014-03-15 03:15+0200\n"
"Last-Translator: Luis Palacios\n" "Last-Translator: Luis Palacios\n"
"Language-Team: <vdr@linuxtv.org>\n" "Language-Team: Spanish <vdr@linuxtv.org>\n"
"Language: es\n"
"MIME-Version: 1.0\n" "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"
@@ -63,6 +64,9 @@ 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"
@@ -174,6 +178,12 @@ 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"
@@ -183,9 +193,6 @@ 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"
@@ -264,6 +271,9 @@ msgstr ""
msgid "HE-AAC" msgid "HE-AAC"
msgstr "" msgstr ""
msgid "LATM"
msgstr ""
msgid "stereo" msgid "stereo"
msgstr "" msgstr ""

View File

@@ -1,16 +1,17 @@
# VDR plugin language source file. # VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg # Copyright (C) 2007-2014 Rolf Ahrenberg
# This file is distributed under the same license as the femon package. # This file is distributed under the same license as the femon package.
# Arthur Konovalov # Arthur Konovalov
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: femon 1.7.7\n" "Project-Id-Version: vdr-femon 2.0.4\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n" "POT-Creation-Date: 2014-03-15 03:15+0200\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n" "PO-Revision-Date: 2014-03-15 03:15+0200\n"
"Last-Translator: Arthur Konovalov\n" "Last-Translator: Arthur Konovalov\n"
"Language-Team: <vdr@linuxtv.org>\n" "Language-Team: Estonian <vdr@linuxtv.org>\n"
"Language: et\n"
"MIME-Version: 1.0\n" "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"
@@ -63,6 +64,9 @@ 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 "Peita valik peamen<65><6E>s"
@@ -174,6 +178,12 @@ 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 "Vooinfo"
@@ -183,9 +193,6 @@ msgstr "Videovoog"
msgid "Codec" msgid "Codec"
msgstr "Koodek" msgstr "Koodek"
msgid "Bitrate"
msgstr "Bitikiirus"
msgid "Aspect Ratio" msgid "Aspect Ratio"
msgstr "K<>lgsuhe" msgstr "K<>lgsuhe"
@@ -264,6 +271,9 @@ 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"

View File

@@ -1,16 +1,17 @@
# VDR plugin language source file. # VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg # Copyright (C) 2007-2014 Rolf Ahrenberg
# This file is distributed under the same license as the femon package. # This file is distributed under the same license as the femon package.
# Rolf Ahrenberg # Rolf Ahrenberg
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: femon 1.7.7\n" "Project-Id-Version: vdr-femon 2.0.4\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n" "POT-Creation-Date: 2014-03-15 03:15+0200\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n" "PO-Revision-Date: 2014-03-15 03:15+0200\n"
"Last-Translator: Rolf Ahrenberg\n" "Last-Translator: Rolf Ahrenberg\n"
"Language-Team: <vdr@linuxtv.org>\n" "Language-Team: Finnish <vdr@linuxtv.org>\n"
"Language: fi\n"
"MIME-Version: 1.0\n" "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"
@@ -63,6 +64,9 @@ 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"
@@ -166,7 +170,7 @@ msgid "Nid"
msgstr "Verkko-ID" msgstr "Verkko-ID"
msgid "Tid" msgid "Tid"
msgstr "Lähete-ID" msgstr "TS-ID"
msgid "Rid" msgid "Rid"
msgstr "Radio-ID" msgstr "Radio-ID"
@@ -174,6 +178,12 @@ 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"
@@ -183,9 +193,6 @@ msgstr "Kuvaraita"
msgid "Codec" msgid "Codec"
msgstr "Koodekki" msgstr "Koodekki"
msgid "Bitrate"
msgstr "Bittinopeus"
msgid "Aspect Ratio" msgid "Aspect Ratio"
msgstr "Kuvasuhde" msgstr "Kuvasuhde"
@@ -264,6 +271,9 @@ 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"

View File

@@ -1,25 +1,28 @@
# VDR plugin language source file. # VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg # Copyright (C) 2007-2014 Rolf Ahrenberg
# This file is distributed under the same license as the femon package. # This file is distributed under the same license as the femon package.
# Nicolas Huillard # Nicolas Huillard
# Michaël Nival <mnival@club-internet.fr>, 2010
# Bernard Jaulin <bernard.jaulin@gmail.com>, 2013
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: femon 1.7.7\n" "Project-Id-Version: vdr-femon 2.0.4\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n" "POT-Creation-Date: 2014-03-15 03:15+0200\n"
"PO-Revision-Date: 2008-01-26 09:59+0100\n" "PO-Revision-Date: 2014-03-15 03:15+0200\n"
"Last-Translator: NIVAL Micha<68>l <mnival@club-internet.fr>\n" "Last-Translator: Bernard Jaulin <bernard.jaulin@gmail.com>\n"
"Language-Team: <vdr@linuxtv.org>\n" "Language-Team: French <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=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
msgid "DVB Signal Information Monitor (OSD)" msgid "DVB Signal Information Monitor (OSD)"
msgstr "Affiche les informations du signal DVB" msgstr "Moniteur sur le signal DVB"
msgid "Signal Information" msgid "Signal Information"
msgstr "Signal DVB" msgstr "Infos sur le signal DVB"
msgid "Femon not available" msgid "Femon not available"
msgstr "Femon n'est pas disponible" msgstr "Femon n'est pas disponible"
@@ -63,95 +66,98 @@ 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"
msgid "Define whether the main menu entry is hidden." msgid "Define whether the main menu entry is hidden."
msgstr "D<EFBFBD>finit si l'entr<EFBFBD>e doit <EFBFBD>tre masqu<EFBFBD>e dans le menu principal." msgstr "Définit si l'entrée doit être masquée dans le menu principal."
msgid "Default display mode" msgid "Default display mode"
msgstr "Affichage par d<EFBFBD>faut" msgstr "Affichage par défaut"
msgid "Define the default display mode at startup." msgid "Define the default display mode at startup."
msgstr "D<EFBFBD>finit l'affichage par d<EFBFBD>faut au d<EFBFBD>marrage." msgstr "Définit l'affichage par défaut au démarrage."
msgid "Define the used OSD skin." msgid "Define the used OSD skin."
msgstr "D<EFBFBD>finit le skin OSD <EFBFBD> utiliser." msgstr "Définit le skin OSD à utiliser."
msgid "Define the used OSD theme." msgid "Define the used OSD theme."
msgstr "D<EFBFBD>finit le th<EFBFBD>me OSD <EFBFBD> utiliser." msgstr "Définit le thème OSD à utiliser."
msgid "Position" msgid "Position"
msgstr "Position" msgstr "Position"
msgid "Define the position of OSD." msgid "Define the position of OSD."
msgstr "D<EFBFBD>finit la position de l'OSD." msgstr "Définit la position de l'OSD."
msgid "Downscale OSD size [%]" msgid "Downscale OSD size [%]"
msgstr "" msgstr "Réduit la taille de l'OSD (%)"
msgid "Define the downscale ratio for OSD size." msgid "Define the downscale ratio for OSD size."
msgstr "" msgstr "Définit le ration de réduction de l'OSD."
msgid "Red limit [%]" msgid "Red limit [%]"
msgstr "Limite du rouge (%)" msgstr "Limite du rouge (%)"
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 "D<EFBFBD>finit la limite de la barre rouge, qui est utilis<EFBFBD> pour indiquer un mauvais signal." msgstr "Définit la limite de la barre rouge, qui est utilisé pour indiquer un mauvais signal."
msgid "Green limit [%]" msgid "Green limit [%]"
msgstr "Limite du vert (%)" msgstr "Limite du vert (%)"
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 "D<EFBFBD>finit la limite de la barre rouge, qui est utilis<EFBFBD> pour indiquer un bon signal." msgstr "Définit la limite de la barre rouge, qui est utilisé pour indiquer un bon signal."
msgid "OSD update interval [0.1s]" msgid "OSD update interval [0.1s]"
msgstr "Intervalle de mise <EFBFBD> jour (0,1s)" msgstr "Intervalle de mise à jour (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 "D<EFBFBD>finit l'intervalle de mise <EFBFBD> jour de l'OSD. Un petit intervalle g<EFBFBD>n<EFBFBD>re une charge CPU plus importante." msgstr "Définit l'intervalle de mise à jour de l'OSD. Un petit intervalle génère une charge CPU plus importante."
msgid "Analyze stream" msgid "Analyze stream"
msgstr "Analyser le flux" msgstr "Analyser le flux"
msgid "Define whether the DVB stream is analyzed and bitrates calculated." msgid "Define whether the DVB stream is analyzed and bitrates calculated."
msgstr "D<EFBFBD>finit si le flux DVB est analys<EFBFBD> et le bitrates calcul<EFBFBD>." msgstr "Définit si le flux DVB est analysé et le taux d'échantillonnage fixe calculé."
msgid "Calculation interval [0.1s]" msgid "Calculation interval [0.1s]"
msgstr "Intervalle de calcul (0,1s)" msgstr "Intervalle de calcul (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 "D<EFBFBD>finit l'intervalle de cacul. Un plus grand intervalle g<EFBFBD>n<EFBFBD>re une valeur plus stable." msgstr "Définit l'intervalle de cacul. Un plus grand intervalle génère une valeur plus stable."
msgid "Use SVDRP service" msgid "Use SVDRP service"
msgstr "Utiliser le service SVDRP" msgstr "Utiliser le service SVDRP"
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 "D<EFBFBD>finit si le service SVDRP est utilis<EFBFBD> en configuration client/serveur." msgstr "Définit si le service SVDRP est utilisé dans la configuration client/serveur."
msgid "SVDRP service port" msgid "SVDRP service port"
msgstr "Port du service SVDRP" msgstr "Port du service SVDRP"
msgid "Define the port number of SVDRP service." msgid "Define the port number of SVDRP service."
msgstr "D<EFBFBD>finit le port d'<EFBFBD>coute du service SVDRP." msgstr "Définit le port d'écoute du service SVDRP."
msgid "SVDRP service IP" msgid "SVDRP service IP"
msgstr "IP du service SVDRP" msgstr "IP du service SVDRP"
msgid "Define the IP address of SVDRP service." msgid "Define the IP address of SVDRP service."
msgstr "D<EFBFBD>finit l'adresse IP du service SVDRP." msgstr "Définit l'adresse IP du service SVDRP."
msgid "Help" msgid "Help"
msgstr "Aide" msgstr "Aide"
msgid "Video" msgid "Video"
msgstr "Vid<EFBFBD>o" msgstr "Vidéo"
msgid "Audio" msgid "Audio"
msgstr "Audio" msgstr "Audio"
msgid "Transponder Information" msgid "Transponder Information"
msgstr "Information transpondeur" msgstr "Information du transpondeur"
msgid "Apid" msgid "Apid"
msgstr "Apid" msgstr "Apid"
@@ -174,38 +180,41 @@ msgstr "Rid"
msgid "Coderate" msgid "Coderate"
msgstr "Coderate" msgstr "Coderate"
msgid "Stream Information" msgid "Protocol"
msgstr "Information flux" msgstr "Protocole"
msgid "Video Stream"
msgstr "Flux vid<69>o"
msgid "Codec"
msgstr ""
msgid "Bitrate" msgid "Bitrate"
msgstr "Bitrate" msgstr "Taux d'échantillonnage fixe"
msgid "Stream Information"
msgstr "Information sur le flux"
msgid "Video Stream"
msgstr "Flux vidéo"
msgid "Codec"
msgstr "Codec"
msgid "Aspect Ratio" msgid "Aspect Ratio"
msgstr "Proportions d'image" msgstr "Format de l'image"
msgid "Frame Rate" msgid "Frame Rate"
msgstr "Rafra<EFBFBD>chissement" msgstr "Rafraîchissement"
msgid "Video Format" msgid "Video Format"
msgstr "Standard vid<EFBFBD>o" msgstr "Standard vidéo"
msgid "Resolution" msgid "Resolution"
msgstr "R<EFBFBD>solution" msgstr "Résolution"
msgid "Audio Stream" msgid "Audio Stream"
msgstr "Flux audio" msgstr "Flux audio"
msgid "Channel Mode" msgid "Channel Mode"
msgstr "" msgstr "Mode chaîne"
msgid "Sampling Frequency" msgid "Sampling Frequency"
msgstr "Fr<EFBFBD>quence d'<EFBFBD>chantillonage" msgstr "Fréquence d'échantillonage"
msgid "AC-3 Stream" msgid "AC-3 Stream"
msgstr "Flux AC-3" msgstr "Flux AC-3"
@@ -238,61 +247,64 @@ msgid "Analog"
msgstr "Analogique" msgstr "Analogique"
msgid "MPEG-2" msgid "MPEG-2"
msgstr "" msgstr "MPEG-2"
msgid "H.264" msgid "H.264"
msgstr "" msgstr "H.264"
msgid "MPEG-1 Layer I" msgid "MPEG-1 Layer I"
msgstr "" msgstr "MPEG-1 Layer I"
msgid "MPEG-1 Layer II" msgid "MPEG-1 Layer II"
msgstr "" msgstr "MPEG-1 Layer II"
msgid "MPEG-1 Layer III" msgid "MPEG-1 Layer III"
msgstr "" msgstr "MPEG-1 Layer III"
msgid "MPEG-2 Layer I" msgid "MPEG-2 Layer I"
msgstr "" msgstr "MPEG-2 Layer I"
msgid "MPEG-2 Layer II" msgid "MPEG-2 Layer II"
msgstr "" msgstr "MPEG-2 Layer II"
msgid "MPEG-2 Layer III" msgid "MPEG-2 Layer III"
msgstr "" msgstr "MPEG-2 Layer III"
msgid "HE-AAC" msgid "HE-AAC"
msgstr "" msgstr "HE-AAC"
msgid "LATM"
msgstr "LATM"
msgid "stereo" msgid "stereo"
msgstr "" msgstr "stéréo"
msgid "joint Stereo" msgid "joint Stereo"
msgstr "" msgstr "joint Stereo"
msgid "dual" msgid "dual"
msgstr "" msgstr "double"
msgid "mono" msgid "mono"
msgstr "" msgstr "mono"
msgid "interlaced" msgid "interlaced"
msgstr "" msgstr "entrelacé"
msgid "progressive" msgid "progressive"
msgstr "" msgstr "progressif"
msgid "reserved" msgid "reserved"
msgstr "r<EFBFBD>serv<EFBFBD>" msgstr "réservé"
msgid "extended" msgid "extended"
msgstr "" msgstr "étendu"
msgid "unknown" msgid "unknown"
msgstr "inconnu" msgstr "inconnu"
msgid "component" msgid "component"
msgstr "" msgstr "composant"
msgid "PAL" msgid "PAL"
msgstr "PAL" msgstr "PAL"
@@ -301,10 +313,10 @@ msgid "NTSC"
msgstr "NTSC" msgstr "NTSC"
msgid "SECAM" msgid "SECAM"
msgstr "" msgstr "SECAM"
msgid "MAC" msgid "MAC"
msgstr "" msgstr "MAC"
msgid "Hz" msgid "Hz"
msgstr "Hz" msgstr "Hz"
@@ -364,7 +376,7 @@ msgid "dB"
msgstr "dB" msgstr "dB"
msgid "not indicated" msgid "not indicated"
msgstr "non indiqu<EFBFBD>" msgstr "non indiqué"
msgid "MHz" msgid "MHz"
msgstr "MHz" msgstr "MHz"

392
po/hu_HU.po Normal file
View File

@@ -0,0 +1,392 @@
# VDR plugin language source file.
# Copyright (C) 2007-2014 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 2.0.4\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-03-15 03:15+0200\n"
"PO-Revision-Date: 2014-03-15 03:15+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

@@ -1,20 +1,24 @@
# VDR plugin language source file. # VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg # Copyright (C) 2007-2014 Rolf Ahrenberg
# This file is distributed under the same license as the femon package. # This file is distributed under the same license as the femon package.
# Sean Carlos # Sean Carlos
# Diego Pierotto <vdr-italian@tiscali.it> # Diego Pierotto <vdr-italian@tiscali.it>
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: femon 1.7.7\n" "Project-Id-Version: vdr-femon 2.0.4\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n" "POT-Creation-Date: 2014-03-15 03:15+0200\n"
"PO-Revision-Date: 2008-11-10 23:37+0100\n" "PO-Revision-Date: 2014-03-15 03:15+0200\n"
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n" "Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
"Language-Team: <vdr@linuxtv.org>\n" "Language-Team: Italian <vdr@linuxtv.org>\n"
"Language: it\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-15\n" "Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n" "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)"
@@ -64,17 +68,20 @@ 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 <EFBFBD> nascosta." msgstr "Definisci se la voce del menu principale è nascosta."
msgid "Default display mode" msgid "Default display mode"
msgstr "Modalit<EFBFBD> visualizz. predefinita" msgstr "Modalità visualizz. predefinita"
msgid "Define the default display mode at startup." msgid "Define the default display mode at startup."
msgstr "Definisci la modalit<EFBFBD> di visualizz. predefinita all'avvio." msgstr "Definisci la modalità di visualizz. predefinita all'avvio."
msgid "Define the used OSD skin." msgid "Define the used OSD skin."
msgstr "Definisci lo stile interfaccia OSD utilizzato." msgstr "Definisci lo stile interfaccia OSD utilizzato."
@@ -89,10 +96,10 @@ msgid "Define the position of OSD."
msgstr "Definisci la posizione dell'OSD." msgstr "Definisci la posizione dell'OSD."
msgid "Downscale OSD size [%]" msgid "Downscale OSD size [%]"
msgstr "" msgstr "Riduci dimensione OSD [%]"
msgid "Define the downscale ratio for OSD size." msgid "Define the downscale ratio for OSD size."
msgstr "" msgstr "Definisci il rapporto di riduzione della dimensione OSD."
msgid "Red limit [%]" msgid "Red limit [%]"
msgstr "Limite rosso [%]" msgstr "Limite rosso [%]"
@@ -110,19 +117,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<EFBFBD> piccolo <EFBFBD> l'intervallo maggiore sar<EFBFBD> l'uso di CPU." msgstr "Definisci un intervallo per gli agg. OSD. Più piccolo è l'intervallo maggiore sarà l'uso di CPU."
msgid "Analyze stream" 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 <EFBFBD> analizzato e i bitrate calcolati." msgstr "Definisci se il flusso DVB è 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<EFBFBD> grande genera valori pi<EFBFBD> stabili." msgstr "Definisci un intervallo di calcolo. L'intervallo più grande genera valori più stabili."
msgid "Use SVDRP service" msgid "Use SVDRP service"
msgstr "Utilizza servizio SVDRP" msgstr "Utilizza servizio SVDRP"
@@ -175,6 +182,12 @@ 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"
@@ -184,9 +197,6 @@ 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"
@@ -203,7 +213,7 @@ msgid "Audio Stream"
msgstr "Flusso audio" msgstr "Flusso audio"
msgid "Channel Mode" msgid "Channel Mode"
msgstr "Modalit<EFBFBD> canale" msgstr "Modalità canale"
msgid "Sampling Frequency" msgid "Sampling Frequency"
msgstr "Frequenza campionamento" msgstr "Frequenza campionamento"
@@ -212,10 +222,10 @@ msgid "AC-3 Stream"
msgstr "Flusso AC-3" msgstr "Flusso AC-3"
msgid "Bit Stream Mode" msgid "Bit Stream Mode"
msgstr "Modalit<EFBFBD> bitstream" msgstr "Modalità bitstream"
msgid "Audio Coding Mode" msgid "Audio Coding Mode"
msgstr "Modalit<EFBFBD> codifica audio" msgstr "Modalità codifica audio"
msgid "Center Mix Level" msgid "Center Mix Level"
msgstr "Livello sonoro centrale" msgstr "Livello sonoro centrale"
@@ -224,7 +234,7 @@ msgid "Surround Mix Level"
msgstr "Livello sonoro surround" msgstr "Livello sonoro surround"
msgid "Dolby Surround Mode" msgid "Dolby Surround Mode"
msgstr "Modalit<EFBFBD> Dolby Surround" msgstr "Modalità Dolby Surround"
msgid "Low Frequency Effects" msgid "Low Frequency Effects"
msgstr "Effetti bassa frequenza" msgstr "Effetti bassa frequenza"
@@ -265,6 +275,9 @@ 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"

View File

@@ -1,16 +1,17 @@
# VDR plugin language source file. # VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg # Copyright (C) 2007-2014 Rolf Ahrenberg
# This file is distributed under the same license as the femon package. # This file is distributed under the same license as the femon package.
# Valdemaras Pipiras # Valdemaras Pipiras
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: femon 1.7.7\n" "Project-Id-Version: vdr-femon 2.0.4\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n" "POT-Creation-Date: 2014-03-15 03:15+0200\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n" "PO-Revision-Date: 2014-03-15 03:15+0200\n"
"Last-Translator: Valdemaras Pipiras\n" "Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
"Language-Team: <varas@ambernet.lt>\n" "Language-Team: Lithuanian <vdr@linuxtv.org>\n"
"Language: lt\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"
@@ -63,6 +64,9 @@ 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 "Paslėpti pagrindinio meniu įrašus" msgstr "Paslėpti pagrindinio meniu įrašus"
@@ -174,6 +178,12 @@ msgstr "Rid"
msgid "Coderate" msgid "Coderate"
msgstr "Kodavimo dažnis" msgstr "Kodavimo dažnis"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "Kokybė"
msgid "Stream Information" msgid "Stream Information"
msgstr "Srauto informacija" msgstr "Srauto informacija"
@@ -183,9 +193,6 @@ msgstr "Video srautas"
msgid "Codec" msgid "Codec"
msgstr "Kodekas" msgstr "Kodekas"
msgid "Bitrate"
msgstr "Kokybė"
msgid "Aspect Ratio" msgid "Aspect Ratio"
msgstr "Proporcijos" msgstr "Proporcijos"
@@ -264,6 +271,9 @@ 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"

View File

@@ -1,16 +1,17 @@
# VDR plugin language source file. # VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg # Copyright (C) 2007-2014 Rolf Ahrenberg
# This file is distributed under the same license as the femon package. # This file is distributed under the same license as the femon package.
# Vyacheslav Dikonov # Vyacheslav Dikonov
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: femon 1.7.7\n" "Project-Id-Version: vdr-femon 2.0.4\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n" "POT-Creation-Date: 2014-03-15 03:15+0200\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n" "PO-Revision-Date: 2014-03-15 03:15+0200\n"
"Last-Translator: Vyacheslav Dikonov\n" "Last-Translator: Vyacheslav Dikonov\n"
"Language-Team: <vdr@linuxtv.org>\n" "Language-Team: Russian <vdr@linuxtv.org>\n"
"Language: ru\n"
"MIME-Version: 1.0\n" "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"
@@ -63,6 +64,9 @@ 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>"
@@ -174,6 +178,12 @@ msgstr "Rid"
msgid "Coderate" msgid "Coderate"
msgstr "Coderate" msgstr "Coderate"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr ""
msgid "Stream Information" msgid "Stream Information"
msgstr "" msgstr ""
@@ -183,9 +193,6 @@ msgstr ""
msgid "Codec" msgid "Codec"
msgstr "" msgstr ""
msgid "Bitrate"
msgstr ""
msgid "Aspect Ratio" msgid "Aspect Ratio"
msgstr "" msgstr ""
@@ -264,6 +271,9 @@ msgstr ""
msgid "HE-AAC" msgid "HE-AAC"
msgstr "" msgstr ""
msgid "LATM"
msgstr ""
msgid "stereo" msgid "stereo"
msgstr "" msgstr ""

389
po/sk_SK.po Normal file
View File

@@ -0,0 +1,389 @@
# VDR plugin language source file.
# Copyright (C) 2007-2014 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Milan Hrala
#
msgid ""
msgstr ""
"Project-Id-Version: vdr-femon 2.0.4\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-03-15 03:15+0200\n"
"PO-Revision-Date: 2014-03-15 03:15+0200\n"
"Last-Translator: Milan Hrala <hrala.milan@gmail.com>\n"
"Language-Team: Slovak <vdr@linuxtv.org>\n"
"Language: sk\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=iso-8859-2\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "DVB Signal Information Monitor (OSD)"
msgstr "DVB Inform<72>cie o sign<67>le (OSD)"
msgid "Signal Information"
msgstr "Inform<72>cie o sign<67>le"
msgid "Femon not available"
msgstr "Femon nie je k dispoz<6F>cii"
msgid "basic"
msgstr "<22>tandardtn<74>"
msgid "transponder"
msgstr "Transpond<6E>r"
msgid "stream"
msgstr "d<>tov<6F> tok"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "Klasick<63>"
msgid "Elchi"
msgstr "Elchi"
msgid "ST:TNG"
msgstr "ST:TNG"
msgid "DeepBlue"
msgstr "tmavo modr<64>"
msgid "Moronimo"
msgstr "Moronimo"
msgid "Enigma"
msgstr "Enigma"
msgid "EgalsTry"
msgstr "EgalsTry"
msgid "Duotone"
msgstr "Duotone"
msgid "SilverGreen"
msgstr "strieborno zelen<65>"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry"
msgstr "Schova<76> polo<6C>ku v hlavnom menu"
msgid "Define whether the main menu entry is hidden."
msgstr "Ur<55>ite, <20>i v hlavnom menu bude polo<6C>ka skryt<79>."
msgid "Default display mode"
msgstr "<22>tandardn<64> re<72>im zobrazenia"
msgid "Define the default display mode at startup."
msgstr "Zadajte predvolen<65> re<72>im zobrazenia pri spusten<65>."
msgid "Define the used OSD skin."
msgstr "Zadajte pou<6F>it<69> OSD vzh<7A>ad."
msgid "Define the used OSD theme."
msgstr "Definujte pou<6F>it<69> OSD t<>mu."
msgid "Position"
msgstr "Poz<6F>cia"
msgid "Define the position of OSD."
msgstr "Definujte poz<6F>ciu OSD."
msgid "Downscale OSD size [%]"
msgstr "Zmen<65>i<EFBFBD> ve<76>kos<6F> OSD [%]"
msgid "Define the downscale ratio for OSD size."
msgstr "Zadajte zmen<65>enie pomeru pre OSD ve<76>kosti."
msgid "Red limit [%]"
msgstr "<22>erven<65> limit [%]"
msgid "Define a limit for red bar, which is used to indicate a bad signal."
msgstr "Zadajte limit pre <20>erven<65> pruh , ktor<6F> sa pou<6F><75>va na ozna<6E>enie zl<7A>ho sign<67>lu."
msgid "Green limit [%]"
msgstr "Zelen<65> limit [%]"
msgid "Define a limit for green bar, which is used to indicate a good signal."
msgstr "Zadajte limit pre zelen<65>ho pruhu, ktor<6F> sa pou<6F>ije na ozna<6E>enie dobr<62>ho sign<67>lu."
msgid "OSD update interval [0.1s]"
msgstr "OSD aktualiza<7A>n<EFBFBD> interval [0.1s]"
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
msgstr "Zadajte interval pre aktualiz<69>cie OSD. Men<65><6E> interval vytv<74>ra vy<76><79>ie za<7A>a<EFBFBD>enie CPU."
msgid "Analyze stream"
msgstr "Anal<61>za d<>tov<6F>ho toku"
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
msgstr "Zadajte <20>i sa DVB pr<70>d analyzuje a d<>tov<6F> tok vypo<70><6F>ta."
msgid "Calculation interval [0.1s]"
msgstr "V<>po<70>tov<6F> interval [0.1s]"
msgid "Define an interval for calculation. The bigger interval generates more stable values."
msgstr "Zadajte interval pre v<>po<70>et. V<><56><EFBFBD><EFBFBD> interval vytv<74>ra stabilnej<65>ie hodnoty."
msgid "Use SVDRP service"
msgstr "Pou<6F>i<EFBFBD> SVDRP slu<6C>bu"
msgid "Define whether the SVDRP service is used in client/server setups."
msgstr "Zadajte <20>i sa pou<6F>ije slu<6C>ba SVDRP v klient / server nastaveniach."
msgid "SVDRP service port"
msgstr "Port SVDRP slu<6C>by"
msgid "Define the port number of SVDRP service."
msgstr "Zadajte <20><>slo portu slu<6C>by SVDRP."
msgid "SVDRP service IP"
msgstr "IP SVDRP slu<6C>by"
msgid "Define the IP address of SVDRP service."
msgstr "zadajte IP adresu slu<6C>by SVDRP."
msgid "Help"
msgstr "Pomoc"
msgid "Video"
msgstr "Video"
msgid "Audio"
msgstr "Zvuk"
msgid "Transponder Information"
msgstr "Inform<72>cie transpond<6E>ra"
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 "r<>chlos<6F> k<>dovania"
msgid "Protocol"
msgstr "Protokol"
msgid "Bitrate"
msgstr "D<>tov<6F> tok"
msgid "Stream Information"
msgstr "Inform<72>cie o d<>tovom toku"
msgid "Video Stream"
msgstr "Video stopa"
msgid "Codec"
msgstr "kodek"
msgid "Aspect Ratio"
msgstr "Pomer str<74>n"
msgid "Frame Rate"
msgstr "Po<50>et sn<73>mkov"
msgid "Video Format"
msgstr "Video form<72>t"
msgid "Resolution"
msgstr "Rozl<7A><6C>enie"
msgid "Audio Stream"
msgstr "Zvukov<6F> stopa"
msgid "Channel Mode"
msgstr "re<72>im kan<61>la"
msgid "Sampling Frequency"
msgstr "Vzorkovacia frekvencia"
msgid "AC-3 Stream"
msgstr "AC-3 d<>tov<6F> tok"
msgid "Bit Stream Mode"
msgstr "re<72>im bitov<6F>ho toku"
msgid "Audio Coding Mode"
msgstr "Re<52><65>m k<>dovania zvuku"
msgid "Center Mix Level"
msgstr "<22>rove<76> Center mix"
msgid "Surround Mix Level"
msgstr "<22>rove<76> Surround mix"
msgid "Dolby Surround Mode"
msgstr "Dolby Surround re<72><65>m"
msgid "Low Frequency Effects"
msgstr "Basov<6F> efekty"
msgid "Dialogue Normalization"
msgstr "<22>tandartn<74> dial<61>g"
msgid "Fixed"
msgstr "Pevn<76>"
msgid "Analog"
msgstr "Anal<61>g"
msgid "MPEG-2"
msgstr "MPEG-2"
msgid "H.264"
msgstr "H.264"
msgid "MPEG-1 Layer I"
msgstr "MPEG-1 vrstva I"
msgid "MPEG-1 Layer II"
msgstr "MPEG-1 vrstva II"
msgid "MPEG-1 Layer III"
msgstr "MPEG-1 vrstva III"
msgid "MPEG-2 Layer I"
msgstr "MPEG-2 vrstva I"
msgid "MPEG-2 Layer II"
msgstr "MPEG-2 vrstva II"
msgid "MPEG-2 Layer III"
msgstr "MPEG-2 vrstva III"
msgid "HE-AAC"
msgstr "HE-AAC"
msgid "LATM"
msgstr "LATM"
msgid "stereo"
msgstr "stereo"
msgid "joint Stereo"
msgstr "spojen<65> stereo"
msgid "dual"
msgstr "dvojit<69>"
msgid "mono"
msgstr "mono"
msgid "interlaced"
msgstr "prekladan<61>"
msgid "progressive"
msgstr "progres<65>vny"
msgid "reserved"
msgstr "obsaden<65>"
msgid "extended"
msgstr "roz<6F><7A>ren<65>"
msgid "unknown"
msgstr "nezn<7A>my"
msgid "component"
msgstr "s<><73>as<61>"
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 "Kompletne hlavn<76> (CM)"
msgid "Music and Effects (ME)"
msgstr "Hudba a efekty (ME)"
msgid "Visually Impaired (VI)"
msgstr "zrakovo postihnut<75> (VI)"
msgid "Hearing Impaired (HI)"
msgstr "sluchovo postihnut<75> (HI)"
msgid "Dialogue (D)"
msgstr "Dial<61>g (D)"
msgid "Commentary (C)"
msgstr "Koment<6E>r (C)"
msgid "Emergency (E)"
msgstr "Pohotovostn<74> (E)"
msgid "Voice Over (VO)"
msgstr "Viacvrstvov<6F> hlas (VO)"
msgid "Karaoke"
msgstr "Karaoke"
msgid "Ch1"
msgstr "kan<61>l1"
msgid "Ch2"
msgstr "kan<61>l2"
msgid "C"
msgstr "C"
msgid "L"
msgstr "L"
msgid "R"
msgstr "R"
msgid "S"
msgstr "S"
msgid "SL"
msgstr "SL"
msgid "SR"
msgstr "SR"
msgid "dB"
msgstr "dB"
msgid "not indicated"
msgstr "nie je uveden<65>"
msgid "MHz"
msgstr "MHz"
msgid "free"
msgstr "vo<76>n<EFBFBD>"
msgid "Mbit/s"
msgstr "Mbit/s"
msgid "kbit/s"
msgstr "kbit/s"

389
po/uk_UA.po Normal file
View File

@@ -0,0 +1,389 @@
# 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 2.0.4\n"
"Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2014-03-15 03:15+0200\n"
"PO-Revision-Date: 2014-03-15 03:15+0200\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,16 +1,17 @@
# VDR plugin language source file. # VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg # Copyright (C) 2007-2014 Rolf Ahrenberg
# This file is distributed under the same license as the femon package. # This file is distributed under the same license as the femon package.
# Nan Feng VDR <nfgx@21cn.com>, 2009.2 # Nan Feng VDR <nfgx@21cn.com>, 2009.2
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: femon 1.7.7\n" "Project-Id-Version: vdr-femon 2.0.4\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n" "POT-Creation-Date: 2014-03-15 03:15+0200\n"
"PO-Revision-Date: 2009-09-21 21:36+0800\n" "PO-Revision-Date: 2014-03-15 03:15+0200\n"
"Last-Translator: NanFeng <nfgx@21cn.com>\n" "Last-Translator: NanFeng <nfgx@21cn.com>\n"
"Language-Team: <vdr@linuxtv.org>\n" "Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n" "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"
@@ -63,6 +64,9 @@ msgstr "双色调"
msgid "SilverGreen" msgid "SilverGreen"
msgstr "银绿" msgstr "银绿"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry" msgid "Hide main menu entry"
msgstr "隐藏主菜单条目." msgstr "隐藏主菜单条目."
@@ -174,6 +178,12 @@ msgstr "Rid"
msgid "Coderate" msgid "Coderate"
msgstr "码速率" msgstr "码速率"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "比特率"
msgid "Stream Information" msgid "Stream Information"
msgstr "流信息" msgstr "流信息"
@@ -183,9 +193,6 @@ msgstr "视频流"
msgid "Codec" msgid "Codec"
msgstr "解码模式" msgstr "解码模式"
msgid "Bitrate"
msgstr "比特率"
msgid "Aspect Ratio" msgid "Aspect Ratio"
msgstr "纵横比" msgstr "纵横比"
@@ -264,6 +271,9 @@ 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 "立体声" msgstr "立体声"

View File

@@ -1,16 +1,17 @@
# VDR plugin language source file. # VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg # Copyright (C) 2007-2014 Rolf Ahrenberg
# This file is distributed under the same license as the femon package. # This file is distributed under the same license as the femon package.
# Nan Feng VDR <nfgx@21cn.com>, 2009.2 # Nan Feng VDR <nfgx@21cn.com>, 2009.2
# #
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: femon 1.7.7\n" "Project-Id-Version: vdr-femon 2.0.4\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n" "Report-Msgid-Bugs-To: <see README>\n"
"POT-Creation-Date: 2010-02-25 20:31+0200\n" "POT-Creation-Date: 2014-03-15 03:15+0200\n"
"PO-Revision-Date: 2009-09-21 21:36+0800\n" "PO-Revision-Date: 2014-03-15 03:15+0200\n"
"Last-Translator: NanFeng <nfgx@21cn.com>\n" "Last-Translator: NanFeng <nfgx@21cn.com>\n"
"Language-Team: <vdr@linuxtv.org>\n" "Language-Team: Chinese (traditional) <vdr@linuxtv.org>\n"
"Language: zh_TW\n"
"MIME-Version: 1.0\n" "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"
@@ -63,6 +64,9 @@ msgstr "雙色調"
msgid "SilverGreen" msgid "SilverGreen"
msgstr "銀綠" msgstr "銀綠"
msgid "PearlHD"
msgstr "PearlHD"
msgid "Hide main menu entry" msgid "Hide main menu entry"
msgstr "隱藏主菜單條目." msgstr "隱藏主菜單條目."
@@ -174,6 +178,12 @@ msgstr "Rid"
msgid "Coderate" msgid "Coderate"
msgstr "碼速率" msgstr "碼速率"
msgid "Protocol"
msgstr ""
msgid "Bitrate"
msgstr "比特率"
msgid "Stream Information" msgid "Stream Information"
msgstr "流信息" msgstr "流信息"
@@ -183,9 +193,6 @@ msgstr "視頻流"
msgid "Codec" msgid "Codec"
msgstr "解碼模式" msgstr "解碼模式"
msgid "Bitrate"
msgstr "比特率"
msgid "Aspect Ratio" msgid "Aspect Ratio"
msgstr "縱橫比" msgstr "縱橫比"
@@ -264,6 +271,9 @@ 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 "立體聲" msgstr "立體聲"

23
symbols/format1080i.xpm Normal file
View File

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

23
symbols/format1080p.xpm Normal file
View File

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

23
symbols/format480i.xpm Normal file
View File

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

23
symbols/format480p.xpm Normal file
View File

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

23
symbols/format576i.xpm Normal file
View File

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

23
symbols/format576p.xpm Normal file
View File

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

23
symbols/format720i.xpm Normal file
View File

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

23
symbols/format720p.xpm Normal file
View File

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