mirror of
https://github.com/rofafor/vdr-plugin-femon.git
synced 2023-10-10 13:36:53 +02:00
Compare commits
1 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
b0b0fe4f02 |
6
.gitignore
vendored
6
.gitignore
vendored
@ -1,6 +0,0 @@
|
||||
.dependencies
|
||||
*.o
|
||||
*.so
|
||||
*~
|
||||
po/*.pot
|
||||
po/*.mo
|
314
HISTORY
314
HISTORY
@ -28,8 +28,7 @@ VDR Plugin 'femon' Revision History
|
||||
|
||||
- Redesigned the user interface.
|
||||
- Transponder information is now available in advanced display mode:
|
||||
Press 'OK' key to switch between the simple and the advanced display
|
||||
mode.
|
||||
Press 'OK' key to switch between the simple and the advanced display mode.
|
||||
- Moved bitrate calculation to it's own thread for improved accurancy.
|
||||
|
||||
2004-03-07: Version 0.0.3a
|
||||
@ -41,13 +40,12 @@ VDR Plugin 'femon' Revision History
|
||||
2004-03-16: Version 0.0.3b
|
||||
|
||||
- Fixed channel toggling with '0' key.
|
||||
- Bitrate calculation thread is now canceled immediately to speed up
|
||||
channel switching.
|
||||
- Bitrate calculation thread is now canceled immediately to speed up channel switching.
|
||||
|
||||
2004-04-04: Version 0.0.3c
|
||||
|
||||
- Fixed minor bitrate calculation errors.
|
||||
- Added Russian translation (Thanks to Vyacheslav Dikonov).
|
||||
- Added russian translation (Thanks to Vyacheslav Dikonov).
|
||||
|
||||
2004-05-31: Version 0.0.4
|
||||
|
||||
@ -65,7 +63,6 @@ VDR Plugin 'femon' Revision History
|
||||
|
||||
- Backported changes and fixes from version 0.1.6.
|
||||
|
||||
|
||||
===================================
|
||||
VDR Plugin 'femon' Revision History
|
||||
===================================
|
||||
@ -79,7 +76,7 @@ VDR Plugin 'femon' Revision History
|
||||
- Added "Stream Information" display mode.
|
||||
Toggle between different modes with 'OK' key:
|
||||
.-> basic -> transponder -> stream -.
|
||||
`-----------------------------------'
|
||||
`-----------------------------------´
|
||||
- Added missing german translations (Thanks to Peter Marquardt).
|
||||
|
||||
2004-06-06: Version 0.1.2
|
||||
@ -90,8 +87,7 @@ VDR Plugin 'femon' Revision History
|
||||
|
||||
2004-06-11: Version 0.1.3
|
||||
|
||||
- Added "AC-3 Stream Information" display mode (Thanks to Lothar
|
||||
Englisch).
|
||||
- Added "AC-3 Stream Information" display mode (Thanks to Lothar Englisch).
|
||||
|
||||
2004-06-24: Version 0.1.4
|
||||
|
||||
@ -103,8 +99,7 @@ VDR Plugin 'femon' Revision History
|
||||
|
||||
- Fixed OSDSTATUSWIN_XC define.
|
||||
- Added preliminary NTSC support (make NTSC_SYSTEM=1 plugins).
|
||||
- Fixed "Setup/OSD/Use Small Fonts" bug (Thanks to Winni for reporting
|
||||
this one).
|
||||
- Fixed "Setup/OSD/Use Small Fonts" bug (Thanks to Winni for reporting this one).
|
||||
- Added patches directory: CA system names by Lauri Tischler.
|
||||
|
||||
2004-09-11: Version 0.1.6
|
||||
@ -150,13 +145,12 @@ VDR Plugin 'femon' Revision History
|
||||
2005-04-01: Version 0.8.7
|
||||
|
||||
- Default make target is now all.
|
||||
- Fixed the access rights of symbols subdirectory (Thanks to Harri
|
||||
Kukkonen).
|
||||
- Fixed the access rights of symbols subdirectory (Thanks to Harri Kukkonen).
|
||||
- Added a new theme: Moronimo (Thanks to Morone).
|
||||
|
||||
2005-04-02: Version 0.8.8
|
||||
|
||||
- Cleaned up Finnish translations (Thanks to Ville Skyttä).
|
||||
- Cleaned up finnish translations (Thanks to Ville Skyttä).
|
||||
|
||||
2005-04-04: Version 0.8.9
|
||||
|
||||
@ -165,8 +159,7 @@ VDR Plugin 'femon' Revision History
|
||||
|
||||
2005-05-20: Version 0.9.0
|
||||
|
||||
- Renamed compiling switches ('DEBUG' to 'FEMON_DEBUG' and 'NTSC_SYSTEM'
|
||||
to 'FEMON_NTSC').
|
||||
- Renamed compiling switches ('DEBUG' to 'FEMON_DEBUG' and 'NTSC_SYSTEM' to 'FEMON_NTSC').
|
||||
- Enabled preliminary support for the device switching.
|
||||
|
||||
2005-07-23: Version 0.9.1
|
||||
@ -194,20 +187,19 @@ VDR Plugin 'femon' Revision History
|
||||
2005-11-13: Version 0.9.5
|
||||
|
||||
- Updated for vdr-1.3.36.
|
||||
- Added French translation (Thanks to Nicolas Huillard).
|
||||
- Added french translation (Thanks to Nicolas Huillard).
|
||||
- Enabled bitrate commands via SVDRP.
|
||||
- Added new SVDRP commands.
|
||||
- Modified femon service without incrementing version number.
|
||||
- Added "Duotone" theme for 2bpp on screen displays.
|
||||
- Fixed crash bug in femonreceiver.
|
||||
- Fixed setup page bug (Thanks to Thomas Günther for reporting this one).
|
||||
- Fixed setup page bug (Thanks to Thomas Günther for reporting this one).
|
||||
|
||||
2006-01-25: Version 0.9.6
|
||||
|
||||
- Updated for vdr-1.3.40.
|
||||
- Fixed a translation bug (Thanks to Antti Hartikainen).
|
||||
- Fixed AC3 header parsing bug (Thanks to Axel Katzur for reporting this
|
||||
one).
|
||||
- Fixed AC3 header parsing bug (Thanks to Axel Katzur for reporting this one).
|
||||
- Fixed EgalsTry theme (Thanks to Uwe Hanke).
|
||||
|
||||
2006-02-06: Version 0.9.7
|
||||
@ -228,14 +220,14 @@ VDR Plugin 'femon' Revision History
|
||||
|
||||
2006-04-23: Version 0.9.10
|
||||
|
||||
- Added STRIP option for Makefile (Thanks to Ville Skyttä).
|
||||
- Added STRIP option for Makefile (Thanks to Ville Skyttä).
|
||||
- Modified APIVERSION code in Makefile.
|
||||
|
||||
2006-04-30: Version 1.0.0
|
||||
|
||||
- Updated for vdr-1.4.0.
|
||||
- Modified APIVERSION code in Makefile.
|
||||
- Updated German translation (Thanks to Andreas Brachold).
|
||||
- Updated german translation (Thanks to Andreas Brachold).
|
||||
|
||||
2006-06-06: Version 1.0.1
|
||||
|
||||
@ -245,7 +237,7 @@ VDR Plugin 'femon' Revision History
|
||||
2006-09-17: Version 1.1.0
|
||||
|
||||
- Added support for svdrpservice plugin (Thanks to Frank Schmirler).
|
||||
- Added INFO SVDRP command (partially based on patch by Herbert Pötzl).
|
||||
- Added INFO SVDRP command (partially based on patch by Herbert Pötzl).
|
||||
- Removed system log option - use SVDRP instead.
|
||||
- Added --remove-destination to the 'cp' command in Makefile.
|
||||
|
||||
@ -255,8 +247,7 @@ VDR Plugin 'femon' Revision History
|
||||
|
||||
2007-05-01: Version 1.1.2
|
||||
|
||||
- Fixed opening while replaying (Thanks to Antti Seppälä for reporting
|
||||
this one).
|
||||
- Fixed opening while replaying (Thanks to Antti Seppälä for reporting this one).
|
||||
|
||||
2007-05-15: Version 1.1.3
|
||||
|
||||
@ -266,11 +257,6 @@ VDR Plugin 'femon' Revision History
|
||||
|
||||
- Backported from 1.2.2.
|
||||
|
||||
2008-01-20: Version 1.1.5
|
||||
|
||||
- Updated Italian translation (Thanks to Diego Pierotto).
|
||||
- Added '-Wno-parentheses' to the compiler options.
|
||||
|
||||
2007-08-14: Version 1.2.0
|
||||
|
||||
- Updated for vdr-1.5.7.
|
||||
@ -283,271 +269,3 @@ VDR Plugin 'femon' Revision History
|
||||
|
||||
- Added Spids support.
|
||||
- Minor OSD layout changes.
|
||||
|
||||
2008-01-20: Version 1.2.3
|
||||
|
||||
- Updated Italian translation (Thanks to Diego Pierotto).
|
||||
- Added '-Wno-parentheses' to the compiler options.
|
||||
- Mapped 'kInfo' as help key in setup menu.
|
||||
|
||||
2008-02-18: Version 1.2.4
|
||||
|
||||
- Replaced asprintf with cString.
|
||||
- Updated French translation (Thanks to Michaël Nival).
|
||||
- Fixed service call with null data.
|
||||
- Added setup option to use a single 8 bpp OSD area.
|
||||
|
||||
2008-03-27: Version 1.6.0
|
||||
|
||||
- Updated for vdr-1.6.0.
|
||||
- Updated Italian translation (Thanks to Diego Pierotto).
|
||||
- Added ST:TNG theme (Thanks to Fabian Förg).
|
||||
|
||||
2008-06-20: Version 1.6.1
|
||||
|
||||
- Updated Italian translation (Thanks to Diego Pierotto).
|
||||
- Fixed a crash if no channel available (Thanks to Winfried Köhler).
|
||||
|
||||
2008-10-12: Version 1.6.2
|
||||
|
||||
- Converted HISTORY and fi_FI.po to UTF-8.
|
||||
- Optimized receiver and OSD thread termination.
|
||||
|
||||
2008-11-09: Version 1.6.3
|
||||
|
||||
- Added initial support for H.264 and HE-AAC.
|
||||
- Fixed detection of false positives in audio/video streams.
|
||||
- Refactored source code.
|
||||
|
||||
2008-11-30: Version 1.6.4
|
||||
|
||||
- Added new helper functions.
|
||||
- Updated Italian translation (Thanks to Diego Pierotto).
|
||||
- Fixed a memory leak.
|
||||
- Added a check for the minimum OSD height.
|
||||
- Replaced "Use single area (8bpp)" option with VDR's
|
||||
"Setup/OSD/Anti-alias".
|
||||
- Removed the FEMON_NTSC option.
|
||||
- Fixed a deadlock in cFemonReceiver (Thanks to Antti Seppälä for
|
||||
reporting this one).
|
||||
|
||||
2008-12-16: Version 1.6.5
|
||||
|
||||
- Backported from 1.7.0.
|
||||
|
||||
2009-01-06: Version 1.6.6
|
||||
|
||||
- Backported from 1.7.1.
|
||||
|
||||
2009-06-18: Version 1.6.7
|
||||
|
||||
- Backported from 1.7.2.
|
||||
|
||||
|
||||
===================================
|
||||
VDR Plugin 'femon' Revision History
|
||||
===================================
|
||||
|
||||
2008-12-16: Version 1.7.0
|
||||
|
||||
- Updated for vdr-1.7.2.
|
||||
- Added whitespace cleanups.
|
||||
- Changed info window to use the channel source instead of the frontend
|
||||
type.
|
||||
- Removed the "Show CA system" setup option.
|
||||
|
||||
2009-01-06: Version 1.7.1
|
||||
|
||||
- Fixed closing of frontend file handles (Thanks to Brendon Higgins for
|
||||
reporting this one).
|
||||
|
||||
2009-06-18: Version 1.7.2
|
||||
|
||||
- Cleaned up compilation warnings.
|
||||
- Fixed font handling to be thread-safe.
|
||||
|
||||
2009-08-29: Version 1.7.3
|
||||
|
||||
- Removed OSD offset and height options.
|
||||
- Added PES assembler.
|
||||
- Added bitstream parsers for all codecs.
|
||||
|
||||
2009-09-04: Version 1.7.4
|
||||
|
||||
- Fixed H.264 bitstream parser.
|
||||
- Added a mutex to receiver class.
|
||||
- Added 1080/720/576/480 format symbols into status window.
|
||||
|
||||
2009-10-01: Version 1.7.5
|
||||
|
||||
- Changed H.264 parser to show display aspect ratio.
|
||||
- Removed error logging from unimplemented ioctl functions.
|
||||
- Removed bitstream parsing from Receive() method.
|
||||
- Added Chinese translation (Thanks to NanFeng).
|
||||
|
||||
2010-02-01: Version 1.7.6
|
||||
|
||||
- Updated for vdr-1.7.12.
|
||||
- Updated Estonian translation (Thanks to Arthur Konovalov).
|
||||
- Added Lithuanian translation (Thanks to Valdemaras Pipiras).
|
||||
|
||||
2010-03-05: Version 1.7.7
|
||||
|
||||
- Updated for vdr-1.7.13.
|
||||
- Added a setup option to downscale the OSD size.
|
||||
- Updated Estonian translation (Thanks to Arthur Konovalov).
|
||||
|
||||
2010-06-23: Version 1.7.8
|
||||
|
||||
- Fixed device switching.
|
||||
- Added preliminary support for LATM.
|
||||
- Updated Italian translation (Thanks to Diego Pierotto).
|
||||
- Fixed a crash in femon service (Thanks to Wolfgang Astleitner).
|
||||
|
||||
2010-12-27: Version 1.7.9
|
||||
|
||||
- Updated for vdr-1.7.16.
|
||||
- Added Makefile depencency for objects.
|
||||
- Fixed detection of replaying.
|
||||
- Added support for LDFLAGS.
|
||||
|
||||
2011-05-15: Version 1.7.10
|
||||
|
||||
- Updated for vdr-1.7.18.
|
||||
- Added scaling for symbols.
|
||||
|
||||
2011-12-04: Version 1.7.11
|
||||
|
||||
- Updated for vdr-1.7.22: New API functions for signal strength
|
||||
and quality used to provide information for the OSD.
|
||||
- Added cppcheck target into Makefile.
|
||||
- Refactored bitstream code.
|
||||
|
||||
2012-01-15: Version 1.7.12
|
||||
|
||||
- Updated for vdr-1.7.23.
|
||||
- Updated SVDRP interface.
|
||||
- Added Hungarian translation (Thanks to Fuley Istvan).
|
||||
|
||||
2012-02-05: Version 1.7.13
|
||||
|
||||
- Added initial support for PVRINPUT devices (Thanks to Winfried Köhler).
|
||||
- Added initial support for IPTV devices.
|
||||
|
||||
2012-03-10: Version 1.7.14
|
||||
|
||||
- Updated for vdr-1.7.26.
|
||||
|
||||
2012-03-12: Version 1.7.15
|
||||
|
||||
- Cleaned up compilation warnings.
|
||||
- Fixed channel switching.
|
||||
|
||||
2012-03-25: Version 1.7.16
|
||||
|
||||
- Updated for vdr-1.7.27.
|
||||
- Cleaned up compilation warnings again.
|
||||
|
||||
2012-04-02: Version 1.7.17
|
||||
|
||||
- Added the dynamite compatibility patch (Thanks to Lars Hanisch).
|
||||
- Silenced error log messages when accessing pseudo devices.
|
||||
- Added a new theme: PearlHD (Thanks to Taipan @ VDRPortal).
|
||||
- Added the transponder info window support for IPTV devices.
|
||||
|
||||
2013-02-10: Version 1.7.18
|
||||
|
||||
- Updated for vdr-1.7.37.
|
||||
- Modified how the receiver is detached.
|
||||
- Added Ukrainian translation (Thanks to Yarema aka Knedlyk).
|
||||
|
||||
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.
|
||||
|
||||
|
||||
===================================
|
||||
VDR Plugin 'femon' Revision History
|
||||
===================================
|
||||
|
||||
2014-03-16: Version 2.1.0
|
||||
|
||||
- Updated for vdr-2.1.6.
|
||||
|
||||
2014-05-10: Version 2.1.1
|
||||
|
||||
- Fixed the channel frequency value.
|
||||
|
||||
2015-01-10: Version 2.1.2
|
||||
|
||||
|
||||
===================================
|
||||
VDR Plugin 'femon' Revision History
|
||||
===================================
|
||||
|
||||
2015-02-19: Version 2.2.0
|
||||
|
||||
- Updated for vdr-2.2.0.
|
||||
- Updated CA definitions.
|
||||
- Fixed the SVDRP service IP menu item (Thanks to Toerless Eckert).
|
||||
- Fixed the detaching of receiver during a channel switch.
|
||||
|
||||
2015-04-04: Version 2.2.1
|
||||
|
||||
- Got rid of FEMON_DEBUG.
|
||||
- Added support for tracing modes.
|
||||
- Removed the 'femonclient' plugin.
|
||||
|
||||
|
||||
===================================
|
||||
VDR Plugin 'femon' Revision History
|
||||
===================================
|
||||
|
||||
2017-06-24: Version 2.3.0
|
||||
|
||||
- Updated for vdr-2.3.7.
|
||||
- Added support for H.265 video codec.
|
||||
- Fixed frontend handling during a device switch.
|
||||
- Added Polish translation (Thanks to Tomasz Nowak).
|
||||
- Updated German translation (Thanks to Andreas Brachold).
|
||||
|
||||
|
||||
===================================
|
||||
VDR Plugin 'femon' Revision History
|
||||
===================================
|
||||
|
||||
2018-04-15: Version 2.4.0
|
||||
|
||||
- Updated for vdr-2.4.0.
|
||||
|
||||
2019-xx-xx: Version 2.4.1
|
||||
|
||||
- Added signal level units (Thanks to Winfried).
|
||||
|
128
Makefile
128
Makefile
@ -1,59 +1,63 @@
|
||||
#
|
||||
# Makefile for Frontend Status Monitor plugin
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id$
|
||||
|
||||
# Debugging on/off
|
||||
#FEMON_DEBUG = 1
|
||||
|
||||
# NTSC on/off
|
||||
#FEMON_NTSC = 1
|
||||
|
||||
# Strip debug symbols? Set eg. to /bin/true if not
|
||||
STRIP = strip
|
||||
|
||||
# The official name of this 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.
|
||||
|
||||
#
|
||||
PLUGIN = femon
|
||||
|
||||
### 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')
|
||||
GITTAG = $(shell git describe --always 2>/dev/null)
|
||||
|
||||
### The C++ compiler and options:
|
||||
|
||||
CXX ?= g++
|
||||
CXXFLAGS ?= -fPIC -g -O2 -Wall -Woverloaded-virtual
|
||||
|
||||
### The directory environment:
|
||||
|
||||
# Use package data if installed...otherwise assume we're under the VDR source directory:
|
||||
PKGCFG = $(if $(VDRDIR),$(shell pkg-config --variable=$(1) $(VDRDIR)/vdr.pc),$(shell PKG_CONFIG_PATH="$$PKG_CONFIG_PATH:../../.." pkg-config --variable=$(1) vdr))
|
||||
LIBDIR = $(call PKGCFG,libdir)
|
||||
LOCDIR = $(call PKGCFG,locdir)
|
||||
PLGCFG = $(call PKGCFG,plgcfg)
|
||||
#
|
||||
TMPDIR ?= /tmp
|
||||
|
||||
### The compiler options:
|
||||
|
||||
export CFLAGS = $(call PKGCFG,cflags)
|
||||
export CXXFLAGS = $(call PKGCFG,cxxflags)
|
||||
STRIP ?= /bin/true
|
||||
|
||||
### The version number of VDR's plugin API:
|
||||
|
||||
APIVERSION = $(call PKGCFG,apiversion)
|
||||
VDRDIR = ../../..
|
||||
LIBDIR = ../../lib
|
||||
TMPDIR = /tmp
|
||||
|
||||
### Allow user defined options to overwrite defaults:
|
||||
|
||||
-include $(PLGCFG)
|
||||
-include $(VDRDIR)/Make.config
|
||||
|
||||
### The version number of VDR's plugin API (taken from VDR's "config.h"):
|
||||
|
||||
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
|
||||
|
||||
### The name of the distribution archive:
|
||||
|
||||
ARCHIVE = $(PLUGIN)-$(VERSION)
|
||||
PACKAGE = vdr-$(ARCHIVE)
|
||||
|
||||
### The name of the shared object file:
|
||||
|
||||
SOFILE = libvdr-$(PLUGIN).so
|
||||
|
||||
### Includes and Defines (add further entries here):
|
||||
|
||||
INCLUDES +=
|
||||
INCLUDES += -I$(VDRDIR)/include
|
||||
|
||||
DEFINES += -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
|
||||
|
||||
ifneq ($(strip $(GITTAG)),)
|
||||
DEFINES += -DGITVERSION='"-GIT-$(GITTAG)"'
|
||||
ifdef FEMON_NTSC
|
||||
DEFINES += -DNTSC
|
||||
endif
|
||||
|
||||
ifdef FEMON_DEBUG
|
||||
DEFINES += -DDEBUG
|
||||
endif
|
||||
|
||||
.PHONY: all all-redirect
|
||||
@ -61,71 +65,36 @@ all-redirect: all
|
||||
|
||||
### The object files (add further files here):
|
||||
|
||||
OBJS = $(PLUGIN).o aac.o ac3.o config.o h264.o h265.o latm.o mpeg.o osd.o receiver.o setup.o symbol.o tools.o
|
||||
OBJS = femon.o femonosd.o femonreceiver.o femoncfg.o femoni18n.o femontools.o
|
||||
|
||||
### The main target:
|
||||
|
||||
all: $(SOFILE) i18n
|
||||
all: libvdr-$(PLUGIN).so
|
||||
|
||||
### Implicit rules:
|
||||
|
||||
%.o: %.c
|
||||
@echo CC $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) -o $@ $<
|
||||
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
|
||||
|
||||
### Dependencies:
|
||||
# Dependencies:
|
||||
|
||||
MAKEDEP = $(CXX) -MM -MG
|
||||
MAKEDEP = g++ -MM -MG
|
||||
DEPFILE = .dependencies
|
||||
$(DEPFILE): Makefile
|
||||
$(Q)$(MAKEDEP) $(CXXFLAGS) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
|
||||
|
||||
-include $(DEPFILE)
|
||||
|
||||
### Internationalization (I18N):
|
||||
|
||||
PODIR = po
|
||||
I18Npo = $(wildcard $(PODIR)/*.po)
|
||||
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
|
||||
|
||||
%.mo: %.po
|
||||
@echo MO $@
|
||||
$(Q)msgfmt -c -o $@ $<
|
||||
|
||||
$(I18Npot): $(wildcard *.c)
|
||||
@echo GT $@
|
||||
$(Q)xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --package-name=vdr-$(PLUGIN) --package-version=$(VERSION) --msgid-bugs-address='<see README>' -o $@ `ls $^`
|
||||
|
||||
%.po: $(I18Npot)
|
||||
@echo PO $@
|
||||
$(Q)msgmerge -U --no-wrap --no-location --backup=none -q -N $@ $<
|
||||
@touch $@
|
||||
|
||||
$(I18Nmsgs): $(DESTDIR)$(LOCDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
|
||||
@echo IN $@
|
||||
$(Q)install -D -m644 $< $@
|
||||
|
||||
.PHONY: i18n
|
||||
i18n: $(I18Nmo) $(I18Npot)
|
||||
|
||||
install-i18n: $(I18Nmsgs)
|
||||
|
||||
### Targets:
|
||||
|
||||
$(SOFILE): $(OBJS)
|
||||
@echo LD $@
|
||||
$(Q)$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
|
||||
$(Q)$(STRIP) $@
|
||||
libvdr-$(PLUGIN).so: $(OBJS)
|
||||
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
|
||||
ifndef FEMON_DEBUG
|
||||
@$(STRIP) $@
|
||||
endif
|
||||
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
|
||||
|
||||
install-lib: $(SOFILE)
|
||||
@echo IN $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||
$(Q)install -D $^ $(DESTDIR)$(LIBDIR)/$^.$(APIVERSION)
|
||||
|
||||
install: install-lib install-i18n
|
||||
|
||||
dist: $(I18Npo) clean
|
||||
dist: clean
|
||||
@-rm -rf $(TMPDIR)/$(ARCHIVE)
|
||||
@mkdir $(TMPDIR)/$(ARCHIVE)
|
||||
@cp -a * $(TMPDIR)/$(ARCHIVE)
|
||||
@ -134,9 +103,4 @@ dist: $(I18Npo) clean
|
||||
@echo Distribution package created as $(PACKAGE).tgz
|
||||
|
||||
clean:
|
||||
@-rm -f $(PODIR)/*.mo $(PODIR)/*.pot
|
||||
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
|
||||
|
||||
.PHONY: cppcheck
|
||||
cppcheck:
|
||||
$(Q)cppcheck --language=c++ --enable=all -v -f $(OBJS:%.o=%.c)
|
||||
|
36
README
36
README
@ -15,7 +15,7 @@ See the file COPYING for license information.
|
||||
|
||||
Requirements:
|
||||
|
||||
VDR and a DVB card.
|
||||
VDR & DVB. BMW & Ph.D.. BEER. YARRR!
|
||||
|
||||
Description:
|
||||
|
||||
@ -26,22 +26,25 @@ transponder and stream information are also available in advanced display modes.
|
||||
|
||||
The plugin is based on a neat console frontend status monitor application
|
||||
called 'femon' by Johannes Stezenbach (see DVB-apps/szap/femon.c for further
|
||||
information).
|
||||
information). The bitrate calculation trick originates from the 'dvbstream'
|
||||
application by Dave Chapman and the stream information routines are taken from
|
||||
the 'libdvb' library by Metzler Brothers.
|
||||
|
||||
Terminology:
|
||||
|
||||
--------------------------------------------------------------
|
||||
|## Channel Name ################### [SVDRP][AR][VF][A/DD][D]|
|
||||
|[=====Signal Strength ===================|=================]|
|
||||
|[=====Signal Quality ================|=====================]|
|
||||
| STR: 0 CNR: 0 BER: 0 PER: 0 Video: 0 Audio: 0 |
|
||||
|[=====Signal Strength in % ==============|=================]|
|
||||
|[=====Signal-to-Noise Ratio in % ========|=================]|
|
||||
| STR: #0000 (0%) BER: #00000000 Video: 0 Mbit/s |
|
||||
| SNR: #0000 (0%) UNC: #00000000 Audio: 0 kbit/s |
|
||||
| [LOCK] [SIGNAL] [CARRIER] [VITERBI] [SYNC] |
|
||||
--------------------------------------------------------------
|
||||
|
||||
STR - Signal strength in dBm/dBuV/dbV
|
||||
CNR - Signal-to-noise ratio of the main carrier in dB
|
||||
BER - Bit error rate after the forward error correction (FEC) done by inner code block
|
||||
PER - Block error rate after the outer forward error correction coding
|
||||
STR - Signal strength
|
||||
SNR - Signal-to-noise ratio
|
||||
BER - Bit error rate
|
||||
UNC - Uncorrected blocks
|
||||
Video - Calculated video bitrate in Mbit/s
|
||||
Audio - Calculated audio / AC-3 bitrate in kbit/s
|
||||
|
||||
@ -70,8 +73,13 @@ Left/Right - Switch to next/previous device that provides the current channel
|
||||
|
||||
Installation:
|
||||
|
||||
cd /put/your/path/here/VDR/PLUGINS/src
|
||||
tar -xzf /put/your/path/here/vdr-femon-X.Y.Z.tgz
|
||||
make -C femon-X.Y.Z install
|
||||
ln -s femon-X.Y.Z femon
|
||||
cd /put/your/path/here/VDR
|
||||
make
|
||||
make plugins
|
||||
./vdr -P femon
|
||||
|
||||
Client-server architecture:
|
||||
|
||||
@ -91,6 +99,9 @@ the local device number.
|
||||
|
||||
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.
|
||||
|
||||
- The signal strength and signal-to-noise ratio values are comparable only
|
||||
@ -98,8 +109,9 @@ Notes:
|
||||
specifications those values cannot be calculated into any real units.
|
||||
|
||||
- If the OSD isn't visible, you've configured the OSD height too big or too
|
||||
small. Please, try to adjust the variable on the OSD setup page before
|
||||
writing any bug reports.
|
||||
small. Please, try to adjust the variable on the setup page before writing
|
||||
any bug reports. NTSC users should use a shrinked default OSD height by
|
||||
compiling the plugin with: make FEMON_NTSC=1
|
||||
|
||||
- If the SVDRP service is used: femon won't notice if the server is tuned
|
||||
to a different channel and tuning the channel on the server might annoy
|
||||
|
105
aac.c
105
aac.c
@ -1,105 +0,0 @@
|
||||
/*
|
||||
* aac.c: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "tools.h"
|
||||
#include "aac.h"
|
||||
|
||||
#define IS_HEAAC_AUDIO(buf) (((buf)[0] == 0xFF) && (((buf)[1] & 0xF6) == 0xF0))
|
||||
|
||||
int cFemonAAC::sampleRateS[16] =
|
||||
{
|
||||
96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, -1, -1, -1, -1
|
||||
};
|
||||
|
||||
cFemonAAC::cFemonAAC(cFemonAudioIf *audioHandlerP)
|
||||
: audioHandlerM(audioHandlerP)
|
||||
{
|
||||
}
|
||||
|
||||
cFemonAAC::~cFemonAAC()
|
||||
{
|
||||
}
|
||||
|
||||
bool cFemonAAC::processAudio(const uint8_t *bufP, int lenP)
|
||||
{
|
||||
cFemonBitStream bs(bufP, lenP * 8);
|
||||
|
||||
if (!audioHandlerM)
|
||||
return false;
|
||||
|
||||
/* ADTS Fixed Header:
|
||||
* syncword 12b always: '111111111111'
|
||||
* id 1b 0: MPEG-4, 1: MPEG-2
|
||||
* layer 2b always: '00'
|
||||
* protection_absent 1b
|
||||
* profile 2b 0: Main profile AAC MAIN 1: Low Complexity profile (LC) AAC LC 2: Scalable Sample Rate profile (SSR) AAC SSR 3: (reserved) AAC LTP
|
||||
* sampling_frequency_index 4b
|
||||
* private_bit 1b
|
||||
* channel_configuration 3b
|
||||
* original/copy 1b
|
||||
* home 1b
|
||||
* emphasis 2b only if ID == 0 (ie MPEG-4)
|
||||
*/
|
||||
|
||||
// skip PES header
|
||||
if (!PesLongEnough(lenP))
|
||||
return false;
|
||||
bs.SkipBits(8 * PesPayloadOffset(bufP));
|
||||
|
||||
// HE-AAC audio detection
|
||||
if (bs.GetBits(12) != 0xFFF) // syncword
|
||||
return false;
|
||||
|
||||
bs.SkipBit(); // id
|
||||
|
||||
// layer must be 0
|
||||
if (bs.GetBits(2)) // layer
|
||||
return false;
|
||||
|
||||
bs.SkipBit(); // protection_absent
|
||||
bs.SkipBits(2); // profile
|
||||
int sampling_frequency_index = bs.GetBits(4); // sampling_frequency_index
|
||||
bs.SkipBit(); // private pid
|
||||
int channel_configuration = bs.GetBits(3); // channel_configuration
|
||||
|
||||
audioHandlerM->SetAudioCodec(AUDIO_CODEC_HEAAC);
|
||||
audioHandlerM->SetAudioBitrate(AUDIO_BITRATE_RESERVED);
|
||||
|
||||
switch (channel_configuration) {
|
||||
case 0:
|
||||
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_STEREO);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_JOINT_STEREO);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_DUAL);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_SINGLE);
|
||||
break;
|
||||
|
||||
default:
|
||||
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_INVALID);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (sampling_frequency_index) {
|
||||
case 0xC ... 0xF:
|
||||
audioHandlerM->SetAudioSamplingFrequency(AUDIO_SAMPLING_FREQUENCY_RESERVED);
|
||||
break;
|
||||
|
||||
default:
|
||||
audioHandlerM->SetAudioSamplingFrequency(sampleRateS[sampling_frequency_index]);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
26
aac.h
26
aac.h
@ -1,26 +0,0 @@
|
||||
/*
|
||||
* aac.h: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __FEMON_AAC_H
|
||||
#define __FEMON_AAC_H
|
||||
|
||||
#include "audio.h"
|
||||
|
||||
class cFemonAAC {
|
||||
private:
|
||||
cFemonAudioIf *audioHandlerM;
|
||||
|
||||
static int sampleRateS[16];
|
||||
|
||||
public:
|
||||
cFemonAAC(cFemonAudioIf *audioHandlerP);
|
||||
virtual ~cFemonAAC();
|
||||
|
||||
bool processAudio(const uint8_t *bufP, int lenP);
|
||||
};
|
||||
|
||||
#endif //__FEMON_AAC_H
|
93
ac3.c
93
ac3.c
@ -1,93 +0,0 @@
|
||||
/*
|
||||
* ac3.c: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* AC3 Audio Header: http://www.atsc.org/standards/a_52a.pdf
|
||||
*/
|
||||
|
||||
#include "tools.h"
|
||||
#include "ac3.h"
|
||||
|
||||
int cFemonAC3::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
|
||||
};
|
||||
|
||||
int cFemonAC3::frequencieS[4] =
|
||||
{
|
||||
480, 441, 320, 0
|
||||
};
|
||||
|
||||
int cFemonAC3::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},
|
||||
{69, 87, 104, 121, 139, 174, 208, 243, 278, 348, 417, 487, 557, 696, 835, 975, 1114, 1253, 1393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{96, 120, 144, 168, 192, 240, 288, 336, 384, 480, 576, 672, 768, 960, 1152, 1344, 1536, 1728, 1920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
cFemonAC3::cFemonAC3(cFemonAC3If *audioHandlerP)
|
||||
: audioHandlerM(audioHandlerP)
|
||||
{
|
||||
}
|
||||
|
||||
cFemonAC3::~cFemonAC3()
|
||||
{
|
||||
}
|
||||
|
||||
bool cFemonAC3::processAudio(const uint8_t *bufP, int lenP)
|
||||
{
|
||||
int fscod, frmsizcod, bsmod, acmod;
|
||||
int centermixlevel = AUDIO_CENTER_MIX_LEVEL_INVALID;
|
||||
int surroundmixlevel = AUDIO_SURROUND_MIX_LEVEL_INVALID;
|
||||
int dolbysurroundmode = AUDIO_DOLBY_SURROUND_MODE_INVALID;
|
||||
cFemonBitStream bs(bufP, lenP * 8);
|
||||
|
||||
if (!audioHandlerM)
|
||||
return false;
|
||||
|
||||
// skip PES header
|
||||
if (!PesLongEnough(lenP))
|
||||
return false;
|
||||
bs.SkipBits(8 * PesPayloadOffset(bufP));
|
||||
|
||||
// http://rmworkshop.com/dvd_info/related_info/ac3hdr.htm
|
||||
|
||||
// AC3 audio detection
|
||||
if (bs.GetBits(16) != 0x0B77) // syncword
|
||||
return false;
|
||||
|
||||
bs.SkipBits(16); // CRC1
|
||||
|
||||
fscod = bs.GetBits(2); // sampling rate values
|
||||
frmsizcod = bs.GetBits(6); // frame size code
|
||||
|
||||
bs.SkipBits(5); // bitstream id
|
||||
bsmod = bs.GetBits(3); // bitstream mode
|
||||
acmod = bs.GetBits(3); // audio coding mode
|
||||
|
||||
// 3 front channels
|
||||
if ((acmod & 0x01) && (acmod != 0x01))
|
||||
centermixlevel = bs.GetBits(2);
|
||||
|
||||
// if a surround channel exists
|
||||
if (acmod & 0x04)
|
||||
surroundmixlevel = bs.GetBits(2);
|
||||
|
||||
// if in 2/0 mode
|
||||
if (acmod == 0x02)
|
||||
dolbysurroundmode = bs.GetBits(2);
|
||||
|
||||
audioHandlerM->SetAC3Bitrate(1000 * bitrateS[frmsizcod >> 1]);
|
||||
audioHandlerM->SetAC3SamplingFrequency(100 * frequencieS[fscod]);
|
||||
audioHandlerM->SetAC3Bitstream(bsmod);
|
||||
audioHandlerM->SetAC3AudioCoding(acmod);
|
||||
audioHandlerM->SetAC3CenterMix(centermixlevel);
|
||||
audioHandlerM->SetAC3SurroundMix(surroundmixlevel);
|
||||
audioHandlerM->SetAC3DolbySurround(dolbysurroundmode);
|
||||
|
||||
audioHandlerM->SetAC3LFE(bs.GetBit()); // low frequency effects on
|
||||
audioHandlerM->SetAC3Dialog(bs.GetBits(5)); // dialog normalization
|
||||
|
||||
return true;
|
||||
}
|
28
ac3.h
28
ac3.h
@ -1,28 +0,0 @@
|
||||
/*
|
||||
* ac3.h: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __FEMON_AC3_H
|
||||
#define __FEMON_AC3_H
|
||||
|
||||
#include "audio.h"
|
||||
|
||||
class cFemonAC3 {
|
||||
private:
|
||||
cFemonAC3If *audioHandlerM;
|
||||
|
||||
static int bitrateS[32];
|
||||
static int frequencieS[4];
|
||||
static int frameS[3][32];
|
||||
|
||||
public:
|
||||
cFemonAC3(cFemonAC3If *audioHandlerP);
|
||||
virtual ~cFemonAC3();
|
||||
|
||||
bool processAudio(const uint8_t *bufP, int lenP);
|
||||
};
|
||||
|
||||
#endif //__FEMON_AC3_H
|
150
audio.h
150
audio.h
@ -1,150 +0,0 @@
|
||||
/*
|
||||
* audio.h: Frontend Status Monitor plugin for the AUDIO Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __FEMON_AUDIO_H
|
||||
#define __FEMON_AUDIO_H
|
||||
|
||||
enum eAudioCodec {
|
||||
AUDIO_CODEC_INVALID = -1,
|
||||
AUDIO_CODEC_UNKNOWN,
|
||||
AUDIO_CODEC_MPEG1_I,
|
||||
AUDIO_CODEC_MPEG1_II,
|
||||
AUDIO_CODEC_MPEG1_III,
|
||||
AUDIO_CODEC_MPEG2_I,
|
||||
AUDIO_CODEC_MPEG2_II,
|
||||
AUDIO_CODEC_MPEG2_III,
|
||||
AUDIO_CODEC_HEAAC,
|
||||
AUDIO_CODEC_LATM
|
||||
};
|
||||
|
||||
enum eAudioChannelMode {
|
||||
AUDIO_CHANNEL_MODE_INVALID = -1,
|
||||
AUDIO_CHANNEL_MODE_STEREO,
|
||||
AUDIO_CHANNEL_MODE_JOINT_STEREO,
|
||||
AUDIO_CHANNEL_MODE_DUAL,
|
||||
AUDIO_CHANNEL_MODE_SINGLE
|
||||
};
|
||||
|
||||
enum eAudioBitrate {
|
||||
AUDIO_BITRATE_RESERVED = -3,
|
||||
AUDIO_BITRATE_FREE = -2,
|
||||
AUDIO_BITRATE_INVALID = -1
|
||||
};
|
||||
|
||||
enum eAudioSamplingFrequency {
|
||||
AUDIO_SAMPLING_FREQUENCY_RESERVED = -2,
|
||||
AUDIO_SAMPLING_FREQUENCY_INVALID = -1
|
||||
};
|
||||
|
||||
enum eAudioCenterMixLevel {
|
||||
AUDIO_CENTER_MIX_LEVEL_INVALID = -1,
|
||||
AUDIO_CENTER_MIX_LEVEL_MINUS_3dB,
|
||||
AUDIO_CENTER_MIX_LEVEL_MINUS_4_5dB,
|
||||
AUDIO_CENTER_MIX_LEVEL_MINUS_6dB,
|
||||
AUDIO_CENTER_MIX_LEVEL_RESERVED
|
||||
};
|
||||
|
||||
enum eAudioSurroundMixLevel {
|
||||
AUDIO_SURROUND_MIX_LEVEL_INVALID = -1,
|
||||
AUDIO_SURROUND_MIX_LEVEL_MINUS_3dB,
|
||||
AUDIO_SURROUND_MIX_LEVEL_MINUS_6dB,
|
||||
AUDIO_SURROUND_MIX_LEVEL_0_dB,
|
||||
AUDIO_SURROUND_MIX_LEVEL_RESERVED
|
||||
};
|
||||
|
||||
enum eAudioDolbySurroundMode {
|
||||
AUDIO_DOLBY_SURROUND_MODE_INVALID = -1,
|
||||
AUDIO_DOLBY_SURROUND_MODE_NOT_INDICATED,
|
||||
AUDIO_DOLBY_SURROUND_MODE_NOT_DOLBYSURROUND,
|
||||
AUDIO_DOLBY_SURROUND_MODE_DOLBYSURROUND,
|
||||
AUDIO_DOLBY_SURROUND_MODE_RESERVED
|
||||
};
|
||||
|
||||
enum eAudioBitstreamMode {
|
||||
AUDIO_BITSTREAM_MODE_INVALID = -1,
|
||||
AUDIO_BITSTREAM_MODE_CM,
|
||||
AUDIO_BITSTREAM_MODE_ME,
|
||||
AUDIO_BITSTREAM_MODE_VI,
|
||||
AUDIO_BITSTREAM_MODE_HI,
|
||||
AUDIO_BITSTREAM_MODE_D,
|
||||
AUDIO_BITSTREAM_MODE_C,
|
||||
AUDIO_BITSTREAM_MODE_E,
|
||||
AUDIO_BITSTREAM_MODE_VO_KAR
|
||||
};
|
||||
|
||||
enum eAudioCodingMode {
|
||||
AUDIO_CODING_MODE_INVALID = -1,
|
||||
AUDIO_CODING_MODE_1_1,
|
||||
AUDIO_CODING_MODE_1_0,
|
||||
AUDIO_CODING_MODE_2_0,
|
||||
AUDIO_CODING_MODE_3_0,
|
||||
AUDIO_CODING_MODE_2_1,
|
||||
AUDIO_CODING_MODE_3_1,
|
||||
AUDIO_CODING_MODE_2_2,
|
||||
AUDIO_CODING_MODE_3_2,
|
||||
};
|
||||
|
||||
typedef struct audio_info {
|
||||
eAudioCodec codec; // enum
|
||||
double bitrate; // bit/s or eAudioBitrate
|
||||
int samplingFrequency; // Hz or eAudioSamplingFrequency
|
||||
int channelMode; // eAudioChannelMode
|
||||
} audio_info_t;
|
||||
|
||||
typedef struct ac3_info {
|
||||
int bitrate; // bit/s or eAudioBitrate
|
||||
int samplingFrequency; // Hz or eAudioSamplingFrequency
|
||||
int bitstreamMode; // 0..7 or eAudioBitstreamMode
|
||||
int audioCodingMode; // 0..7 or eAudioCodingMode
|
||||
int dolbySurroundMode; // eAudioDolbySurroundMode
|
||||
int centerMixLevel; // eAudioCenterMixLevel
|
||||
int surroundMixLevel; // eAudioSurroundMixLevel
|
||||
int dialogLevel; // -dB
|
||||
bool lfe; // boolean
|
||||
} ac3_info_t;
|
||||
|
||||
class cFemonAudioIf {
|
||||
public:
|
||||
cFemonAudioIf() {}
|
||||
virtual ~cFemonAudioIf() {}
|
||||
|
||||
// enum
|
||||
virtual void SetAudioCodec(eAudioCodec codecP) = 0;
|
||||
// kbit/s or eAudioBitrate
|
||||
virtual void SetAudioBitrate(double bitRateP) = 0;
|
||||
// Hz or eAudioSamplingFrequency
|
||||
virtual void SetAudioSamplingFrequency(int samplingP) = 0;
|
||||
// eAudioChannelMode
|
||||
virtual void SetAudioChannel(eAudioChannelMode modeP) = 0;
|
||||
};
|
||||
|
||||
class cFemonAC3If {
|
||||
public:
|
||||
cFemonAC3If() {}
|
||||
virtual ~cFemonAC3If() {}
|
||||
|
||||
// bit/s or eAudioBitrate
|
||||
virtual void SetAC3Bitrate(int bitRateP) = 0;
|
||||
// Hz or eAudioSamplingFrequency
|
||||
virtual void SetAC3SamplingFrequency(int samplingP) = 0;
|
||||
// 0..7 or eAudioBitstreamMode
|
||||
virtual void SetAC3Bitstream(int modeP) = 0;
|
||||
// 0..7 or eAudioCodingMode
|
||||
virtual void SetAC3AudioCoding(int modeP) = 0;
|
||||
// eAudioDolbySurroundMode
|
||||
virtual void SetAC3DolbySurround(int modeP) = 0;
|
||||
// eAudioCenterMixLevel
|
||||
virtual void SetAC3CenterMix(int levelP) = 0;
|
||||
// eAudioSurroundMixLevel
|
||||
virtual void SetAC3SurroundMix(int levelP) = 0;
|
||||
// -dB
|
||||
virtual void SetAC3Dialog(int levelP) = 0;
|
||||
// boolean
|
||||
virtual void SetAC3LFE(bool onoffP) = 0;
|
||||
};
|
||||
|
||||
#endif //__FEMON_AUDIO_H
|
147
config.h
147
config.h
@ -1,147 +0,0 @@
|
||||
/*
|
||||
* config.h: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __FEMON_CONFIG_H
|
||||
#define __FEMON_CONFIG_H
|
||||
|
||||
#define MaxSvdrpIp 15 // xxx.xxx.xxx.xxx
|
||||
|
||||
enum eFemonModes
|
||||
{
|
||||
eFemonModeBasic,
|
||||
eFemonModeTransponder,
|
||||
eFemonModeStream,
|
||||
eFemonModeAC3,
|
||||
eFemonModeMaxNumber
|
||||
};
|
||||
|
||||
enum eFemonSignalUnit
|
||||
{
|
||||
eFemonSignalUnitdBm,
|
||||
eFemonSignalUnitdBuV,
|
||||
eFemonSignalUnitdBV,
|
||||
eFemonSignalUnitMaxNumber
|
||||
};
|
||||
|
||||
class cFemonConfig
|
||||
{
|
||||
private:
|
||||
unsigned int traceModeM;
|
||||
int hideMenuM;
|
||||
int displayModeM;
|
||||
int skinM;
|
||||
int themeM;
|
||||
int positionM;
|
||||
int downscaleM;
|
||||
int signalUnitM;
|
||||
int redLimitM;
|
||||
int greenLimitM;
|
||||
int updateIntervalM;
|
||||
int analyzeStreamM;
|
||||
int calcIntervalM;
|
||||
int useSvdrpM;
|
||||
int svdrpPortM;
|
||||
char svdrpIpM[MaxSvdrpIp + 1]; // must end with additional null
|
||||
|
||||
public:
|
||||
enum eTraceMode {
|
||||
eTraceModeNormal = 0x0000,
|
||||
eTraceModeDebug1 = 0x0001,
|
||||
eTraceModeDebug2 = 0x0002,
|
||||
eTraceModeDebug3 = 0x0004,
|
||||
eTraceModeDebug4 = 0x0008,
|
||||
eTraceModeDebug5 = 0x0010,
|
||||
eTraceModeDebug6 = 0x0020,
|
||||
eTraceModeDebug7 = 0x0040,
|
||||
eTraceModeDebug8 = 0x0080,
|
||||
eTraceModeDebug9 = 0x0100,
|
||||
eTraceModeDebug10 = 0x0200,
|
||||
eTraceModeDebug11 = 0x0400,
|
||||
eTraceModeDebug12 = 0x0800,
|
||||
eTraceModeDebug13 = 0x1000,
|
||||
eTraceModeDebug14 = 0x2000,
|
||||
eTraceModeDebug15 = 0x4000,
|
||||
eTraceModeDebug16 = 0x8000,
|
||||
eTraceModeMask = 0xFFFF
|
||||
};
|
||||
cFemonConfig();
|
||||
unsigned int GetTraceMode(void) const { return traceModeM; }
|
||||
bool IsTraceMode(eTraceMode modeP) const { return (traceModeM & modeP); }
|
||||
int GetHideMenu(void) const { return hideMenuM; }
|
||||
int GetDisplayMode(void) const { return displayModeM; }
|
||||
int GetSkin(void) const { return skinM; }
|
||||
int GetTheme(void) const { return themeM; }
|
||||
int GetPosition(void) const { return positionM; }
|
||||
int GetDownscale(void) const { return downscaleM; }
|
||||
int GetSignalUnit(void) const { return signalUnitM; }
|
||||
int GetRedLimit(void) const { return redLimitM; }
|
||||
int GetGreenLimit(void) const { return greenLimitM; }
|
||||
int GetUpdateInterval(void) const { return updateIntervalM; }
|
||||
int GetAnalyzeStream(void) const { return analyzeStreamM; }
|
||||
int GetCalcInterval(void) const { return calcIntervalM; }
|
||||
int GetUseSvdrp(void) const { return useSvdrpM; }
|
||||
int GetSvdrpPort(void) const { return svdrpPortM; }
|
||||
const char *GetSvdrpIp(void) const { return svdrpIpM; }
|
||||
|
||||
void SetTraceMode(unsigned int modeP) { traceModeM = (modeP & eTraceModeMask); }
|
||||
void SetHideMenu(int hideMenuP) { hideMenuM = hideMenuP; }
|
||||
void SetDisplayMode(int displayModeP) { if (displayModeM < 0 || displayModeM >= eFemonModeMaxNumber) displayModeM = 0; else displayModeM = displayModeP; }
|
||||
void SetSkin(int skinP) { skinM = skinP; }
|
||||
void SetTheme(int themeP) { themeM = themeP; }
|
||||
void SetPosition(int positionP) { positionM = positionP; }
|
||||
void SetDownscale(int downscaleP) { downscaleM = downscaleP; }
|
||||
void SetSignalUnit(int signalUnitP) { signalUnitM = signalUnitP; }
|
||||
void SetRedLimit(int redLimitP) { redLimitM = redLimitP; }
|
||||
void SetGreenLimit(int greenLimitP) { greenLimitM = greenLimitP; }
|
||||
void SetUpdateInterval(int updateIntervalP) { updateIntervalM = updateIntervalP; }
|
||||
void SetAnalyzeStream(int analyzeStreamP) { analyzeStreamM = analyzeStreamP; }
|
||||
void SetCalcInterval(int calcIntervalP) { calcIntervalM = calcIntervalP; }
|
||||
void SetUseSvdrp(int useSvdrpP) { useSvdrpM = useSvdrpP; }
|
||||
void SetSvdrpPort(int svdrpPortP) { svdrpPortM = svdrpPortP; }
|
||||
void SetSvdrpIp(const char *strP);
|
||||
};
|
||||
|
||||
extern cFemonConfig FemonConfig;
|
||||
|
||||
enum eFemonSkins
|
||||
{
|
||||
eFemonSkinClassic,
|
||||
eFemonSkinElchi,
|
||||
eFemonSkinMaxNumber
|
||||
};
|
||||
|
||||
enum eFemonThemes
|
||||
{
|
||||
eFemonThemeClassic,
|
||||
eFemonThemeElchi,
|
||||
eFemonThemeSTTNG,
|
||||
eFemonThemeDeepBlue,
|
||||
eFemonThemeMoronimo,
|
||||
eFemonThemeEnigma,
|
||||
eFemonThemeEgalsTry,
|
||||
eFemonThemeDuotone,
|
||||
eFemonThemeSilverGreen,
|
||||
eFemonThemePearlHD,
|
||||
eFemonThemeMaxNumber
|
||||
};
|
||||
|
||||
struct cFemonTheme
|
||||
{
|
||||
int bpp;
|
||||
unsigned int clrBackground;
|
||||
unsigned int clrTitleBackground;
|
||||
unsigned int clrTitleText;
|
||||
unsigned int clrActiveText;
|
||||
unsigned int clrInactiveText;
|
||||
unsigned int clrRed;
|
||||
unsigned int clrYellow;
|
||||
unsigned int clrGreen;
|
||||
};
|
||||
|
||||
extern const cFemonTheme FemonTheme[eFemonThemeMaxNumber];
|
||||
|
||||
#endif // __FEMON_CONFIG_H
|
365
femon.c
365
femon.c
@ -1,33 +1,27 @@
|
||||
/*
|
||||
* femon.c: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
* Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <getopt.h>
|
||||
#include <vdr/menu.h>
|
||||
#include <vdr/remote.h>
|
||||
#include <vdr/player.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "femoncfg.h"
|
||||
#include "femoni18n.h"
|
||||
#include "femonreceiver.h"
|
||||
#include "femonosd.h"
|
||||
#include "femonservice.h"
|
||||
#include "log.h"
|
||||
#include "osd.h"
|
||||
#include "tools.h"
|
||||
#include "setup.h"
|
||||
#include "femontools.h"
|
||||
|
||||
#if defined(APIVERSNUM) && APIVERSNUM < 20400
|
||||
#error "VDR-2.4.0 API version or greater is required!"
|
||||
#if defined(APIVERSNUM) && APIVERSNUM < 10400
|
||||
#error "VDR-1.4.0 API version or greater is required!"
|
||||
#endif
|
||||
|
||||
#ifndef GITVERSION
|
||||
#define GITVERSION ""
|
||||
#endif
|
||||
|
||||
static const char VERSION[] = "2.4.1" GITVERSION;
|
||||
static const char DESCRIPTION[] = trNOOP("DVB Signal Information Monitor (OSD)");
|
||||
static const char MAINMENUENTRY[] = trNOOP("Signal Information");
|
||||
static const char VERSION[] = "1.1.4";
|
||||
static const char DESCRIPTION[] = "DVB Signal Information Monitor (OSD)";
|
||||
static const char MAINMENUENTRY[] = "Signal Information";
|
||||
|
||||
class cPluginFemon : public cPlugin {
|
||||
public:
|
||||
@ -43,13 +37,13 @@ public:
|
||||
virtual void Housekeeping(void);
|
||||
virtual void MainThreadHook(void) {}
|
||||
virtual cString Active(void) { return NULL; }
|
||||
virtual const char *MainMenuEntry(void) { return (FemonConfig.GetHideMenu() ? NULL : tr(MAINMENUENTRY)); }
|
||||
virtual const char *MainMenuEntry(void) { return (femonConfig.hidemenu ? NULL : tr(MAINMENUENTRY)); }
|
||||
virtual cOsdObject *MainMenuAction(void);
|
||||
virtual cMenuSetupPage *SetupMenu(void);
|
||||
virtual bool SetupParse(const char *nameP, const char *valueP);
|
||||
virtual bool Service(const char *idP, void *dataP);
|
||||
virtual bool SetupParse(const char *Name, const char *Value);
|
||||
virtual bool Service(const char *Id, void *Data);
|
||||
virtual const char **SVDRPHelpPages(void);
|
||||
virtual cString SVDRPCommand(const char *commandP, const char *optionP, int &replyCodeP);
|
||||
virtual cString SVDRPCommand(const char *Command, const char *Option, int &ReplyCode);
|
||||
};
|
||||
|
||||
cPluginFemon::cPluginFemon()
|
||||
@ -57,40 +51,24 @@ cPluginFemon::cPluginFemon()
|
||||
// Initialize any member variables here.
|
||||
// DON'T DO ANYTHING ELSE THAT MAY HAVE SIDE EFFECTS, REQUIRE GLOBAL
|
||||
// VDR OBJECTS TO EXIST OR PRODUCE ANY OUTPUT!
|
||||
debug1("%s", __PRETTY_FUNCTION__);
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
}
|
||||
|
||||
cPluginFemon::~cPluginFemon()
|
||||
{
|
||||
// Clean up after yourself!
|
||||
debug1("%s", __PRETTY_FUNCTION__);
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
}
|
||||
|
||||
const char *cPluginFemon::CommandLineHelp(void)
|
||||
{
|
||||
// Return a string that describes all known command line options.
|
||||
return " -t <mode>, --trace=<mode> set the tracing mode\n";
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool cPluginFemon::ProcessArgs(int argc, char *argv[])
|
||||
{
|
||||
// Implement command line argument processing here if applicable.
|
||||
static const struct option long_options[] = {
|
||||
{ "trace", required_argument, NULL, 't' },
|
||||
{ NULL, no_argument, NULL, 0 }
|
||||
};
|
||||
|
||||
cString server;
|
||||
int c;
|
||||
while ((c = getopt_long(argc, argv, "t:", long_options, NULL)) != -1) {
|
||||
switch (c) {
|
||||
case 't':
|
||||
FemonConfig.SetTraceMode(strtol(optarg, NULL, 0));
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -103,6 +81,7 @@ bool cPluginFemon::Initialize(void)
|
||||
bool cPluginFemon::Start(void)
|
||||
{
|
||||
// Start any background activities the plugin shall perform.
|
||||
RegisterI18n(Phrases);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -119,78 +98,54 @@ void cPluginFemon::Housekeeping(void)
|
||||
cOsdObject *cPluginFemon::MainMenuAction(void)
|
||||
{
|
||||
// Perform the action when selected from the main VDR menu.
|
||||
debug1("%s", __PRETTY_FUNCTION__);
|
||||
LOCK_CHANNELS_READ;
|
||||
if (cControl::Control() || (Channels->Count() <= 0))
|
||||
Skins.Message(mtInfo, tr("Femon not available"));
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
if (cReplayControl::NowReplaying())
|
||||
Skins.Message(mtInfo, tr("Femon not available while replaying"));
|
||||
else
|
||||
return cFemonOsd::Instance(true);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cMenuSetupPage *cPluginFemon::SetupMenu(void)
|
||||
{
|
||||
// Return a setup menu in case the plugin supports one.
|
||||
return new cMenuFemonSetup;
|
||||
}
|
||||
|
||||
bool cPluginFemon::SetupParse(const char *nameP, const char *valueP)
|
||||
bool cPluginFemon::SetupParse(const char *Name, const char *Value)
|
||||
{
|
||||
// Parse your own setup parameters and store their values.
|
||||
if (!strcasecmp(nameP, "HideMenu"))
|
||||
FemonConfig.SetHideMenu(atoi(valueP));
|
||||
else if (!strcasecmp(nameP, "DisplayMode"))
|
||||
FemonConfig.SetDisplayMode(atoi(valueP));
|
||||
else if (!strcasecmp(nameP, "Position"))
|
||||
FemonConfig.SetPosition(atoi(valueP));
|
||||
else if (!strcasecmp(nameP, "Skin"))
|
||||
FemonConfig.SetSkin(atoi(valueP));
|
||||
else if (!strcasecmp(nameP, "Theme"))
|
||||
FemonConfig.SetTheme(atoi(valueP));
|
||||
else if (!strcasecmp(nameP, "Downscale"))
|
||||
FemonConfig.SetDownscale(atoi(valueP));
|
||||
else if (!strcasecmp(nameP, "RedLimit"))
|
||||
FemonConfig.SetRedLimit(atoi(valueP));
|
||||
else if (!strcasecmp(nameP, "GreenLimit"))
|
||||
FemonConfig.SetGreenLimit(atoi(valueP));
|
||||
else if (!strcasecmp(nameP, "UpdateInterval"))
|
||||
FemonConfig.SetUpdateInterval(atoi(valueP));
|
||||
else if (!strcasecmp(nameP, "AnalStream"))
|
||||
FemonConfig.SetAnalyzeStream(atoi(valueP));
|
||||
else if (!strcasecmp(nameP, "CalcInterval"))
|
||||
FemonConfig.SetCalcInterval(atoi(valueP));
|
||||
else if (!strcasecmp(nameP, "UseSvdrp"))
|
||||
FemonConfig.SetUseSvdrp(atoi(valueP));
|
||||
else if (!strcasecmp(nameP, "ServerPort"))
|
||||
FemonConfig.SetSvdrpPort(atoi(valueP));
|
||||
else if (!strcasecmp(nameP, "ServerIp"))
|
||||
FemonConfig.SetSvdrpIp(valueP);
|
||||
else if (!strcasecmp(nameP, "SignalUnit"))
|
||||
FemonConfig.SetSignalUnit(atoi(valueP));
|
||||
if (!strcasecmp(Name, "HideMenu")) femonConfig.hidemenu = atoi(Value);
|
||||
else if (!strcasecmp(Name, "DisplayMode")) femonConfig.displaymode = atoi(Value);
|
||||
else if (!strcasecmp(Name, "Position")) femonConfig.position = atoi(Value);
|
||||
else if (!strcasecmp(Name, "OSDHeight")) femonConfig.osdheight = atoi(Value);
|
||||
else if (!strcasecmp(Name, "OSDOffset")) femonConfig.osdoffset = atoi(Value);
|
||||
else if (!strcasecmp(Name, "Skin")) femonConfig.skin = atoi(Value);
|
||||
else if (!strcasecmp(Name, "Theme")) femonConfig.theme = atoi(Value);
|
||||
else if (!strcasecmp(Name, "ShowCASystem")) femonConfig.showcasystem = atoi(Value);
|
||||
else if (!strcasecmp(Name, "RedLimit")) femonConfig.redlimit = atoi(Value);
|
||||
else if (!strcasecmp(Name, "GreenLimit")) femonConfig.greenlimit = atoi(Value);
|
||||
else if (!strcasecmp(Name, "UpdateInterval")) femonConfig.updateinterval = atoi(Value);
|
||||
else if (!strcasecmp(Name, "AnalStream")) femonConfig.analyzestream = atoi(Value);
|
||||
else if (!strcasecmp(Name, "CalcInterval")) femonConfig.calcinterval = atoi(Value);
|
||||
else if (!strcasecmp(Name, "UseSvdrp")) femonConfig.usesvdrp = atoi(Value);
|
||||
else if (!strcasecmp(Name, "ServerPort")) femonConfig.svdrpport = atoi(Value);
|
||||
else if (!strcasecmp(Name, "ServerIp")) strn0cpy(femonConfig.svdrpip, Value, sizeof(femonConfig.svdrpip));
|
||||
else
|
||||
return false;
|
||||
if (femonConfig.displaymode < 0 || femonConfig.displaymode >= eFemonModeMaxNumber) femonConfig.displaymode = 0;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cPluginFemon::Service(const char *idP, void *dataP)
|
||||
bool cPluginFemon::Service(const char *Id, void *Data)
|
||||
{
|
||||
if (strcmp(idP, "FemonService-v1.1") == 0) {
|
||||
if (dataP) {
|
||||
FemonService_v1_1 *data = reinterpret_cast<FemonService_v1_1*>(dataP);
|
||||
cDevice *dev = cDevice::ActualDevice();
|
||||
if (!dev)
|
||||
return false;
|
||||
data->fe_name = getFrontendName(dev);
|
||||
data->fe_status = getFrontendStatus(dev);
|
||||
data->fe_cnr = getCNR(dev);
|
||||
data->fe_signal = getSignal(dev);
|
||||
data->fe_ber = getBER(dev);
|
||||
data->fe_per = getPER(dev);
|
||||
if ((strcmp(Id,"FemonService-v1.0") == 0) && Data) {
|
||||
FemonService_v1_0 *data = (FemonService_v1_0*)Data;
|
||||
int ndx = cDevice::ActualDevice()->CardIndex();
|
||||
data->fe_name = getFrontendName(ndx);
|
||||
data->fe_status = getFrontendStatus(ndx);
|
||||
data->fe_snr = getSNR(ndx);
|
||||
data->fe_signal = getSignal(ndx);
|
||||
data->fe_ber = getBER(ndx);
|
||||
data->fe_unc = getUNC(ndx);
|
||||
data->video_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetVideoBitrate() : 0.0;
|
||||
data->audio_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetAudioBitrate() : 0.0;
|
||||
data->dolby_bitrate = cFemonOsd::Instance() ? cFemonOsd::Instance()->GetDolbyBitrate() : 0.0;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -208,116 +163,95 @@ const char **cPluginFemon::SVDRPHelpPages(void)
|
||||
" Switch to next possible device.",
|
||||
"PREV\n"
|
||||
" Switch to previous possible device.",
|
||||
"INFO <card index>\n"
|
||||
" Print the frontend information.",
|
||||
"NAME <card index>\n"
|
||||
" Print the frontend name.",
|
||||
"STAT <card index>\n"
|
||||
" Print the frontend status.",
|
||||
"STRG <card index>\n"
|
||||
" Print the signal strength.",
|
||||
"QUAL <card index>\n"
|
||||
" Print the signal quality.",
|
||||
"SGNL <card index>\n"
|
||||
" Print the signal strength from driver.",
|
||||
"CNRA <card index>\n"
|
||||
" Print the carrier-to-noise ratio from driver.",
|
||||
"BERA <card index>\n"
|
||||
" Print the bit error rate from driver.",
|
||||
"PERA <card index>\n"
|
||||
" Print the packet error rate from driver.",
|
||||
"INFO\n"
|
||||
" Print the current frontend information.",
|
||||
"NAME\n"
|
||||
" Print the current frontend name.",
|
||||
"STAT\n"
|
||||
" Print the current frontend status.",
|
||||
"SGNL\n"
|
||||
" Print the current signal strength.",
|
||||
"SNRA\n"
|
||||
" Print the current signal-to-noise ratio.",
|
||||
"BERA\n"
|
||||
" Print the current bit error rate.",
|
||||
"UNCB\n"
|
||||
" Print the current uncorrected blocks rate.",
|
||||
"VIBR\n"
|
||||
" Print the current video bitrate [Mbit/s].",
|
||||
" Print the actual device and current video bitrate [Mbit/s].",
|
||||
"AUBR\n"
|
||||
" Print the current audio bitrate [kbit/s].",
|
||||
" Print the actual device and current audio bitrate [kbit/s].",
|
||||
"DDBR\n"
|
||||
" Print the current dolby bitrate [kbit/s].",
|
||||
"TRAC [ <mode> ]\n"
|
||||
" Gets and/or sets used tracing mode.\n",
|
||||
" Print the actual device and current dolby bitrate [kbit/s].",
|
||||
NULL
|
||||
};
|
||||
return HelpPages;
|
||||
}
|
||||
|
||||
cString cPluginFemon::SVDRPCommand(const char *commandP, const char *optionP, int &replyCodeP)
|
||||
cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode)
|
||||
{
|
||||
cDevice *dev = cDevice::ActualDevice();
|
||||
if (strcasecmp(commandP, "TRAC") == 0) {
|
||||
if (optionP && *optionP)
|
||||
FemonConfig.SetTraceMode(strtol(optionP, NULL, 0));
|
||||
return cString::sprintf("Tracing mode: 0x%04X\n", FemonConfig.GetTraceMode());
|
||||
}
|
||||
if (*optionP && isnumber(optionP)) {
|
||||
cDevice *dev2 = cDevice::GetDevice(int(strtol(optionP, NULL, 10)));
|
||||
if (dev2)
|
||||
dev = dev2;
|
||||
}
|
||||
if (cReplayControl::NowReplaying() || !dev) {
|
||||
replyCodeP = 550; // Requested action not taken
|
||||
if (strcasecmp(Command, "OPEN") == 0) {
|
||||
if (cReplayControl::NowReplaying()) {
|
||||
ReplyCode = 550; // Requested action not taken
|
||||
return cString("Cannot open femon plugin while replaying");
|
||||
}
|
||||
if (strcasecmp(commandP, "OPEN") == 0) {
|
||||
if (!cFemonOsd::Instance())
|
||||
cRemote::CallPlugin(Name());
|
||||
cRemote::CallPlugin("femon");
|
||||
return cString("Opening femon plugin");
|
||||
}
|
||||
else if (strcasecmp(commandP, "QUIT") == 0) {
|
||||
else if (strcasecmp(Command, "QUIT") == 0) {
|
||||
if (cFemonOsd::Instance())
|
||||
cRemote::Put(kBack);
|
||||
return cString("Closing femon plugin");
|
||||
}
|
||||
else if (strcasecmp(commandP, "NEXT") == 0) {
|
||||
else if (strcasecmp(Command, "NEXT") == 0) {
|
||||
if (cFemonOsd::Instance())
|
||||
return cString::sprintf("Switching to next device: %s", cFemonOsd::Instance()->DeviceSwitch(1) ? "ok" : "failed");
|
||||
else
|
||||
return cString("Cannot switch device");
|
||||
}
|
||||
else if (strcasecmp(commandP, "PREV") == 0) {
|
||||
else if (strcasecmp(Command, "PREV") == 0) {
|
||||
if (cFemonOsd::Instance())
|
||||
return cString::sprintf("Switching to previous device: %s", cFemonOsd::Instance()->DeviceSwitch(-1) ? "ok" : "failed");
|
||||
else
|
||||
return cString("Cannot switch device");
|
||||
}
|
||||
else if (strcasecmp(commandP, "INFO") == 0) {
|
||||
return getFrontendInfo(dev);
|
||||
else if (strcasecmp(Command, "INFO") == 0) {
|
||||
return getFrontendInfo(cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(commandP, "NAME") == 0) {
|
||||
return getFrontendName(dev);
|
||||
else if (strcasecmp(Command, "NAME") == 0) {
|
||||
return getFrontendName(cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(commandP, "STAT") == 0) {
|
||||
return getFrontendStatus(dev);
|
||||
else if (strcasecmp(Command, "STAT") == 0) {
|
||||
return getFrontendStatus(cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(commandP, "STRG") == 0) {
|
||||
return cString::sprintf("%d on device #%d", dev->SignalStrength(), dev->CardIndex());
|
||||
else if (strcasecmp(Command, "SGNL") == 0) {
|
||||
int value = getSignal(cDevice::ActualDevice()->CardIndex());
|
||||
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(commandP, "QUAL") == 0) {
|
||||
return cString::sprintf("%d on device #%d", dev->SignalQuality(), dev->CardIndex());
|
||||
else if (strcasecmp(Command, "SNRA") == 0) {
|
||||
int value = getSNR(cDevice::ActualDevice()->CardIndex());
|
||||
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(commandP, "SGNL") == 0) {
|
||||
return cString::sprintf("%s on device #%d", *getSignalStrength(getSignal(dev)), dev->CardIndex());
|
||||
else if (strcasecmp(Command, "BERA") == 0) {
|
||||
return cString::sprintf("%08X on device #%d", getBER(cDevice::ActualDevice()->CardIndex()), cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(commandP, "CNRA") == 0) {
|
||||
return cString::sprintf("%.2f dB on device #%d", getCNR(dev), dev->CardIndex());
|
||||
else if (strcasecmp(Command, "UNCB") == 0) {
|
||||
return cString::sprintf("%08X on device #%d", getUNC(cDevice::ActualDevice()->CardIndex()), cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(commandP, "BERA") == 0) {
|
||||
return cString::sprintf("%.0f on device #%d", getBER(dev), dev->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(commandP, "PERA") == 0) {
|
||||
return cString::sprintf("%.0f on device #%d", getPER(dev), dev->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(commandP, "VIBR") == 0) {
|
||||
else if (strcasecmp(Command, "VIBR") == 0) {
|
||||
if (cFemonOsd::Instance())
|
||||
return cString::sprintf("%s on device #%d", *getBitrateMbits(cFemonOsd::Instance()->GetVideoBitrate()), cDevice::ActualDevice()->CardIndex());
|
||||
else
|
||||
return cString::sprintf("--- Mbit/s on device #%d", cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(commandP, "AUBR") == 0) {
|
||||
else if (strcasecmp(Command, "AUBR") == 0) {
|
||||
if (cFemonOsd::Instance())
|
||||
return cString::sprintf("%s on device #%d", *getBitrateKbits(cFemonOsd::Instance()->GetAudioBitrate()), cDevice::ActualDevice()->CardIndex());
|
||||
else
|
||||
return cString::sprintf("--- kbit/s on device #%d", cDevice::ActualDevice()->CardIndex());
|
||||
}
|
||||
else if (strcasecmp(commandP, "DDBR") == 0) {
|
||||
else if (strcasecmp(Command, "DDBR") == 0) {
|
||||
if (cFemonOsd::Instance())
|
||||
return cString::sprintf("%s on device #%d", *getBitrateKbits(cFemonOsd::Instance()->GetDolbyBitrate()), cDevice::ActualDevice()->CardIndex());
|
||||
else
|
||||
@ -326,4 +260,113 @@ cString cPluginFemon::SVDRPCommand(const char *commandP, const char *optionP, in
|
||||
return NULL;
|
||||
}
|
||||
|
||||
class cMenuFemonSetup : public cMenuSetupPage {
|
||||
private:
|
||||
const char *dispmodes[eFemonModeMaxNumber];
|
||||
const char *skins[eFemonSkinMaxNumber];
|
||||
const char *themes[eFemonThemeMaxNumber];
|
||||
cFemonConfig data;
|
||||
virtual void Setup(void);
|
||||
protected:
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
virtual void Store(void);
|
||||
public:
|
||||
cMenuFemonSetup(void);
|
||||
};
|
||||
|
||||
cMenuFemonSetup::cMenuFemonSetup(void)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
dispmodes[eFemonModeBasic] = tr("basic");
|
||||
dispmodes[eFemonModeTransponder] = tr("transponder");
|
||||
dispmodes[eFemonModeStream] = tr("stream");
|
||||
dispmodes[eFemonModeAC3] = tr("AC-3");
|
||||
|
||||
skins[eFemonSkinClassic] = tr("Classic");
|
||||
skins[eFemonSkinElchi] = tr("Elchi");
|
||||
|
||||
themes[eFemonThemeClassic] = tr("Classic");
|
||||
themes[eFemonThemeElchi] = tr("Elchi");
|
||||
themes[eFemonThemeDeepBlue] = tr("DeepBlue");
|
||||
themes[eFemonThemeMoronimo] = tr("Moronimo");
|
||||
themes[eFemonThemeEnigma] = tr("Enigma");
|
||||
themes[eFemonThemeEgalsTry] = tr("EgalsTry");
|
||||
themes[eFemonThemeDuotone] = tr("Duotone");
|
||||
themes[eFemonThemeSilverGreen] = tr("SilverGreen");
|
||||
|
||||
data = femonConfig;
|
||||
Setup();
|
||||
}
|
||||
|
||||
void cMenuFemonSetup::Setup(void)
|
||||
{
|
||||
int current = Current();
|
||||
|
||||
Clear();
|
||||
Add(new cMenuEditBoolItem( tr("Hide main menu entry"), &data.hidemenu, tr("no"), tr("yes")));
|
||||
Add(new cMenuEditStraItem( tr("Default display mode"), &data.displaymode, eFemonModeMaxNumber, dispmodes));
|
||||
Add(new cMenuEditStraItem( tr("Skin"), &data.skin, eFemonSkinMaxNumber, skins));
|
||||
Add(new cMenuEditStraItem( tr("Theme"), &data.theme, eFemonThemeMaxNumber,themes));
|
||||
Add(new cMenuEditBoolItem( tr("Position"), &data.position, tr("bottom"), tr("top")));
|
||||
Add(new cMenuEditIntItem( tr("Height"), &data.osdheight, 400, 500));
|
||||
Add(new cMenuEditIntItem( tr("Horizontal offset"), &data.osdoffset, -50, 50));
|
||||
Add(new cMenuEditBoolItem( tr("Show CA system"), &data.showcasystem, tr("no"), tr("yes")));
|
||||
Add(new cMenuEditIntItem( tr("Red limit [%]"), &data.redlimit, 1, 50));
|
||||
Add(new cMenuEditIntItem( tr("Green limit [%]"), &data.greenlimit, 51, 100));
|
||||
Add(new cMenuEditIntItem( tr("OSD update interval [0.1s]"), &data.updateinterval, 1, 100));
|
||||
Add(new cMenuEditBoolItem( tr("Analyze stream"), &data.analyzestream, tr("no"), tr("yes")));
|
||||
if (femonConfig.analyzestream)
|
||||
Add(new cMenuEditIntItem(tr("Calculation interval [0.1s]"), &data.calcinterval, 1, 100));
|
||||
Add(new cMenuEditBoolItem( tr("Use SVDRP service"), &data.usesvdrp));
|
||||
if (data.usesvdrp) {
|
||||
Add(new cMenuEditIntItem(tr("SVDRP service port"), &data.svdrpport, 1, 65535));
|
||||
Add(new cMenuEditStrItem(tr("SVDRP service IP"), data.svdrpip, MaxSvdrpIp, ".1234567890"));
|
||||
}
|
||||
|
||||
SetCurrent(Get(current));
|
||||
Display();
|
||||
}
|
||||
|
||||
void cMenuFemonSetup::Store(void)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
femonConfig = data;
|
||||
SetupStore("HideMenu", femonConfig.hidemenu);
|
||||
SetupStore("DisplayMode", femonConfig.displaymode);
|
||||
SetupStore("Skin", femonConfig.skin);
|
||||
SetupStore("Theme", femonConfig.theme);
|
||||
SetupStore("Position", femonConfig.position);
|
||||
SetupStore("OSDHeight", femonConfig.osdheight);
|
||||
SetupStore("OSDOffset", femonConfig.osdoffset);
|
||||
SetupStore("ShowCASystem", femonConfig.showcasystem);
|
||||
SetupStore("RedLimit", femonConfig.redlimit);
|
||||
SetupStore("GreenLimit", femonConfig.greenlimit);
|
||||
SetupStore("UpdateInterval", femonConfig.updateinterval);
|
||||
SetupStore("AnalStream", femonConfig.analyzestream);
|
||||
SetupStore("CalcInterval", femonConfig.calcinterval);
|
||||
SetupStore("UseSvdrp", femonConfig.usesvdrp);
|
||||
SetupStore("ServerPort", femonConfig.svdrpport);
|
||||
SetupStore("ServerIp", femonConfig.svdrpip);
|
||||
}
|
||||
|
||||
eOSState cMenuFemonSetup::ProcessKey(eKeys Key)
|
||||
{
|
||||
int oldUsesvdrp = data.usesvdrp;
|
||||
int oldAnalyzestream = data.analyzestream;
|
||||
|
||||
eOSState state = cMenuSetupPage::ProcessKey(Key);
|
||||
|
||||
if (Key != kNone && (data.analyzestream != oldAnalyzestream || data.usesvdrp != oldUsesvdrp)) {
|
||||
Setup();
|
||||
}
|
||||
|
||||
return state;
|
||||
}
|
||||
|
||||
cMenuSetupPage *cPluginFemon::SetupMenu(void)
|
||||
{
|
||||
// Return a setup menu in case the plugin supports one.
|
||||
return new cMenuFemonSetup;
|
||||
}
|
||||
|
||||
VDRPLUGINCREATOR(cPluginFemon); // Don't touch this!
|
||||
|
@ -1,43 +1,41 @@
|
||||
/*
|
||||
* config.c: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
* Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include "femoncfg.h"
|
||||
|
||||
#include "tools.h"
|
||||
#include "config.h"
|
||||
cFemonConfig femonConfig;
|
||||
|
||||
cFemonConfig FemonConfig;
|
||||
|
||||
cFemonConfig::cFemonConfig()
|
||||
: traceModeM(eTraceModeNormal),
|
||||
hideMenuM(0),
|
||||
displayModeM(0),
|
||||
skinM(0),
|
||||
themeM(0),
|
||||
positionM(1),
|
||||
downscaleM(0),
|
||||
signalUnitM(0),
|
||||
redLimitM(33),
|
||||
greenLimitM(66),
|
||||
updateIntervalM(5),
|
||||
analyzeStreamM(1),
|
||||
calcIntervalM(20),
|
||||
useSvdrpM(0),
|
||||
svdrpPortM(6419)
|
||||
cFemonConfig::cFemonConfig(void)
|
||||
{
|
||||
SetSvdrpIp("0.0.0.0");
|
||||
hidemenu = 0;
|
||||
displaymode = 0;
|
||||
skin = 0;
|
||||
theme = 0;
|
||||
position = 1;
|
||||
redlimit = 33;
|
||||
greenlimit = 66;
|
||||
updateinterval = 5;
|
||||
analyzestream = 1;
|
||||
calcinterval = 20;
|
||||
showcasystem = 0;
|
||||
#ifdef NTSC
|
||||
osdheight = 420;
|
||||
#else
|
||||
osdheight = 480;
|
||||
#endif
|
||||
osdoffset = 0;
|
||||
usesvdrp = 0;
|
||||
svdrpport = 2001;
|
||||
strncpy(svdrpip, "0.0.0.0", sizeof(svdrpip));
|
||||
}
|
||||
|
||||
void cFemonConfig::SetSvdrpIp(const char *strP)
|
||||
{
|
||||
strn0cpy(svdrpIpM, strP, sizeof(svdrpIpM));
|
||||
}
|
||||
|
||||
const cFemonTheme FemonTheme[eFemonThemeMaxNumber] =
|
||||
const cFemonTheme femonTheme[eFemonThemeMaxNumber] =
|
||||
{
|
||||
{
|
||||
// eFemonThemeClassic
|
||||
@ -63,18 +61,6 @@ const cFemonTheme FemonTheme[eFemonThemeMaxNumber] =
|
||||
0xFFFFEE00, // clrYellow
|
||||
0xFF33CC33, // clrGreen
|
||||
},
|
||||
{
|
||||
// eFemonThemeSTTNG
|
||||
4, // bpp
|
||||
0x7F000000, // clrBackground
|
||||
0xFFFCC024, // clrTitleBackground
|
||||
0xFF000000, // clrTitleText
|
||||
0xFF00FCFC, // clrActiveText
|
||||
0xFFFCC024, // clrInactiveText
|
||||
0xFFFC1414, // clrRed
|
||||
0xFFFCC024, // clrYellow
|
||||
0xFF24FC24, // clrGreen
|
||||
},
|
||||
{
|
||||
// eFemonThemeDeepBlue
|
||||
4, // bpp
|
||||
@ -147,16 +133,4 @@ const cFemonTheme FemonTheme[eFemonThemeMaxNumber] =
|
||||
0xFFCE7B00, // clrYellow
|
||||
0xFF336600, // clrGreen
|
||||
},
|
||||
{
|
||||
// eFemonThemePearlHD
|
||||
4, // bpp
|
||||
0x90000000, // clrBackground
|
||||
0xCC000000, // clrTitleBackground
|
||||
0xFFBEBEBE, // clrTitleText
|
||||
0xFF4E78B1, // clrActiveText
|
||||
0xFFBEBEBE, // clrInactiveText
|
||||
0xAAFF0000, // clrRed
|
||||
0xAAF8F800, // clrYellow
|
||||
0x6000ff00, // clrGreen
|
||||
},
|
||||
};
|
82
femoncfg.h
Normal file
82
femoncfg.h
Normal file
@ -0,0 +1,82 @@
|
||||
/*
|
||||
* Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifndef __FEMONCFG_H
|
||||
#define __FEMONCFG_H
|
||||
|
||||
#define MaxSvdrpIp 15 // xxx.xxx.xxx.xxx
|
||||
|
||||
enum eFemonModes
|
||||
{
|
||||
eFemonModeBasic,
|
||||
eFemonModeTransponder,
|
||||
eFemonModeStream,
|
||||
eFemonModeAC3,
|
||||
eFemonModeMaxNumber
|
||||
};
|
||||
|
||||
struct cFemonConfig
|
||||
{
|
||||
public:
|
||||
cFemonConfig(void);
|
||||
int hidemenu;
|
||||
int displaymode;
|
||||
int skin;
|
||||
int theme;
|
||||
int position;
|
||||
int redlimit;
|
||||
int greenlimit;
|
||||
int updateinterval;
|
||||
int analyzestream;
|
||||
int calcinterval;
|
||||
int showcasystem;
|
||||
int osdheight;
|
||||
int osdoffset;
|
||||
int usesvdrp;
|
||||
int svdrpport;
|
||||
char svdrpip[MaxSvdrpIp + 1]; // must end with additional null
|
||||
};
|
||||
|
||||
extern cFemonConfig femonConfig;
|
||||
|
||||
enum eFemonSkins
|
||||
{
|
||||
eFemonSkinClassic,
|
||||
eFemonSkinElchi,
|
||||
eFemonSkinMaxNumber
|
||||
};
|
||||
|
||||
enum eFemonThemes
|
||||
{
|
||||
eFemonThemeClassic,
|
||||
eFemonThemeElchi,
|
||||
eFemonThemeDeepBlue,
|
||||
eFemonThemeMoronimo,
|
||||
eFemonThemeEnigma,
|
||||
eFemonThemeEgalsTry,
|
||||
eFemonThemeDuotone,
|
||||
eFemonThemeSilverGreen,
|
||||
eFemonThemeMaxNumber
|
||||
};
|
||||
|
||||
struct cFemonTheme
|
||||
{
|
||||
int bpp;
|
||||
int clrBackground;
|
||||
int clrTitleBackground;
|
||||
int clrTitleText;
|
||||
int clrActiveText;
|
||||
int clrInactiveText;
|
||||
int clrRed;
|
||||
int clrYellow;
|
||||
int clrGreen;
|
||||
};
|
||||
|
||||
extern const cFemonTheme femonTheme[eFemonThemeMaxNumber];
|
||||
|
||||
#endif // __FEMONCFG_H
|
BIN
femonclient/vdr-femonclient-0.0.2.tgz
Normal file
BIN
femonclient/vdr-femonclient-0.0.2.tgz
Normal file
Binary file not shown.
2390
femoni18n.c
Normal file
2390
femoni18n.c
Normal file
File diff suppressed because it is too large
Load Diff
16
femoni18n.h
Normal file
16
femoni18n.h
Normal file
@ -0,0 +1,16 @@
|
||||
/*
|
||||
* Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifndef __FEMONI18N_H
|
||||
#define __FEMONI18N_H
|
||||
|
||||
#include <vdr/i18n.h>
|
||||
|
||||
extern const tI18nPhrase Phrases[];
|
||||
|
||||
#endif // __FEMONI18N_H
|
913
femonosd.c
Normal file
913
femonosd.c
Normal file
@ -0,0 +1,913 @@
|
||||
/*
|
||||
* Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <ctype.h>
|
||||
#include "femoncfg.h"
|
||||
#include "femoni18n.h"
|
||||
#include "femonreceiver.h"
|
||||
#include "femontools.h"
|
||||
#include "femonosd.h"
|
||||
|
||||
#include "symbols/device.xpm"
|
||||
#include "symbols/stereo.xpm"
|
||||
#include "symbols/monoleft.xpm"
|
||||
#include "symbols/monoright.xpm"
|
||||
#include "symbols/zero.xpm"
|
||||
#include "symbols/one.xpm"
|
||||
#include "symbols/two.xpm"
|
||||
#include "symbols/three.xpm"
|
||||
#include "symbols/four.xpm"
|
||||
#include "symbols/five.xpm"
|
||||
#include "symbols/svdrp.xpm"
|
||||
#include "symbols/ar11.xpm"
|
||||
#include "symbols/ar169.xpm"
|
||||
#include "symbols/ar2211.xpm"
|
||||
#include "symbols/ar43.xpm"
|
||||
#include "symbols/ntsc.xpm"
|
||||
#include "symbols/pal.xpm"
|
||||
#include "symbols/dolbydigital.xpm"
|
||||
#include "symbols/dolbydigital20.xpm"
|
||||
#include "symbols/dolbydigital51.xpm"
|
||||
#include "symbols/lock.xpm"
|
||||
#include "symbols/signal.xpm"
|
||||
#include "symbols/carrier.xpm"
|
||||
#include "symbols/viterbi.xpm"
|
||||
#include "symbols/sync.xpm"
|
||||
|
||||
#define CHANNELINPUT_TIMEOUT 1000
|
||||
|
||||
#define OSDHEIGHT femonConfig.osdheight // in pixels
|
||||
#define OSDWIDTH 600 // in pixels
|
||||
#define OSDROWHEIGHT m_Font->Height() // in pixels
|
||||
#define OSDINFOHEIGHT (OSDROWHEIGHT * 12) // in pixels (12 rows)
|
||||
#define OSDSTATUSHEIGHT (OSDROWHEIGHT * 6) // in pixels (6 rows)
|
||||
#define OSDSPACING 5
|
||||
#define OSDCORNERING 10
|
||||
#define IS_OSDCORNERING (femonConfig.skin == eFemonSkinElchi)
|
||||
|
||||
#define OSDINFOWIN_Y(offset) (femonConfig.position ? (OSDHEIGHT - OSDINFOHEIGHT + offset) : offset)
|
||||
#define OSDINFOWIN_X(col) ((col == 4) ? 455 : (col == 3) ? 305 : (col == 2) ? 155 : 15)
|
||||
#define OSDSTATUSWIN_Y(offset) (femonConfig.position ? offset : (OSDHEIGHT - OSDSTATUSHEIGHT + offset))
|
||||
#define OSDSTATUSWIN_X(col) ((col == 7) ? 475 : (col == 6) ? 410 : (col == 5) ? 275 : (col == 4) ? 220 : (col == 3) ? 125 : (col == 2) ? 70 : 15)
|
||||
#define OSDSTATUSWIN_XSYMBOL(c,w) (c * ((OSDWIDTH - (5 * w)) / 6) + ((c - 1) * w))
|
||||
#define OSDBARWIDTH(x) (OSDWIDTH * x / 100)
|
||||
|
||||
#define SVDRPPLUGIN "svdrpservice"
|
||||
|
||||
cBitmap cFemonOsd::bmDevice(device_xpm);
|
||||
cBitmap cFemonOsd::bmStereo(stereo_xpm);
|
||||
cBitmap cFemonOsd::bmMonoLeft(monoleft_xpm);
|
||||
cBitmap cFemonOsd::bmMonoRight(monoright_xpm);
|
||||
cBitmap cFemonOsd::bmNumbers[MAX_BMNUMBERS] = {
|
||||
cBitmap(zero_xpm), cBitmap(one_xpm), cBitmap(two_xpm),
|
||||
cBitmap(three_xpm), cBitmap(four_xpm), cBitmap(five_xpm)
|
||||
};
|
||||
cBitmap cFemonOsd::bmSVDRP(svdrp_xpm);
|
||||
cBitmap cFemonOsd::bmAspectRatio_1_1(ar11_xpm);
|
||||
cBitmap cFemonOsd::bmAspectRatio_16_9(ar169_xpm);
|
||||
cBitmap cFemonOsd::bmAspectRatio_2_21_1(ar2211_xpm);
|
||||
cBitmap cFemonOsd::bmAspectRatio_4_3(ar43_xpm);
|
||||
cBitmap cFemonOsd::bmPAL(pal_xpm);
|
||||
cBitmap cFemonOsd::bmNTSC(ntsc_xpm);
|
||||
cBitmap cFemonOsd::bmDD(dolbydigital_xpm);
|
||||
cBitmap cFemonOsd::bmDD20(dolbydigital20_xpm);
|
||||
cBitmap cFemonOsd::bmDD51(dolbydigital51_xpm);
|
||||
cBitmap cFemonOsd::bmLock(lock_xpm);
|
||||
cBitmap cFemonOsd::bmSignal(signal_xpm);
|
||||
cBitmap cFemonOsd::bmCarrier(carrier_xpm);
|
||||
cBitmap cFemonOsd::bmViterbi(viterbi_xpm);
|
||||
cBitmap cFemonOsd::bmSync(sync_xpm);
|
||||
|
||||
cFemonOsd *cFemonOsd::pInstance = NULL;
|
||||
|
||||
cFemonOsd *cFemonOsd::Instance(bool create)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
if (pInstance == NULL && create)
|
||||
{
|
||||
pInstance = new cFemonOsd();
|
||||
}
|
||||
return (pInstance);
|
||||
}
|
||||
|
||||
cFemonOsd::cFemonOsd()
|
||||
:cOsdObject(true), cThread("femon osd")
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
m_Osd = NULL;
|
||||
m_Receiver = NULL;
|
||||
m_Frontend = -1;
|
||||
m_SvdrpVideoBitrate = -1.0;
|
||||
m_SvdrpAudioBitrate = -1.0;
|
||||
m_SvdrpFrontend = -1;
|
||||
m_SvdrpConnection.handle = -1;
|
||||
m_SvdrpPlugin = NULL;
|
||||
m_Number = 0;
|
||||
m_OldNumber = 0;
|
||||
m_Signal = 0;
|
||||
m_SNR = 0;
|
||||
m_BER = 0;
|
||||
m_UNC = 0;
|
||||
m_DisplayMode = femonConfig.displaymode;
|
||||
m_InputTime.Set(0);
|
||||
m_Mutex = new cMutex();
|
||||
if (Setup.UseSmallFont == 0) {
|
||||
// Dirty hack to force the small fonts...
|
||||
Setup.UseSmallFont = 1;
|
||||
m_Font = cFont::GetFont(fontSml);
|
||||
Setup.UseSmallFont = 0;
|
||||
}
|
||||
else
|
||||
m_Font = cFont::GetFont(fontSml);
|
||||
}
|
||||
|
||||
cFemonOsd::~cFemonOsd(void)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
if (Running())
|
||||
Cancel(3);
|
||||
if (m_SvdrpConnection.handle >= 0) {
|
||||
m_SvdrpPlugin = cPluginManager::GetPlugin(SVDRPPLUGIN);
|
||||
if (m_SvdrpPlugin)
|
||||
m_SvdrpPlugin->Service("SvdrpConnection-v1.0", &m_SvdrpConnection);
|
||||
}
|
||||
if (m_Receiver)
|
||||
delete m_Receiver;
|
||||
if (m_Osd)
|
||||
delete m_Osd;
|
||||
pInstance = NULL;
|
||||
}
|
||||
|
||||
void cFemonOsd::DrawStatusWindow(void)
|
||||
{
|
||||
cMutexLock lock(m_Mutex);
|
||||
unsigned int number = 0;
|
||||
cBitmap *bm = NULL;
|
||||
int snr = m_SNR / 655;
|
||||
int signal = m_Signal / 655;
|
||||
int offset = 0;
|
||||
int x = OSDWIDTH - OSDCORNERING;
|
||||
int y = 0;
|
||||
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
|
||||
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
|
||||
if (m_Osd) {
|
||||
m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), femonTheme[femonConfig.theme].clrBackground);
|
||||
m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset), OSDWIDTH, OSDSTATUSWIN_Y(offset+OSDROWHEIGHT-1), femonTheme[femonConfig.theme].clrTitleBackground);
|
||||
m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), *cString::sprintf("%d%s %s", m_Number ? m_Number : channel->Number(), m_Number ? "-" : "", channel->ShortName(true)), femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground, m_Font);
|
||||
if (IS_OSDCORNERING) {
|
||||
m_Osd->DrawEllipse(0, OSDSTATUSWIN_Y(0), OSDCORNERING, OSDSTATUSWIN_Y(OSDCORNERING), clrTransparent, -2);
|
||||
m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDSTATUSWIN_Y(0), OSDWIDTH, OSDSTATUSWIN_Y(OSDCORNERING), clrTransparent, -1);
|
||||
}
|
||||
if (m_SvdrpFrontend >= 0) {
|
||||
x -= bmSVDRP.Width() + OSDSPACING;
|
||||
y = (OSDROWHEIGHT - bmSVDRP.Height()) / 2;
|
||||
if (y < 0) y = 0;
|
||||
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmSVDRP, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground);
|
||||
}
|
||||
number = cDevice::ActualDevice()->CardIndex();
|
||||
if (number < MAX_BMNUMBERS) {
|
||||
x -= bmNumbers[number].Width() + OSDSPACING;
|
||||
y = (OSDROWHEIGHT - bmNumbers[number].Height()) / 2;
|
||||
if (y < 0) y = 0;
|
||||
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmNumbers[number], femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground);
|
||||
x -= bmDevice.Width();
|
||||
y = (OSDROWHEIGHT - bmDevice.Height()) / 2;
|
||||
if (y < 0) y = 0;
|
||||
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmDevice, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground);
|
||||
}
|
||||
if (IS_AUDIO_TRACK(track)) {
|
||||
number = int(track - ttAudioFirst);
|
||||
if (number < MAX_BMNUMBERS) {
|
||||
x -= bmNumbers[number].Width() + OSDSPACING;
|
||||
y = (OSDROWHEIGHT - bmNumbers[number].Height()) / 2;
|
||||
if (y < 0) y = 0;
|
||||
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), bmNumbers[number], femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground);
|
||||
}
|
||||
switch (cDevice::PrimaryDevice()->GetAudioChannel()) {
|
||||
case 1: bm = &bmMonoLeft; break;
|
||||
case 2: bm = &bmMonoRight; break;
|
||||
default: bm = &bmStereo; break;
|
||||
}
|
||||
if (bm) {
|
||||
x -= bm->Width();
|
||||
y = (OSDROWHEIGHT - bm->Height()) / 2;
|
||||
if (y < 0) y = 0;
|
||||
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), *bm, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground);
|
||||
}
|
||||
}
|
||||
else if (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) {
|
||||
if (m_Receiver->AC3_5_1()) bm = &bmDD51;
|
||||
else if (m_Receiver->AC3_2_0()) bm = &bmDD20;
|
||||
else bm = &bmDD;
|
||||
if (bm) {
|
||||
x -= bm->Width() + OSDSPACING;
|
||||
y = (OSDROWHEIGHT - bm->Height()) / 2;
|
||||
if (y < 0) y = 0;
|
||||
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), *bm, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground);
|
||||
}
|
||||
}
|
||||
if (m_Receiver) {
|
||||
switch (m_Receiver->VideoFormat()) {
|
||||
case VF_PAL: bm = &bmPAL; break;
|
||||
case VF_NTSC: bm = &bmNTSC; break;
|
||||
default: bm = NULL; break;
|
||||
}
|
||||
if (bm) {
|
||||
x -= bm->Width() + OSDSPACING;
|
||||
y = (OSDROWHEIGHT - bm->Height()) / 2;
|
||||
if (y < 0) y = 0;
|
||||
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), *bm, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground);
|
||||
}
|
||||
switch (m_Receiver->VideoAspectRatio()) {
|
||||
case AR_1_1: bm = &bmAspectRatio_1_1; break;
|
||||
case AR_4_3: bm = &bmAspectRatio_4_3; break;
|
||||
case AR_16_9: bm = &bmAspectRatio_16_9; break;
|
||||
case AR_2_21_1: bm = &bmAspectRatio_2_21_1; break;
|
||||
default: bm = NULL; break;
|
||||
}
|
||||
if (bm) {
|
||||
x -= bm->Width() + OSDSPACING;
|
||||
y = (OSDROWHEIGHT - bm->Height()) / 2;
|
||||
if (y < 0) y = 0;
|
||||
m_Osd->DrawBitmap(x, OSDSTATUSWIN_Y(offset+y), *bm, femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground);
|
||||
}
|
||||
}
|
||||
offset += OSDROWHEIGHT;
|
||||
if (signal > 0) {
|
||||
signal = OSDBARWIDTH(signal);
|
||||
m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset+3), min(OSDBARWIDTH(femonConfig.redlimit), signal), OSDSTATUSWIN_Y(offset+OSDROWHEIGHT-3), femonTheme[femonConfig.theme].clrRed);
|
||||
if (signal > OSDBARWIDTH(femonConfig.redlimit)) {
|
||||
m_Osd->DrawRectangle(OSDBARWIDTH(femonConfig.redlimit), OSDSTATUSWIN_Y(offset+3), min((OSDWIDTH * femonConfig.greenlimit / 100), signal), OSDSTATUSWIN_Y(offset+OSDROWHEIGHT-3), femonTheme[femonConfig.theme].clrYellow);
|
||||
}
|
||||
if (signal > OSDBARWIDTH(femonConfig.greenlimit)) {
|
||||
m_Osd->DrawRectangle(OSDBARWIDTH(femonConfig.greenlimit), OSDSTATUSWIN_Y(offset+3), signal, OSDSTATUSWIN_Y(offset+OSDROWHEIGHT-3), femonTheme[femonConfig.theme].clrGreen);
|
||||
}
|
||||
}
|
||||
offset += OSDROWHEIGHT;
|
||||
if (snr > 0) {
|
||||
snr = OSDBARWIDTH(snr);
|
||||
m_Osd->DrawRectangle(0, OSDSTATUSWIN_Y(offset+3), min(OSDBARWIDTH(femonConfig.redlimit), snr), OSDSTATUSWIN_Y(offset+OSDROWHEIGHT-3), femonTheme[femonConfig.theme].clrRed);
|
||||
if (snr > OSDBARWIDTH(femonConfig.redlimit)) {
|
||||
m_Osd->DrawRectangle(OSDBARWIDTH(femonConfig.redlimit), OSDSTATUSWIN_Y(offset+3), min(OSDBARWIDTH(femonConfig.greenlimit), snr), OSDSTATUSWIN_Y(offset+OSDROWHEIGHT-3), femonTheme[femonConfig.theme].clrYellow);
|
||||
}
|
||||
if (snr > OSDBARWIDTH(femonConfig.greenlimit)) {
|
||||
m_Osd->DrawRectangle(OSDBARWIDTH(femonConfig.greenlimit), OSDSTATUSWIN_Y(offset+3), snr, OSDSTATUSWIN_Y(offset+OSDROWHEIGHT-3), femonTheme[femonConfig.theme].clrGreen);
|
||||
}
|
||||
}
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), "STR:", femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), *cString::sprintf("%04x", m_Signal), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), *cString::sprintf("(%2d%%)", m_Signal / 655), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDSTATUSWIN_X(4), OSDSTATUSWIN_Y(offset), "BER:", femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), *cString::sprintf("%08x", m_BER), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), *cString::sprintf("%s:", tr("Video")), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDSTATUSWIN_X(7), OSDSTATUSWIN_Y(offset), *getBitrateMbits(m_Receiver ? m_Receiver->VideoBitrate() : (m_SvdrpFrontend >= 0 ? m_SvdrpVideoBitrate : -1.0)), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDSTATUSWIN_X(1), OSDSTATUSWIN_Y(offset), "SNR:", femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDSTATUSWIN_X(2), OSDSTATUSWIN_Y(offset), *cString::sprintf("%04x", m_SNR), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDSTATUSWIN_X(3), OSDSTATUSWIN_Y(offset), *cString::sprintf("(%2d%%)", m_SNR / 655), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDSTATUSWIN_X(4), OSDSTATUSWIN_Y(offset), "UNC:", femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDSTATUSWIN_X(5), OSDSTATUSWIN_Y(offset), *cString::sprintf("%08x", m_UNC), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDSTATUSWIN_X(6), OSDSTATUSWIN_Y(offset), *cString::sprintf("%s:", (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) ? tr("AC-3") : tr("Audio")), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDSTATUSWIN_X(7), OSDSTATUSWIN_Y(offset), *getBitrateKbits(m_Receiver ? ((m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) ? m_Receiver->AC3Bitrate() : m_Receiver->AudioBitrate()) : (m_SvdrpFrontend >= 0 ? m_SvdrpAudioBitrate : -1.0)), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
x = bmLock.Width();
|
||||
y = (OSDROWHEIGHT - bmLock.Height()) / 2;
|
||||
m_Osd->DrawBitmap(OSDSTATUSWIN_XSYMBOL(1, x), OSDSTATUSWIN_Y(offset + y), bmLock, (m_FrontendStatus & FE_HAS_LOCK) ? femonTheme[femonConfig.theme].clrActiveText : femonTheme[femonConfig.theme].clrRed, femonTheme[femonConfig.theme].clrBackground);
|
||||
m_Osd->DrawBitmap(OSDSTATUSWIN_XSYMBOL(2, x), OSDSTATUSWIN_Y(offset + y), bmSignal, (m_FrontendStatus & FE_HAS_SIGNAL) ? femonTheme[femonConfig.theme].clrActiveText : femonTheme[femonConfig.theme].clrRed, femonTheme[femonConfig.theme].clrBackground);
|
||||
m_Osd->DrawBitmap(OSDSTATUSWIN_XSYMBOL(3, x), OSDSTATUSWIN_Y(offset + y), bmCarrier, (m_FrontendStatus & FE_HAS_CARRIER) ? femonTheme[femonConfig.theme].clrActiveText : femonTheme[femonConfig.theme].clrRed, femonTheme[femonConfig.theme].clrBackground);
|
||||
m_Osd->DrawBitmap(OSDSTATUSWIN_XSYMBOL(4, x), OSDSTATUSWIN_Y(offset + y), bmViterbi, (m_FrontendStatus & FE_HAS_VITERBI) ? femonTheme[femonConfig.theme].clrActiveText : femonTheme[femonConfig.theme].clrRed, femonTheme[femonConfig.theme].clrBackground);
|
||||
m_Osd->DrawBitmap(OSDSTATUSWIN_XSYMBOL(5, x), OSDSTATUSWIN_Y(offset + y), bmSync, (m_FrontendStatus & FE_HAS_SYNC) ? femonTheme[femonConfig.theme].clrActiveText : femonTheme[femonConfig.theme].clrRed, femonTheme[femonConfig.theme].clrBackground);
|
||||
if (IS_OSDCORNERING) {
|
||||
m_Osd->DrawEllipse(0, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT-OSDCORNERING), OSDCORNERING, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), clrTransparent, -3);
|
||||
m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDSTATUSWIN_Y(OSDSTATUSHEIGHT-OSDCORNERING), OSDWIDTH, OSDSTATUSWIN_Y(OSDSTATUSHEIGHT), clrTransparent, -4);
|
||||
}
|
||||
m_Osd->Flush();
|
||||
}
|
||||
}
|
||||
|
||||
void cFemonOsd::DrawInfoWindow(void)
|
||||
{
|
||||
cMutexLock lock(m_Mutex);
|
||||
int offset = 0;
|
||||
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
|
||||
|
||||
if (m_Osd) {
|
||||
if (m_DisplayMode == eFemonModeTransponder) {
|
||||
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), femonTheme[femonConfig.theme].clrBackground);
|
||||
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset+OSDROWHEIGHT-1), femonTheme[femonConfig.theme].clrTitleBackground);
|
||||
m_Osd->DrawText( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Transponder Information"), femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground, m_Font);
|
||||
if (IS_OSDCORNERING) {
|
||||
m_Osd->DrawEllipse(0, OSDINFOWIN_Y(0), OSDCORNERING, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -2);
|
||||
m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -1);
|
||||
}
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Vpid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *cString::sprintf("%d", channel->Vpid()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Ppid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *cString::sprintf("%d", channel->Ppid()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Apid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *getApids(channel), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Dpid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *getDpids(channel), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Spid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *getSpids(channel), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Tpid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *cString::sprintf("%d", channel->Tpid()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Sid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *cString::sprintf("%d", channel->Sid()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Nid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *cString::sprintf("%d", channel->Nid()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Tid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *cString::sprintf("%d", channel->Tid()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Rid"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *cString::sprintf("%d", channel->Rid()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("CA"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *getCAids(channel, femonConfig.showcasystem), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
switch (m_FrontendInfo.type) {
|
||||
case FE_QPSK:
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), *cString::sprintf("%s #%d - %s", tr("Satellite Card"), (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *getFrequencyMHz(channel->Frequency()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Source"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *cSource::ToString(channel->Source()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Srate"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *cString::sprintf("%d", channel->Srate()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Polarization"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *cString::sprintf("%c", toupper(channel->Polarization())), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *getInversion(channel->Inversion()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("CoderateH"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *getCoderate(channel->CoderateH()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
break;
|
||||
|
||||
case FE_QAM:
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), *cString::sprintf("%s #%d - %s", tr("Cable Card"), (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *getFrequencyMHz(channel->Frequency()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Source"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *cSource::ToString(channel->Source()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Srate"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *cString::sprintf("%d", channel->Srate()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Modulation"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *getModulation(channel->Modulation()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *getInversion(channel->Inversion()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("CoderateH"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *getCoderate(channel->CoderateH()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
break;
|
||||
|
||||
case FE_OFDM:
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), *cString::sprintf("%s #%d - %s", tr("Terrestrial Card"), (m_SvdrpFrontend >= 0) ? m_SvdrpFrontend : cDevice::ActualDevice()->CardIndex(), m_FrontendInfo.name), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frequency"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *getFrequencyMHz(channel->Frequency()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Transmission"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *getTransmission(channel->Transmission()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bandwidth"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *getBandwidth(channel->Bandwidth()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Modulation"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *getModulation(channel->Modulation()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Inversion"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *getInversion(channel->Inversion()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Coderate"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *cString::sprintf("%s (H) %s (L)", *getCoderate(channel->CoderateH()), *getCoderate(channel->CoderateL())), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Hierarchy"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(2), OSDINFOWIN_Y(offset), *getHierarchy(channel->Hierarchy()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), tr("Guard"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(4), OSDINFOWIN_Y(offset), *getGuard(channel->Guard()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (IS_OSDCORNERING) {
|
||||
m_Osd->DrawEllipse(0, OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDCORNERING, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -3);
|
||||
m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -4);
|
||||
}
|
||||
}
|
||||
else if (m_DisplayMode == eFemonModeStream) {
|
||||
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), femonTheme[femonConfig.theme].clrBackground);
|
||||
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset+OSDROWHEIGHT-1), femonTheme[femonConfig.theme].clrTitleBackground);
|
||||
m_Osd->DrawText( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Stream Information"), femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground, m_Font);
|
||||
if (IS_OSDCORNERING) {
|
||||
m_Osd->DrawEllipse(0, OSDINFOWIN_Y(0), OSDCORNERING, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -2);
|
||||
m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -1);
|
||||
}
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Video Stream"), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *cString::sprintf("#%d", channel->Vpid()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), m_Receiver ? *cString::sprintf("%s (%s)", *getBitrateMbits(m_Receiver->VideoStreamBitrate()), *getBitrateMbits(m_Receiver->VideoBitrate())) : *cString::sprintf("---"), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Aspect Ratio"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getAspectRatio(m_Receiver ? m_Receiver->VideoAspectRatio() : -1), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frame Rate"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), m_Receiver ? *cString::sprintf("%.2f %s", m_Receiver->VideoFrameRate(), tr("Hz")) : *cString::sprintf("---"), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Video Format"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getVideoFormat(m_Receiver ? m_Receiver->VideoFormat() : -1), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Resolution"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), m_Receiver ? *cString::sprintf("%d x %d", m_Receiver->VideoHorizontalSize(), m_Receiver->VideoVerticalSize()) : *cString::sprintf("---"), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Audio Stream"), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *cString::sprintf("#%d %s", IS_AUDIO_TRACK(track) ? channel->Apid(int(track - ttAudioFirst)) : channel->Apid(0), IS_AUDIO_TRACK(track) ? channel->Alang(int(track - ttAudioFirst)) : channel->Alang(0)), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getAudioBitrate(m_Receiver ? m_Receiver->AudioBitrate() : (double)FR_NOTVALID, m_Receiver ? m_Receiver->AudioStreamBitrate() : (double)FR_NOTVALID), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("MPEG Layer"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), m_Receiver ? *cString::sprintf("%d", m_Receiver->AudioMPEGLayer()) : *cString::sprintf("---"), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Sampling Frequency"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getAudioSamplingFreq(m_Receiver ? m_Receiver->AudioSamplingFreq() : FR_NOTVALID), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
if (IS_OSDCORNERING) {
|
||||
m_Osd->DrawEllipse(0, OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDCORNERING, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -3);
|
||||
m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -4);
|
||||
}
|
||||
}
|
||||
else if (m_DisplayMode == eFemonModeAC3) {
|
||||
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), femonTheme[femonConfig.theme].clrBackground);
|
||||
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(offset), OSDWIDTH, OSDINFOWIN_Y(offset+OSDROWHEIGHT-1), femonTheme[femonConfig.theme].clrTitleBackground);
|
||||
m_Osd->DrawText( OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Stream Information"), femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground, m_Font);
|
||||
if (IS_OSDCORNERING) {
|
||||
m_Osd->DrawEllipse(0, OSDINFOWIN_Y(0), OSDCORNERING, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -2);
|
||||
m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDCORNERING), clrTransparent, -1);
|
||||
}
|
||||
offset += OSDROWHEIGHT;
|
||||
if (m_Receiver && m_Receiver->AC3Valid() && IS_DOLBY_TRACK(track)) {
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("AC-3 Stream"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *cString::sprintf("#%d %s", channel->Dpid(int(track - ttDolbyFirst)), channel->Dlang(int(track - ttDolbyFirst))), femonTheme[femonConfig.theme].clrTitleText, femonTheme[femonConfig.theme].clrTitleBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bitrate"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *cString::sprintf("%s (%s)", *getBitrateKbits(m_Receiver->AC3StreamBitrate()), *getBitrateKbits(m_Receiver->AC3Bitrate())), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Sampling Frequency"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *cString::sprintf("%.1f %s", m_Receiver->AC3SamplingFreq() / 1000., tr("kHz")), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Frame Size"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *cString::sprintf("%d", m_Receiver->AC3FrameSize()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Bit Stream Mode"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getAC3BitStreamMode(m_Receiver->AC3BitStreamMode(), m_Receiver->AC3AudioCodingMode()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Audio Coding Mode"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getAC3AudioCodingMode(m_Receiver->AC3AudioCodingMode(), m_Receiver->AC3BitStreamMode()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Center Mix Level"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getAC3CenterMixLevel(m_Receiver->AC3CenterMixLevel()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Surround Mix Level"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getAC3SurroundMixLevel(m_Receiver->AC3SurroundMixLevel()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Dolby Surround Mode"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getAC3DolbySurroundMode(m_Receiver->AC3DolbySurroundMode()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Low Frequency Effects"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *cString::sprintf("%s", m_Receiver->AC3LfeOn() ? tr("On") : tr("Off")), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
offset += OSDROWHEIGHT;
|
||||
m_Osd->DrawText(OSDINFOWIN_X(1), OSDINFOWIN_Y(offset), tr("Dialogue Normalization"), femonTheme[femonConfig.theme].clrInactiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
m_Osd->DrawText(OSDINFOWIN_X(3), OSDINFOWIN_Y(offset), *getAC3DialogLevel(m_Receiver->AC3DialogLevel()), femonTheme[femonConfig.theme].clrActiveText, femonTheme[femonConfig.theme].clrBackground, m_Font);
|
||||
}
|
||||
if (IS_OSDCORNERING) {
|
||||
m_Osd->DrawEllipse(0, OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDCORNERING, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -3);
|
||||
m_Osd->DrawEllipse((OSDWIDTH-OSDCORNERING), OSDINFOWIN_Y(OSDINFOHEIGHT-OSDCORNERING), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent, -4);
|
||||
}
|
||||
}
|
||||
else /* eFemonModeBasic */ {
|
||||
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent);
|
||||
}
|
||||
m_Osd->Flush();
|
||||
}
|
||||
}
|
||||
|
||||
void cFemonOsd::Action(void)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
cTimeMs t;
|
||||
SvdrpCommand_v1_0 cmd;
|
||||
cmd.command = cString::sprintf("PLUG %s INFO\r\n", PLUGIN_NAME_I18N);
|
||||
while (Running()) {
|
||||
t.Set(0);
|
||||
m_SvdrpFrontend = -1;
|
||||
m_SvdrpVideoBitrate = -1.0;
|
||||
m_SvdrpAudioBitrate = -1.0;
|
||||
if (m_Frontend != -1) {
|
||||
CHECK(ioctl(m_Frontend, FE_READ_STATUS, &m_FrontendStatus));
|
||||
CHECK(ioctl(m_Frontend, FE_READ_SIGNAL_STRENGTH, &m_Signal));
|
||||
CHECK(ioctl(m_Frontend, FE_READ_SNR, &m_SNR));
|
||||
CHECK(ioctl(m_Frontend, FE_READ_BER, &m_BER));
|
||||
CHECK(ioctl(m_Frontend, FE_READ_UNCORRECTED_BLOCKS, &m_UNC));
|
||||
DrawInfoWindow();
|
||||
DrawStatusWindow();
|
||||
}
|
||||
else if (m_SvdrpConnection.handle >= 0) {
|
||||
cmd.handle = m_SvdrpConnection.handle;
|
||||
m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd);
|
||||
if (cmd.responseCode == 900) {
|
||||
for (cLine *line = cmd.reply.First(); line; line = cmd.reply.Next(line)) {
|
||||
const char *s = line->Text();
|
||||
if (strncasecmp(s, "CARD:", 5) == 0)
|
||||
m_SvdrpFrontend = strtol(s + 5, NULL, 10);
|
||||
else if (strncasecmp(s, "TYPE:", 5) == 0)
|
||||
m_FrontendInfo.type = (fe_type_t) strtol(s + 5, NULL, 10);
|
||||
else if (strncasecmp(s, "NAME:", 5) == 0)
|
||||
strn0cpy(m_FrontendInfo.name, s + 5, sizeof(m_FrontendInfo.name));
|
||||
else if (strncasecmp(s, "STAT:", 5) == 0)
|
||||
m_FrontendStatus = (fe_status_t) strtol(s + 5, NULL, 16);
|
||||
else if (strncasecmp(s, "SGNL:", 5) == 0)
|
||||
m_Signal = strtol(s + 5, NULL, 16);
|
||||
else if (strncasecmp(s, "SNRA:", 5) == 0)
|
||||
m_SNR = strtol(s + 5, NULL, 16);
|
||||
else if (strncasecmp(s, "BERA:", 5) == 0)
|
||||
m_BER = strtol(s + 5, NULL, 16);
|
||||
else if (strncasecmp(s, "UNCB:", 5) == 0)
|
||||
m_UNC = strtol(s + 5, NULL, 16);
|
||||
else if (strncasecmp(s, "VIBR:", 5) == 0)
|
||||
m_SvdrpVideoBitrate = strtol(s + 5, NULL, 10);
|
||||
else if (strncasecmp(s, "AUBR:", 5) == 0)
|
||||
m_SvdrpAudioBitrate = strtol(s + 5, NULL, 10);
|
||||
}
|
||||
}
|
||||
DrawInfoWindow();
|
||||
DrawStatusWindow();
|
||||
}
|
||||
cCondWait::SleepMs(100 * femonConfig.updateinterval - t.Elapsed());
|
||||
}
|
||||
}
|
||||
|
||||
void cFemonOsd::Show(void)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
int apid[2] = {0, 0};
|
||||
int dpid[2] = {0, 0};
|
||||
char *dev = NULL;
|
||||
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
|
||||
asprintf(&dev, FRONTEND_DEVICE, cDevice::ActualDevice()->CardIndex(), 0);
|
||||
m_Frontend = open(dev, O_RDONLY | O_NONBLOCK);
|
||||
free(dev);
|
||||
if (m_Frontend >= 0) {
|
||||
if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) {
|
||||
esyslog("ERROR: cFemonOsd::Show() cannot read frontend info.");
|
||||
close(m_Frontend);
|
||||
m_Frontend = -1;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (femonConfig.usesvdrp) {
|
||||
if (!SvdrpConnect() || !SvdrpTune())
|
||||
return;
|
||||
}
|
||||
else {
|
||||
esyslog("ERROR: cFemonOsd::Show() cannot open frontend device.");
|
||||
return;
|
||||
}
|
||||
|
||||
m_Osd = cOsdProvider::NewOsd(((Setup.OSDWidth - OSDWIDTH) / 2) + Setup.OSDLeft + femonConfig.osdoffset, ((Setup.OSDHeight - OSDHEIGHT) / 2) + Setup.OSDTop);
|
||||
if (m_Osd) {
|
||||
tArea Areas1[] = { { 0, 0, OSDWIDTH, OSDHEIGHT, femonTheme[femonConfig.theme].bpp } };
|
||||
if (m_Osd->CanHandleAreas(Areas1, sizeof(Areas1) / sizeof(tArea)) == oeOk) {
|
||||
m_Osd->SetAreas(Areas1, sizeof(Areas1) / sizeof(tArea));
|
||||
}
|
||||
else {
|
||||
tArea Areas2[] = { { 0, OSDSTATUSWIN_Y(0), (OSDWIDTH-1), OSDSTATUSWIN_Y(OSDSTATUSHEIGHT-1), femonTheme[femonConfig.theme].bpp },
|
||||
{ 0, OSDINFOWIN_Y(0), (OSDWIDTH-1), OSDINFOWIN_Y(OSDROWHEIGHT-1), femonTheme[femonConfig.theme].bpp },
|
||||
{ 0, OSDINFOWIN_Y(OSDROWHEIGHT), (OSDWIDTH-1), OSDINFOWIN_Y(OSDINFOHEIGHT-1), 2 } };
|
||||
m_Osd->SetAreas(Areas2, sizeof(Areas2) / sizeof(tArea));
|
||||
}
|
||||
m_Osd->DrawRectangle(0, OSDINFOWIN_Y(0), OSDWIDTH, OSDINFOWIN_Y(OSDINFOHEIGHT), clrTransparent);
|
||||
m_Osd->Flush();
|
||||
if (m_Receiver)
|
||||
delete m_Receiver;
|
||||
if (femonConfig.analyzestream) {
|
||||
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
IS_AUDIO_TRACK(track) ? apid[0] = channel->Apid(int(track - ttAudioFirst)) : apid[0] = channel->Apid(0);
|
||||
IS_DOLBY_TRACK(track) ? dpid[0] = channel->Dpid(int(track - ttDolbyFirst)) : dpid[0] = channel->Dpid(0);
|
||||
m_Receiver = new cFemonReceiver(channel->GetChannelID(), channel->Ca(), channel->Vpid(), apid, dpid);
|
||||
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
|
||||
}
|
||||
Start();
|
||||
}
|
||||
}
|
||||
|
||||
void cFemonOsd::ChannelSwitch(const cDevice * device, int channelNumber)
|
||||
{
|
||||
Dprintf("%s(%d,%d)\n", __PRETTY_FUNCTION__, device->DeviceNumber(), channelNumber);
|
||||
int apid[2] = {0, 0};
|
||||
int dpid[2] = {0, 0};
|
||||
char *dev = NULL;
|
||||
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
|
||||
if (!device->IsPrimaryDevice() || !channelNumber || cDevice::PrimaryDevice()->CurrentChannel() != channelNumber)
|
||||
return;
|
||||
close(m_Frontend);
|
||||
asprintf(&dev, FRONTEND_DEVICE, cDevice::ActualDevice()->CardIndex(), 0);
|
||||
m_Frontend = open(dev, O_RDONLY | O_NONBLOCK);
|
||||
free(dev);
|
||||
if (m_Frontend >= 0) {
|
||||
if (ioctl(m_Frontend, FE_GET_INFO, &m_FrontendInfo) < 0) {
|
||||
esyslog("ERROR: cFemonOsd::ChannelSwitch() cannot read frontend info.");
|
||||
close(m_Frontend);
|
||||
m_Frontend = -1;
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (femonConfig.usesvdrp) {
|
||||
if (!SvdrpConnect() || !SvdrpTune())
|
||||
return;
|
||||
}
|
||||
else {
|
||||
esyslog("ERROR: cFemonOsd::ChannelSwitch() cannot open frontend device.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_Receiver)
|
||||
delete m_Receiver;
|
||||
if (femonConfig.analyzestream) {
|
||||
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
IS_AUDIO_TRACK(track) ? apid[0] = channel->Apid(int(track - ttAudioFirst)) : apid[0] = channel->Apid(0);
|
||||
IS_DOLBY_TRACK(track) ? dpid[0] = channel->Dpid(int(track - ttDolbyFirst)) : dpid[0] = channel->Dpid(0);
|
||||
m_Receiver = new cFemonReceiver(channel->GetChannelID(), channel->Ca(), channel->Vpid(), apid, dpid);
|
||||
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
|
||||
}
|
||||
}
|
||||
|
||||
void cFemonOsd::SetAudioTrack(int Index, const char * const *Tracks)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
int apid[2] = {0, 0};
|
||||
int dpid[2] = {0, 0};
|
||||
eTrackType track = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
|
||||
if (m_Receiver)
|
||||
delete m_Receiver;
|
||||
if (femonConfig.analyzestream) {
|
||||
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
IS_AUDIO_TRACK(track) ? apid[0] = channel->Apid(int(track - ttAudioFirst)) : apid[0] = channel->Apid(0);
|
||||
IS_DOLBY_TRACK(track) ? dpid[0] = channel->Dpid(int(track - ttDolbyFirst)) : dpid[0] = channel->Dpid(0);
|
||||
m_Receiver = new cFemonReceiver(channel->GetChannelID(), channel->Ca(), channel->Vpid(), apid, dpid);
|
||||
cDevice::ActualDevice()->AttachReceiver(m_Receiver);
|
||||
}
|
||||
}
|
||||
|
||||
bool cFemonOsd::DeviceSwitch(int direction)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
int device = cDevice::ActualDevice()->DeviceNumber();
|
||||
direction = sgn(direction);
|
||||
if (device >= 0) {
|
||||
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
for (int i = 0; i < cDevice::NumDevices() - 1; i++) {
|
||||
if (direction) {
|
||||
if (++device >= cDevice::NumDevices())
|
||||
device = 0;
|
||||
}
|
||||
else {
|
||||
if (--device < 0)
|
||||
device = cDevice::NumDevices() - 1;
|
||||
}
|
||||
if (cDevice::GetDevice(device)->ProvidesChannel(channel, 0)) {
|
||||
Dprintf("%s(%d) device(%d)\n", __PRETTY_FUNCTION__, direction, device);
|
||||
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), 0);
|
||||
cControl::Shutdown();
|
||||
cDevice::GetDevice(device)->SwitchChannel(channel, true);
|
||||
if (cDevice::GetDevice(device) == cDevice::PrimaryDevice())
|
||||
cDevice::GetDevice(device)->ForceTransferMode();
|
||||
#if defined(APIVERSNUM) && APIVERSNUM < 10500
|
||||
cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel->Vpid(), channel->Apids(), channel->Dpids(), channel->Spids()));
|
||||
#else
|
||||
cControl::Launch(new cTransferControl(cDevice::GetDevice(device), channel->GetChannelID(), channel->Vpid(), channel->Apids(), channel->Dpids(), channel->Spids()));
|
||||
#endif
|
||||
cStatus::MsgChannelSwitch(cDevice::PrimaryDevice(), channel->Number());
|
||||
return (true);
|
||||
}
|
||||
}
|
||||
}
|
||||
return (false);
|
||||
}
|
||||
|
||||
bool cFemonOsd::SvdrpConnect(void)
|
||||
{
|
||||
if (m_SvdrpConnection.handle < 0) {
|
||||
m_SvdrpPlugin = cPluginManager::GetPlugin(SVDRPPLUGIN);
|
||||
if (m_SvdrpPlugin) {
|
||||
m_SvdrpConnection.serverIp = femonConfig.svdrpip;
|
||||
m_SvdrpConnection.serverPort = femonConfig.svdrpport;
|
||||
m_SvdrpConnection.shared = true;
|
||||
m_SvdrpPlugin->Service("SvdrpConnection-v1.0", &m_SvdrpConnection);
|
||||
if (m_SvdrpConnection.handle >= 0) {
|
||||
SvdrpCommand_v1_0 cmd;
|
||||
cmd.handle = m_SvdrpConnection.handle;
|
||||
cmd.command = cString::sprintf("PLUG %s\r\n", PLUGIN_NAME_I18N);
|
||||
m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd);
|
||||
if (cmd.responseCode != 214) {
|
||||
m_SvdrpPlugin->Service("SvdrpConnection-v1.0", &m_SvdrpConnection); // close connection
|
||||
esyslog("ERROR: cFemonOsd::SvdrpConnect() cannot find plugin '%s' on server %s.", PLUGIN_NAME_I18N, *m_SvdrpConnection.serverIp);
|
||||
}
|
||||
}
|
||||
else
|
||||
esyslog("ERROR: cFemonOsd::SvdrpConnect() cannot connect to SVDRP server.");
|
||||
}
|
||||
else
|
||||
esyslog("ERROR: cFemonOsd::SvdrpConnect() cannot find plugin '%s'.", SVDRPPLUGIN);
|
||||
}
|
||||
return m_SvdrpConnection.handle >= 0;
|
||||
}
|
||||
|
||||
bool cFemonOsd::SvdrpTune(void)
|
||||
{
|
||||
if (m_SvdrpPlugin && m_SvdrpConnection.handle >= 0) {
|
||||
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
if (channel) {
|
||||
SvdrpCommand_v1_0 cmd;
|
||||
cmd.handle = m_SvdrpConnection.handle;
|
||||
cmd.command = cString::sprintf("CHAN %s\r\n", *channel->GetChannelID().ToString());
|
||||
m_SvdrpPlugin->Service("SvdrpCommand-v1.0", &cmd);
|
||||
if (cmd.responseCode == 250)
|
||||
return true;
|
||||
esyslog("ERROR: cFemonOsd::SvdrpTune() cannot tune server channel.");
|
||||
}
|
||||
else
|
||||
esyslog("ERROR: cFemonOsd::SvdrpTune() invalid channel.");
|
||||
}
|
||||
else
|
||||
esyslog("ERROR: cFemonOsd::SvdrpTune() unexpected connection state.");
|
||||
return false;
|
||||
}
|
||||
|
||||
double cFemonOsd::GetVideoBitrate(void)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
double value = 0.0;
|
||||
|
||||
if (m_Receiver)
|
||||
value = m_Receiver->VideoBitrate();
|
||||
|
||||
return (value);
|
||||
}
|
||||
|
||||
double cFemonOsd::GetAudioBitrate(void)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
double value = 0.0;
|
||||
|
||||
if (m_Receiver)
|
||||
value = m_Receiver->AudioBitrate();
|
||||
|
||||
return (value);
|
||||
}
|
||||
|
||||
double cFemonOsd::GetDolbyBitrate(void)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
double value = 0.0;
|
||||
|
||||
if (m_Receiver)
|
||||
value = m_Receiver->AC3Bitrate();
|
||||
|
||||
return (value);
|
||||
}
|
||||
|
||||
eOSState cFemonOsd::ProcessKey(eKeys Key)
|
||||
{
|
||||
eOSState state = cOsdObject::ProcessKey(Key);
|
||||
if (state == osUnknown) {
|
||||
switch (Key) {
|
||||
case k0:
|
||||
if ((m_Number == 0) && (m_OldNumber != 0)) {
|
||||
m_Number = m_OldNumber;
|
||||
m_OldNumber = cDevice::CurrentChannel();
|
||||
Channels.SwitchTo(m_Number);
|
||||
m_Number = 0;
|
||||
return osContinue;
|
||||
}
|
||||
case k1 ... k9:
|
||||
if (m_Number >= 0) {
|
||||
m_Number = m_Number * 10 + Key - k0;
|
||||
if (m_Number > 0) {
|
||||
DrawStatusWindow();
|
||||
cChannel *ch = Channels.GetByNumber(m_Number);
|
||||
m_InputTime.Set(0);
|
||||
// Lets see if there can be any useful further input:
|
||||
int n = ch ? m_Number * 10 : 0;
|
||||
while (ch && (ch = Channels.Next(ch)) != NULL) {
|
||||
if (!ch->GroupSep()) {
|
||||
if (n <= ch->Number() && ch->Number() <= n + 9) {
|
||||
n = 0;
|
||||
break;
|
||||
}
|
||||
if (ch->Number() > n)
|
||||
n *= 10;
|
||||
}
|
||||
}
|
||||
if (n > 0) {
|
||||
// This channel is the only one that fits the input, so let's take it right away:
|
||||
m_OldNumber = cDevice::CurrentChannel();
|
||||
Channels.SwitchTo(m_Number);
|
||||
m_Number = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case kBack:
|
||||
return osEnd;
|
||||
case kGreen:
|
||||
{
|
||||
eTrackType types[ttMaxTrackTypes];
|
||||
eTrackType CurrentAudioTrack = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
|
||||
int numTracks = 0;
|
||||
int oldTrack = 0;
|
||||
int track = 0;
|
||||
for (int i = ttAudioFirst; i <= ttDolbyLast; i++) {
|
||||
const tTrackId *TrackId = cDevice::PrimaryDevice()->GetTrack(eTrackType(i));
|
||||
if (TrackId && TrackId->id) {
|
||||
types[numTracks] = eTrackType(i);
|
||||
if (i == CurrentAudioTrack)
|
||||
track = numTracks;
|
||||
numTracks++;
|
||||
}
|
||||
}
|
||||
oldTrack = track;
|
||||
if (++track >= numTracks)
|
||||
track = 0;
|
||||
if (track != oldTrack) {
|
||||
cDevice::PrimaryDevice()->SetCurrentAudioTrack(types[track]);
|
||||
Setup.CurrentDolby = IS_DOLBY_TRACK(types[track]);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case kYellow:
|
||||
if (IS_AUDIO_TRACK(cDevice::PrimaryDevice()->GetCurrentAudioTrack())) {
|
||||
int audioChannel = cDevice::PrimaryDevice()->GetAudioChannel();
|
||||
int oldAudioChannel = audioChannel;
|
||||
if (++audioChannel > 2)
|
||||
audioChannel = 0;
|
||||
if (audioChannel != oldAudioChannel) {
|
||||
cDevice::PrimaryDevice()->SetAudioChannel(audioChannel);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case kRight:
|
||||
DeviceSwitch(1);
|
||||
break;
|
||||
case kLeft:
|
||||
DeviceSwitch(-1);
|
||||
break;
|
||||
case kUp|k_Repeat:
|
||||
case kUp:
|
||||
case kDown|k_Repeat:
|
||||
case kDown:
|
||||
m_OldNumber = cDevice::CurrentChannel();
|
||||
cDevice::SwitchChannel(NORMALKEY(Key) == kUp ? 1 : -1);
|
||||
m_Number = 0;
|
||||
break;
|
||||
case kNone:
|
||||
if (m_Number && (m_InputTime.Elapsed() > CHANNELINPUT_TIMEOUT)) {
|
||||
if (Channels.GetByNumber(m_Number)) {
|
||||
m_OldNumber = cDevice::CurrentChannel();
|
||||
Channels.SwitchTo(m_Number);
|
||||
m_Number = 0;
|
||||
}
|
||||
else {
|
||||
m_InputTime.Set(0);
|
||||
m_Number = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case kOk:
|
||||
// toggle between display modes
|
||||
if (++m_DisplayMode == eFemonModeAC3 && !Channels.GetByNumber(cDevice::CurrentChannel())->Dpid(0)) m_DisplayMode++;
|
||||
if (m_DisplayMode >= eFemonModeMaxNumber) m_DisplayMode = 0;
|
||||
DrawInfoWindow();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
state = osContinue;
|
||||
}
|
||||
return state;
|
||||
}
|
82
femonosd.h
Normal file
82
femonosd.h
Normal file
@ -0,0 +1,82 @@
|
||||
/*
|
||||
* Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifndef __FEMONOSD_H
|
||||
#define __FEMONOSD_H
|
||||
|
||||
#include <linux/dvb/frontend.h>
|
||||
#include <sys/time.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <vdr/osd.h>
|
||||
#include <vdr/thread.h>
|
||||
#include <vdr/status.h>
|
||||
#include <vdr/plugin.h>
|
||||
#include <vdr/channels.h>
|
||||
#include <vdr/transfer.h>
|
||||
#include <vdr/tools.h>
|
||||
#include "svdrpservice.h"
|
||||
|
||||
#define MAX_BM_NUMBER 5
|
||||
|
||||
class cFemonOsd : public cOsdObject, public cThread, public cStatus {
|
||||
private:
|
||||
enum { MAX_BMNUMBERS = 6 };
|
||||
static cFemonOsd *pInstance;
|
||||
cOsd *m_Osd;
|
||||
cFemonReceiver *m_Receiver;
|
||||
int m_Frontend;
|
||||
int m_SvdrpFrontend;
|
||||
double m_SvdrpVideoBitrate;
|
||||
double m_SvdrpAudioBitrate;
|
||||
SvdrpConnection_v1_0 m_SvdrpConnection;
|
||||
cPlugin *m_SvdrpPlugin;
|
||||
struct dvb_frontend_info m_FrontendInfo;
|
||||
int m_Number;
|
||||
int m_OldNumber;
|
||||
uint16_t m_SNR;
|
||||
uint16_t m_Signal;
|
||||
uint32_t m_BER;
|
||||
uint32_t m_UNC;
|
||||
fe_status_t m_FrontendStatus;
|
||||
int m_DisplayMode;
|
||||
const cFont *m_Font;
|
||||
cTimeMs m_InputTime;
|
||||
cMutex* m_Mutex;
|
||||
static cBitmap bmStereo, bmMonoLeft, bmMonoRight, bmDD, bmDD20, bmDD51;
|
||||
static cBitmap bmNumbers[MAX_BMNUMBERS];
|
||||
static cBitmap bmDevice, bmPAL, bmNTSC, bmSVDRP;
|
||||
static cBitmap bmAspectRatio_1_1, bmAspectRatio_16_9, bmAspectRatio_2_21_1, bmAspectRatio_4_3;
|
||||
static cBitmap bmLock, bmSignal, bmCarrier, bmViterbi, bmSync;
|
||||
void DrawStatusWindow(void);
|
||||
void DrawInfoWindow(void);
|
||||
bool SvdrpConnect(void);
|
||||
bool SvdrpTune(void);
|
||||
|
||||
protected:
|
||||
cFemonOsd();
|
||||
cFemonOsd(const cFemonOsd&);
|
||||
cFemonOsd& operator= (const cFemonOsd&);
|
||||
virtual void Action(void);
|
||||
virtual void ChannelSwitch(const cDevice * device, int channelNumber);
|
||||
virtual void SetAudioTrack(int Index, const char * const *Tracks);
|
||||
|
||||
public:
|
||||
static cFemonOsd *Instance(bool create = false);
|
||||
~cFemonOsd();
|
||||
|
||||
virtual void Show(void);
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
|
||||
bool DeviceSwitch(int direction);
|
||||
double GetVideoBitrate(void);
|
||||
double GetAudioBitrate(void);
|
||||
double GetDolbyBitrate(void);
|
||||
};
|
||||
|
||||
#endif //__FEMONOSD_H
|
||||
|
371
femonreceiver.c
Normal file
371
femonreceiver.c
Normal file
@ -0,0 +1,371 @@
|
||||
/*
|
||||
* Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
#include "femontools.h"
|
||||
#include "femoncfg.h"
|
||||
#include "femonreceiver.h"
|
||||
|
||||
#define TS_SIZE 188
|
||||
#define PAY_START 0x40
|
||||
#define ADAPT_FIELD 0x20
|
||||
#define PAYLOAD 0x10
|
||||
#define PTS_DTS_FLAGS 0xC0
|
||||
|
||||
cFemonReceiver::cFemonReceiver(tChannelID ChannelID, int Ca, int Vpid, int Apid[], int Dpid[])
|
||||
#if defined(APIVERSNUM) && APIVERSNUM < 10500
|
||||
:cReceiver(Ca, -1, Vpid, Apid, Dpid, NULL), cThread("femon receiver")
|
||||
#else
|
||||
:cReceiver(ChannelID, -1, Vpid, Apid, Dpid, NULL), cThread("femon receiver")
|
||||
#endif
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
m_VideoPid = Vpid;
|
||||
m_AudioPid = Apid[0];
|
||||
m_AC3Pid = Dpid[0];
|
||||
m_VideoValid = false;
|
||||
m_VideoPacketCount = 0;
|
||||
m_VideoHorizontalSize = 0;
|
||||
m_VideoVerticalSize = 0;
|
||||
m_VideoAspectRatio = AR_RESERVED;
|
||||
m_VideoFormat = VF_UNKNOWN;
|
||||
m_VideoFrameRate = 0.0;
|
||||
m_VideoStreamBitrate = 0.0;
|
||||
m_VideoBitrate = 0.0;
|
||||
m_AudioValid = false;
|
||||
m_AudioPacketCount = 0;
|
||||
m_AudioStreamBitrate = -2.0;
|
||||
m_AudioBitrate = 0.0;
|
||||
m_AudioSamplingFreq = -1;
|
||||
m_AudioMPEGLayer = 0;
|
||||
m_AudioBitrate = 0.0;
|
||||
m_AC3Valid = false;
|
||||
m_AC3PacketCount = 0;
|
||||
m_AC3StreamBitrate = 0;
|
||||
m_AC3SamplingFreq = 0;
|
||||
m_AC3Bitrate = 0;
|
||||
m_AC3FrameSize = 0;
|
||||
m_AC3BitStreamMode = FR_NOTVALID;
|
||||
m_AC3AudioCodingMode = FR_NOTVALID;
|
||||
m_AC3CenterMixLevel = FR_NOTVALID;
|
||||
m_AC3SurroundMixLevel = FR_NOTVALID;
|
||||
m_AC3DolbySurroundMode = FR_NOTVALID;
|
||||
m_AC3LfeOn = false;
|
||||
m_AC3DialogLevel = FR_NOTVALID;
|
||||
}
|
||||
|
||||
cFemonReceiver::~cFemonReceiver(void)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
if (Running())
|
||||
Cancel(3);
|
||||
Detach();
|
||||
}
|
||||
|
||||
/* The following function originates from libdvbmpeg: */
|
||||
void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count)
|
||||
{
|
||||
uint8_t *headr;
|
||||
int found = 0;
|
||||
int c = 0;
|
||||
//m_VideoValid = false;
|
||||
while ((found < 4) && ((c + 4) < count)) {
|
||||
uint8_t *b;
|
||||
b = mbuf + c;
|
||||
if ((b[0] == 0x00) && (b[1] == 0x00) && (b[2] == 0x01) && (b[3] == 0xb3))
|
||||
found = 4;
|
||||
else
|
||||
c++;
|
||||
}
|
||||
if ((!found) || ((c + 16) >= count)) return;
|
||||
m_VideoValid = true;
|
||||
headr = mbuf + c + 4;
|
||||
m_VideoHorizontalSize = ((headr[1] & 0xF0) >> 4) | (headr[0] << 4);
|
||||
m_VideoVerticalSize = ((headr[1] & 0x0F) << 8) | (headr[2]);
|
||||
int sw = (int)((headr[3] & 0xF0) >> 4);
|
||||
switch ( sw ){
|
||||
case 1:
|
||||
m_VideoAspectRatio = AR_1_1;
|
||||
break;
|
||||
case 2:
|
||||
m_VideoAspectRatio = AR_4_3;
|
||||
break;
|
||||
case 3:
|
||||
m_VideoAspectRatio = AR_16_9;
|
||||
break;
|
||||
case 4:
|
||||
m_VideoAspectRatio = AR_2_21_1;
|
||||
break;
|
||||
case 5 ... 15:
|
||||
default:
|
||||
m_VideoAspectRatio = AR_RESERVED;
|
||||
break;
|
||||
}
|
||||
sw = (int)(headr[3] & 0x0F);
|
||||
switch ( sw ) {
|
||||
case 1:
|
||||
m_VideoFrameRate = 24000 / 1001.0;
|
||||
m_VideoFormat = VF_UNKNOWN;
|
||||
break;
|
||||
case 2:
|
||||
m_VideoFrameRate = 24.0;
|
||||
m_VideoFormat = VF_UNKNOWN;
|
||||
break;
|
||||
case 3:
|
||||
m_VideoFrameRate = 25.0;
|
||||
m_VideoFormat = VF_PAL;
|
||||
break;
|
||||
case 4:
|
||||
m_VideoFrameRate = 30000 / 1001.0;
|
||||
m_VideoFormat = VF_NTSC;
|
||||
break;
|
||||
case 5:
|
||||
m_VideoFrameRate = 30.0;
|
||||
m_VideoFormat = VF_NTSC;
|
||||
break;
|
||||
case 6:
|
||||
m_VideoFrameRate = 50.0;
|
||||
m_VideoFormat = VF_PAL;
|
||||
break;
|
||||
case 7:
|
||||
m_VideoFrameRate = 60.0;
|
||||
m_VideoFormat = VF_NTSC;
|
||||
break;
|
||||
case 8:
|
||||
m_VideoFrameRate = 60000 / 1001.0;
|
||||
m_VideoFormat = VF_NTSC;
|
||||
break;
|
||||
case 9 ... 15:
|
||||
default:
|
||||
m_VideoFrameRate = 0;
|
||||
m_VideoFormat = VF_UNKNOWN;
|
||||
break;
|
||||
}
|
||||
m_VideoStreamBitrate = 400.0 * (((headr[4] << 10) & 0x0003FC00UL) | ((headr[5] << 2) & 0x000003FCUL) | (((headr[6] & 0xC0) >> 6) & 0x00000003UL));
|
||||
}
|
||||
|
||||
static unsigned int bitrates[3][16] =
|
||||
{
|
||||
{0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 0},
|
||||
{0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 0},
|
||||
{0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 0}
|
||||
};
|
||||
|
||||
static unsigned int samplerates[4] =
|
||||
{441, 480, 320, 0};
|
||||
|
||||
/* The following function originates from libdvbmpeg: */
|
||||
void cFemonReceiver::GetAudioInfo(uint8_t *mbuf, int count)
|
||||
{
|
||||
uint8_t *headr;
|
||||
int found = 0;
|
||||
int c = 0;
|
||||
int tmp = 0;
|
||||
//m_AudioValid = false;
|
||||
while (!found && (c < count)) {
|
||||
uint8_t *b = mbuf + c;
|
||||
if ((b[0] == 0xff) && ((b[1] & 0xf8) == 0xf8))
|
||||
found = 1;
|
||||
else
|
||||
c++;
|
||||
}
|
||||
if ((!found) || ((c + 3) >= count)) return;
|
||||
m_AudioValid = true;
|
||||
headr = mbuf + c;
|
||||
m_AudioMPEGLayer = 4 - ((headr[1] & 0x06) >> 1);
|
||||
tmp = bitrates[(3 - ((headr[1] & 0x06) >> 1))][(headr[2] >> 4)] * 1000;
|
||||
if (tmp == 0)
|
||||
m_AudioStreamBitrate = (double)FR_FREE;
|
||||
else if (tmp == 0xf)
|
||||
m_AudioStreamBitrate = (double)FR_RESERVED;
|
||||
else
|
||||
m_AudioStreamBitrate = tmp;
|
||||
tmp = samplerates[((headr[2] & 0x0c) >> 2)] * 100;
|
||||
if (tmp == 3)
|
||||
m_AudioSamplingFreq = FR_RESERVED;
|
||||
else
|
||||
m_AudioSamplingFreq = tmp;
|
||||
}
|
||||
|
||||
static unsigned int ac3_bitrates[32] =
|
||||
{32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 576, 640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
|
||||
static unsigned int ac3_freq[4] =
|
||||
{480, 441, 320, 0};
|
||||
|
||||
static unsigned int ac3_frames[3][32] =
|
||||
{
|
||||
{64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 640, 768, 896, 1024, 1152, 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{69, 87, 104, 121, 139, 174, 208, 243, 278, 348, 417, 487, 557, 696, 835, 975, 1114, 1253, 1393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
|
||||
{96, 120, 144, 168, 192, 240, 288, 336, 384, 480, 576, 672, 768, 960, 1152, 1344, 1536, 1728, 1920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
/*
|
||||
** AC3 Audio Header: http://www.atsc.org/standards/a_52a.pdf
|
||||
** The following function originates from libdvbmpeg:
|
||||
*/
|
||||
void cFemonReceiver::GetAC3Info(uint8_t *mbuf, int count)
|
||||
{
|
||||
uint8_t *headr;
|
||||
int found = 0;
|
||||
int c = 0;
|
||||
uint8_t frame;
|
||||
//m_AC3Valid = false;
|
||||
while (!found && (c < count)) {
|
||||
uint8_t *b = mbuf + c;
|
||||
if ((b[0] == 0x0b) && (b[1] == 0x77))
|
||||
found = 1;
|
||||
else
|
||||
c++;
|
||||
}
|
||||
if ((!found) || ((c + 5) >= count)) return;
|
||||
m_AC3Valid = true;
|
||||
headr = mbuf + c + 2;
|
||||
frame = (headr[2] & 0x3f);
|
||||
m_AC3StreamBitrate = ac3_bitrates[frame >> 1] * 1000;
|
||||
int fr = (headr[2] & 0xc0 ) >> 6;
|
||||
m_AC3SamplingFreq = ac3_freq[fr] * 100;
|
||||
m_AC3FrameSize = ac3_frames[fr][frame >> 1];
|
||||
if ((frame & 1) && (fr == 1)) m_AC3FrameSize++;
|
||||
m_AC3FrameSize <<= 1;
|
||||
m_AC3BitStreamMode = (headr[3] & 7);
|
||||
m_AC3AudioCodingMode = (headr[4] & 0xE0) >> 5;
|
||||
if ((m_AC3AudioCodingMode & 0x01) && (m_AC3AudioCodingMode != 0x01)) {
|
||||
// 3 front channels
|
||||
m_AC3CenterMixLevel = (headr[4] & 0x18) >> 3;
|
||||
if (m_AC3AudioCodingMode & 0x04) {
|
||||
// a surround channel exists
|
||||
m_AC3SurroundMixLevel = (headr[4] & 0x06) >> 1;
|
||||
if (m_AC3AudioCodingMode == 0x02) {
|
||||
// if in 2/0 mode
|
||||
m_AC3DolbySurroundMode = ((headr[4] & 0x01) << 1) | ((headr[5] & 0x80) >> 7);
|
||||
m_AC3LfeOn = (headr[5] & 0x40) >> 6;
|
||||
m_AC3DialogLevel = (headr[5] & 0x3e) >> 1;
|
||||
}
|
||||
else {
|
||||
m_AC3DolbySurroundMode = FR_NOTVALID;
|
||||
m_AC3LfeOn = (headr[4] & 0x01);
|
||||
m_AC3DialogLevel = (headr[5] & 0xF8) >> 3;
|
||||
}
|
||||
}
|
||||
else {
|
||||
m_AC3SurroundMixLevel = FR_NOTVALID;
|
||||
if (m_AC3AudioCodingMode == 0x02) {
|
||||
// if in 2/0 mode
|
||||
m_AC3DolbySurroundMode = (headr[4] & 0x06) >> 1;
|
||||
m_AC3LfeOn = (headr[4] & 0x01);
|
||||
m_AC3DialogLevel = (headr[5] & 0xF8) >> 3;
|
||||
}
|
||||
else {
|
||||
m_AC3DolbySurroundMode = FR_NOTVALID;
|
||||
m_AC3LfeOn = (headr[4] & 0x04) >> 2;
|
||||
m_AC3DialogLevel = (headr[4] & 0x03) << 3 | ((headr[5] & 0xE0) >> 5);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
m_AC3CenterMixLevel = FR_NOTVALID;
|
||||
if (m_AC3AudioCodingMode & 0x04) {
|
||||
// a surround channel exists
|
||||
m_AC3SurroundMixLevel = (headr[4] & 0x18) >> 3;
|
||||
if (m_AC3AudioCodingMode == 0x02) {
|
||||
// if in 2/0 mode
|
||||
m_AC3DolbySurroundMode = (headr[4] & 0x06) >> 1;
|
||||
m_AC3LfeOn = (headr[4] & 0x01);
|
||||
m_AC3DialogLevel = (headr[5] & 0xF8) >> 3;
|
||||
}
|
||||
else {
|
||||
m_AC3DolbySurroundMode = FR_NOTVALID;
|
||||
m_AC3LfeOn = (headr[4] & 0x04) >> 2;
|
||||
m_AC3DialogLevel = (headr[4] & 0x03) << 3 | ((headr[5] & 0xE0) >> 5);
|
||||
}
|
||||
}
|
||||
else {
|
||||
m_AC3SurroundMixLevel = FR_NOTVALID;
|
||||
if (m_AC3AudioCodingMode == 0x02) {
|
||||
// if in 2/0 mode
|
||||
m_AC3DolbySurroundMode = (headr[4] & 0x18) >> 3;
|
||||
m_AC3LfeOn = (headr[4] & 0x04) >> 2;
|
||||
m_AC3DialogLevel = (headr[4] & 0x03) << 3 | ((headr[5] & 0xE0) >> 5);
|
||||
}
|
||||
else {
|
||||
m_AC3DolbySurroundMode = FR_NOTVALID;
|
||||
m_AC3LfeOn = (headr[4] & 0x10) >> 4;
|
||||
m_AC3DialogLevel = ((headr[4] & 0x0F) << 1) | ((headr[5] & 0x80) >> 7);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cFemonReceiver::Activate(bool On)
|
||||
{
|
||||
Dprintf("%s(%d)\n", __PRETTY_FUNCTION__, On);
|
||||
if (On)
|
||||
Start();
|
||||
else
|
||||
Cancel();
|
||||
}
|
||||
|
||||
void cFemonReceiver::Receive(uchar *Data, int Length)
|
||||
{
|
||||
// TS packet length: TS_SIZE
|
||||
if (Length == TS_SIZE) {
|
||||
int pid = ((Data[1] & 0x1f) << 8) | (Data[2]);
|
||||
if (pid == m_VideoPid) {
|
||||
m_VideoPacketCount++;
|
||||
}
|
||||
else if (pid == m_AudioPid) {
|
||||
m_AudioPacketCount++;
|
||||
}
|
||||
else if (pid == m_AC3Pid) {
|
||||
m_AC3PacketCount++;
|
||||
}
|
||||
/* the following originates from libdvbmpeg: */
|
||||
if (!(Data[3] & PAYLOAD)) {
|
||||
return;
|
||||
}
|
||||
uint8_t off = 0;
|
||||
if (Data[3] & ADAPT_FIELD) {
|
||||
off = Data[4] + 1;
|
||||
}
|
||||
if (Data[1] & PAY_START) {
|
||||
uint8_t *sb = Data + 4 + off;
|
||||
if (sb[7] & PTS_DTS_FLAGS) {
|
||||
uint8_t *pay = sb + sb[8] + 9;
|
||||
int l = TS_SIZE - 13 - off - sb[8];
|
||||
if (pid == m_VideoPid) {
|
||||
GetVideoInfo(pay, l);
|
||||
}
|
||||
else if (pid == m_AudioPid) {
|
||||
GetAudioInfo(pay, l);
|
||||
}
|
||||
else if (pid == m_AC3Pid) {
|
||||
GetAC3Info(pay, l);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* end */
|
||||
}
|
||||
}
|
||||
|
||||
void cFemonReceiver::Action(void)
|
||||
{
|
||||
Dprintf("%s()\n", __PRETTY_FUNCTION__);
|
||||
cTimeMs t;
|
||||
while (Running()) {
|
||||
t.Set(0);
|
||||
// TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit
|
||||
m_VideoBitrate = (10.0 * 8.0 * 184.0 * m_VideoPacketCount) / femonConfig.calcinterval;
|
||||
m_VideoPacketCount = 0;
|
||||
m_AudioBitrate = (10.0 * 8.0 * 184.0 * m_AudioPacketCount) / femonConfig.calcinterval;
|
||||
m_AudioPacketCount = 0;
|
||||
m_AC3Bitrate = (10.0 * 8.0 * 184.0 * m_AC3PacketCount) / femonConfig.calcinterval;
|
||||
m_AC3PacketCount = 0;
|
||||
cCondWait::SleepMs(100 * femonConfig.calcinterval - t.Elapsed());
|
||||
}
|
||||
}
|
134
femonreceiver.h
Normal file
134
femonreceiver.h
Normal file
@ -0,0 +1,134 @@
|
||||
/*
|
||||
* Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifndef __FEMONRECEIVER_H
|
||||
#define __FEMONRECEIVER_H
|
||||
|
||||
#include <vdr/thread.h>
|
||||
#include <vdr/receiver.h>
|
||||
|
||||
enum eVideoFormat {
|
||||
VF_UNKNOWN = 0,
|
||||
VF_PAL = 1,
|
||||
VF_NTSC = 2,
|
||||
};
|
||||
|
||||
enum eAspectRatio {
|
||||
AR_RESERVED = 0,
|
||||
AR_1_1 = 100,
|
||||
AR_4_3 = 133,
|
||||
AR_16_9 = 177,
|
||||
AR_2_21_1 = 233,
|
||||
};
|
||||
|
||||
enum eCenterMixLevel {
|
||||
CML_MINUS_3dB = 0,
|
||||
CML_MINUS_4_5dB = 1,
|
||||
CML_MINUS_6dB = 2,
|
||||
CML_RESERVED = 3,
|
||||
};
|
||||
|
||||
enum eSurroundMixLevel {
|
||||
SML_MINUS_3dB = 0,
|
||||
SML_MINUS_6dB = 1,
|
||||
SML_0_dB = 2,
|
||||
SML_RESERVED = 3,
|
||||
};
|
||||
|
||||
enum eDolbySurroundMode {
|
||||
DSM_NOT_INDICATED = 0,
|
||||
DSM_NOT_DOLBYSURROUND = 1,
|
||||
DSM_DOLBYSURROUND = 2,
|
||||
DSM_RESERVED = 3,
|
||||
};
|
||||
|
||||
enum eReveiverCodes {
|
||||
FR_RESERVED = -1,
|
||||
FR_FREE = -2,
|
||||
FR_NOTVALID = -3
|
||||
};
|
||||
|
||||
class cFemonReceiver : public cReceiver, public cThread {
|
||||
private:
|
||||
int m_VideoPid;
|
||||
int m_AudioPid;
|
||||
int m_AC3Pid;
|
||||
bool m_VideoValid;
|
||||
int m_VideoPacketCount;
|
||||
int m_VideoHorizontalSize;
|
||||
int m_VideoVerticalSize;
|
||||
int m_VideoAspectRatio;
|
||||
int m_VideoFormat;
|
||||
double m_VideoFrameRate;
|
||||
double m_VideoStreamBitrate;
|
||||
double m_VideoBitrate;
|
||||
bool m_AudioValid;
|
||||
int m_AudioPacketCount;
|
||||
double m_AudioStreamBitrate;
|
||||
double m_AudioBitrate;
|
||||
int m_AudioSamplingFreq;
|
||||
int m_AudioMPEGLayer;
|
||||
bool m_AC3Valid;
|
||||
int m_AC3PacketCount;
|
||||
double m_AC3Bitrate;
|
||||
int m_AC3FrameSize;
|
||||
int m_AC3SamplingFreq;
|
||||
int m_AC3StreamBitrate;
|
||||
int m_AC3BitStreamMode;
|
||||
int m_AC3AudioCodingMode;
|
||||
int m_AC3CenterMixLevel;
|
||||
int m_AC3SurroundMixLevel;
|
||||
int m_AC3DolbySurroundMode;
|
||||
bool m_AC3LfeOn;
|
||||
int m_AC3DialogLevel;
|
||||
void GetVideoInfo(uint8_t *mbuf, int count);
|
||||
void GetAudioInfo(uint8_t *mbuf, int count);
|
||||
void GetAC3Info(uint8_t *mbuf, int count);
|
||||
|
||||
protected:
|
||||
virtual void Activate(bool On);
|
||||
virtual void Receive(uchar *Data, int Length);
|
||||
virtual void Action(void);
|
||||
|
||||
public:
|
||||
cFemonReceiver(tChannelID ChannelID, int Ca, int Vpid, int Apid[], int Dpid[]);
|
||||
virtual ~cFemonReceiver();
|
||||
|
||||
bool VideoValid(void) { return m_VideoValid; }; // boolean
|
||||
int VideoHorizontalSize(void) { return m_VideoHorizontalSize; }; // pixels
|
||||
int VideoVerticalSize(void) { return m_VideoVerticalSize; }; // pixels
|
||||
int VideoAspectRatio(void) { return m_VideoAspectRatio; }; // eAspectRatio
|
||||
int VideoFormat(void) { return m_VideoFormat; }; // eVideoFormat
|
||||
double VideoFrameRate(void) { return m_VideoFrameRate; }; // Hz
|
||||
double VideoStreamBitrate(void) { return m_VideoStreamBitrate; }; // bit/s
|
||||
double VideoBitrate(void) { return m_VideoBitrate; }; // bit/s
|
||||
|
||||
bool AudioValid(void) { return m_AudioValid; }; // boolean
|
||||
int AudioMPEGLayer(void) { return m_AudioMPEGLayer; }; // layer number
|
||||
int AudioSamplingFreq(void) { return m_AudioSamplingFreq; }; // Hz
|
||||
double AudioStreamBitrate(void) { return m_AudioStreamBitrate; }; // bit/s
|
||||
double AudioBitrate(void) { return m_AudioBitrate; }; // bit/s
|
||||
|
||||
bool AC3Valid(void) { return m_AC3Valid; }; // boolean
|
||||
int AC3SamplingFreq(void) { return m_AC3SamplingFreq; }; // Hz
|
||||
double AC3StreamBitrate(void) { return m_AC3StreamBitrate; }; // bit/s
|
||||
double AC3Bitrate(void) { return m_AC3Bitrate; }; // bit/s
|
||||
int AC3FrameSize(void) { return m_AC3FrameSize; }; // Bytes
|
||||
int AC3BitStreamMode(void) { return m_AC3BitStreamMode; }; // 0..7
|
||||
int AC3AudioCodingMode(void) { return m_AC3AudioCodingMode; }; // 0..7
|
||||
bool AC3_2_0(void) { return m_AC3AudioCodingMode == 2; }; // DD 2.0
|
||||
bool AC3_5_1(void) { return m_AC3AudioCodingMode == 7; }; // DD 5.1
|
||||
int AC3CenterMixLevel(void) { return m_AC3CenterMixLevel; }; // eCenterMixLevel
|
||||
int AC3SurroundMixLevel(void) { return m_AC3SurroundMixLevel; }; // eSurroundMixLevel
|
||||
int AC3DolbySurroundMode(void) { return m_AC3DolbySurroundMode; }; // eDolbySurroundMode
|
||||
bool AC3LfeOn(void) { return m_AC3LfeOn; }; // boolean
|
||||
int AC3DialogLevel(void) { return m_AC3DialogLevel; }; // -dB
|
||||
};
|
||||
|
||||
#endif //__FEMONRECEIVER_H
|
||||
|
@ -3,18 +3,21 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifndef __FEMONSERVICE_H
|
||||
#define __FEMONSERVICE_H
|
||||
|
||||
struct FemonService_v1_1 {
|
||||
#include <linux/dvb/frontend.h>
|
||||
|
||||
struct FemonService_v1_0 {
|
||||
cString fe_name;
|
||||
cString fe_status;
|
||||
double fe_cnr;
|
||||
double fe_signal;
|
||||
double fe_ber;
|
||||
double fe_per;
|
||||
uint16_t fe_snr;
|
||||
uint16_t fe_signal;
|
||||
uint32_t fe_ber;
|
||||
uint32_t fe_unc;
|
||||
double video_bitrate;
|
||||
double audio_bitrate;
|
||||
double dolby_bitrate;
|
||||
|
435
femontools.c
Normal file
435
femontools.c
Normal file
@ -0,0 +1,435 @@
|
||||
/*
|
||||
* Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <linux/dvb/frontend.h>
|
||||
#include "femoni18n.h"
|
||||
#include "femonreceiver.h"
|
||||
#include "femonosd.h"
|
||||
#include "femontools.h"
|
||||
|
||||
cString getFrontendInfo(int cardIndex)
|
||||
{
|
||||
cString info;
|
||||
struct dvb_frontend_info value;
|
||||
fe_status_t status;
|
||||
uint16_t signal = 0;
|
||||
uint16_t snr = 0;
|
||||
uint32_t ber = 0;
|
||||
uint32_t unc = 0;
|
||||
char *dev = NULL;
|
||||
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
|
||||
|
||||
asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0);
|
||||
int fe = open(dev, O_RDONLY | O_NONBLOCK);
|
||||
free(dev);
|
||||
if (fe < 0)
|
||||
return NULL;
|
||||
CHECK(ioctl(fe, FE_GET_INFO, &value));
|
||||
CHECK(ioctl(fe, FE_READ_STATUS, &status));
|
||||
CHECK(ioctl(fe, FE_READ_SIGNAL_STRENGTH, &signal));
|
||||
CHECK(ioctl(fe, FE_READ_SNR, &snr));
|
||||
CHECK(ioctl(fe, FE_READ_BER, &ber));
|
||||
CHECK(ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &unc));
|
||||
close(fe);
|
||||
|
||||
info = cString::sprintf("CARD:%d\nTYPE:%d\nNAME:%s\nSTAT:%02X\nSGNL:%04X\nSNRA:%04X\nBERA:%08X\nUNCB:%08X", cardIndex, value.type, value.name, status, signal, snr, ber, unc);
|
||||
|
||||
if (cFemonOsd::Instance())
|
||||
info = cString::sprintf("%s\nVIBR:%.0f\nAUBR:%.0f\nDDBR:%.0f", *info, cFemonOsd::Instance()->GetVideoBitrate(), cFemonOsd::Instance()->GetAudioBitrate(), cFemonOsd::Instance()->GetDolbyBitrate());
|
||||
|
||||
if (channel)
|
||||
info = cString::sprintf("%s\nCHAN:%s", *info, *channel->ToText());
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
cString getFrontendName(int cardIndex)
|
||||
{
|
||||
struct dvb_frontend_info value;
|
||||
char *dev = NULL;
|
||||
|
||||
asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0);
|
||||
int fe = open(dev, O_RDONLY | O_NONBLOCK);
|
||||
free(dev);
|
||||
if (fe < 0)
|
||||
return NULL;
|
||||
CHECK(ioctl(fe, FE_GET_INFO, &value));
|
||||
close(fe);
|
||||
|
||||
return (cString::sprintf("%s on device #%d", value.name, cardIndex));
|
||||
}
|
||||
|
||||
cString getFrontendStatus(int cardIndex)
|
||||
{
|
||||
fe_status_t value;
|
||||
char *dev = NULL;
|
||||
|
||||
asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0);
|
||||
int fe = open(dev, O_RDONLY | O_NONBLOCK);
|
||||
free(dev);
|
||||
if (fe < 0)
|
||||
return NULL;
|
||||
CHECK(ioctl(fe, FE_READ_STATUS, &value));
|
||||
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));
|
||||
}
|
||||
|
||||
uint16_t getSignal(int cardIndex)
|
||||
{
|
||||
uint16_t value = 0;
|
||||
char *dev = NULL;
|
||||
|
||||
asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0);
|
||||
int fe = open(dev, O_RDONLY | O_NONBLOCK);
|
||||
free(dev);
|
||||
if (fe < 0)
|
||||
return (value);
|
||||
CHECK(ioctl(fe, FE_READ_SIGNAL_STRENGTH, &value));
|
||||
close(fe);
|
||||
|
||||
return (value);
|
||||
}
|
||||
|
||||
uint16_t getSNR(int cardIndex)
|
||||
{
|
||||
uint16_t value = 0;
|
||||
char *dev = NULL;
|
||||
|
||||
asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0);
|
||||
int fe = open(dev, O_RDONLY | O_NONBLOCK);
|
||||
free(dev);
|
||||
if (fe < 0)
|
||||
return (value);
|
||||
CHECK(ioctl(fe, FE_READ_SNR, &value));
|
||||
close(fe);
|
||||
|
||||
return (value);
|
||||
}
|
||||
|
||||
uint32_t getBER(int cardIndex)
|
||||
{
|
||||
uint32_t value = 0;
|
||||
char *dev = NULL;
|
||||
|
||||
asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0);
|
||||
int fe = open(dev, O_RDONLY | O_NONBLOCK);
|
||||
free(dev);
|
||||
if (fe < 0)
|
||||
return (value);
|
||||
CHECK(ioctl(fe, FE_READ_BER, &value));
|
||||
close(fe);
|
||||
|
||||
return (value);
|
||||
}
|
||||
|
||||
uint32_t getUNC(int cardIndex)
|
||||
{
|
||||
uint32_t value = 0;
|
||||
char *dev = NULL;
|
||||
|
||||
asprintf(&dev, FRONTEND_DEVICE, cardIndex, 0);
|
||||
int fe = open(dev, O_RDONLY | O_NONBLOCK);
|
||||
free(dev);
|
||||
if (fe < 0)
|
||||
return (value);
|
||||
CHECK(ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &value));
|
||||
close(fe);
|
||||
|
||||
return (value);
|
||||
}
|
||||
|
||||
cString getApids(const cChannel *channel)
|
||||
{
|
||||
int value = 0;
|
||||
cString apids = cString::sprintf("%d", channel->Apid(value));
|
||||
while (channel->Apid(++value) && (value < MAXAPIDS))
|
||||
apids = cString::sprintf("%s, %d", *apids, channel->Apid(value));
|
||||
return apids;
|
||||
}
|
||||
|
||||
cString getDpids(const cChannel *channel)
|
||||
{
|
||||
int value = 0;
|
||||
cString dpids = cString::sprintf("%d", channel->Dpid(value));
|
||||
while (channel->Dpid(++value) && (value < MAXDPIDS))
|
||||
dpids = cString::sprintf("%s, %d", *dpids, channel->Dpid(value));
|
||||
return dpids;
|
||||
}
|
||||
|
||||
cString getSpids(const cChannel *channel)
|
||||
{
|
||||
int value = 0;
|
||||
cString spids = cString::sprintf("%d", channel->Spid(value));
|
||||
while (channel->Spid(++value) && (value < MAXSPIDS))
|
||||
spids = cString::sprintf("%s, %d", *spids, channel->Spid(value));
|
||||
return spids;
|
||||
}
|
||||
|
||||
cString getCAids(const cChannel *channel, bool identify)
|
||||
{
|
||||
cString caids;
|
||||
int value = 0;
|
||||
|
||||
if (identify) {
|
||||
caids = cString::sprintf("%s", *getCA(channel->Ca(value)));
|
||||
while (channel->Ca(++value) && (value < MAXCAIDS))
|
||||
caids = cString::sprintf("%s, %s", *caids, *getCA(channel->Ca(value)));
|
||||
}
|
||||
else {
|
||||
caids = cString::sprintf("%04x", channel->Ca(value));
|
||||
while (channel->Ca(++value) && (value < MAXCAIDS))
|
||||
caids = cString::sprintf("%s, %04x", *caids, channel->Ca(value));
|
||||
}
|
||||
return caids;
|
||||
}
|
||||
|
||||
cString getCA(int value)
|
||||
{
|
||||
/* http://www.dvb.org/index.php?id=174 */
|
||||
switch (value) {
|
||||
case 0x0000: return cString::sprintf("%s", tr("Free to Air")); /* Reserved */
|
||||
case 0x0001 ... 0x009F:
|
||||
case 0x00A2 ... 0x00FF: return cString::sprintf("%s", tr("Fixed")); /* Standardized systems */
|
||||
case 0x00A0 ... 0x00A1: return cString::sprintf("%s", tr("Analog")); /* Analog signals */
|
||||
case 0x0100 ... 0x01FF: return cString::sprintf("%s", tr("SECA/Mediaguard")); /* Canal Plus */
|
||||
case 0x0500 ... 0x05FF: return cString::sprintf("%s", tr("Viaccess")); /* France Telecom */
|
||||
case 0x0600 ... 0x06FF: return cString::sprintf("%s", tr("Irdeto")); /* Irdeto */
|
||||
case 0x0900 ... 0x09FF: return cString::sprintf("%s", tr("NDS/Videoguard")); /* News Datacom */
|
||||
case 0x0B00 ... 0x0BFF: return cString::sprintf("%s", tr("Conax")); /* Norwegian Telekom */
|
||||
case 0x0D00 ... 0x0DFF: return cString::sprintf("%s", tr("CryptoWorks")); /* Philips */
|
||||
case 0x0E00 ... 0x0EFF: return cString::sprintf("%s", tr("PowerVu")); /* Scientific Atlanta */
|
||||
case 0x1200 ... 0x12FF: return cString::sprintf("%s", tr("NagraVision")); /* BellVu Express */
|
||||
case 0x1700 ... 0x17FF: return cString::sprintf("%s", tr("BetaCrypt")); /* BetaTechnik */
|
||||
case 0x1800 ... 0x18FF: return cString::sprintf("%s", tr("NagraVision")); /* Kudelski SA */
|
||||
case 0x4A60 ... 0x4A6F: return cString::sprintf("%s", tr("SkyCrypt")); /* @Sky */
|
||||
}
|
||||
return cString::sprintf("%X", value);
|
||||
}
|
||||
|
||||
cString getCoderate(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case FEC_NONE: return cString::sprintf("%s", tr("None"));
|
||||
case FEC_1_2: return cString::sprintf("1/2");
|
||||
case FEC_2_3: return cString::sprintf("2/3");
|
||||
case FEC_3_4: return cString::sprintf("3/4");
|
||||
case FEC_4_5: return cString::sprintf("4/5");
|
||||
case FEC_5_6: return cString::sprintf("5/6");
|
||||
case FEC_6_7: return cString::sprintf("6/7");
|
||||
case FEC_7_8: return cString::sprintf("7/8");
|
||||
case FEC_8_9: return cString::sprintf("8/9");
|
||||
case FEC_AUTO: return cString::sprintf("%s", tr("Auto"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getTransmission(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case TRANSMISSION_MODE_2K: return cString::sprintf("2K");
|
||||
case TRANSMISSION_MODE_8K: return cString::sprintf("8K");
|
||||
case TRANSMISSION_MODE_AUTO: return cString::sprintf("%s", tr("Auto"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getBandwidth(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case BANDWIDTH_8_MHZ: return cString::sprintf("8 %s", tr("MHz"));
|
||||
case BANDWIDTH_7_MHZ: return cString::sprintf("7 %s", tr("MHz"));
|
||||
case BANDWIDTH_6_MHZ: return cString::sprintf("6 %s", tr("MHz"));
|
||||
case BANDWIDTH_AUTO: return cString::sprintf("%s", tr("Auto"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getInversion(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case INVERSION_OFF: return cString::sprintf("%s", tr("Off"));
|
||||
case INVERSION_ON: return cString::sprintf("%s", tr("On"));
|
||||
case INVERSION_AUTO: return cString::sprintf("%s", tr("Auto"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getHierarchy(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case HIERARCHY_NONE: return cString::sprintf("%s", tr("None"));
|
||||
case HIERARCHY_1: return cString::sprintf("1");
|
||||
case HIERARCHY_2: return cString::sprintf("2");
|
||||
case HIERARCHY_4: return cString::sprintf("4");
|
||||
case HIERARCHY_AUTO: cString::sprintf("%s", tr("Auto"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getGuard(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case GUARD_INTERVAL_1_32: return cString::sprintf("1/32");
|
||||
case GUARD_INTERVAL_1_16: return cString::sprintf("1/16");
|
||||
case GUARD_INTERVAL_1_8: return cString::sprintf("1/8");
|
||||
case GUARD_INTERVAL_1_4: return cString::sprintf("1/4");
|
||||
case GUARD_INTERVAL_AUTO: cString::sprintf("%s", tr("Auto"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getModulation(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case QPSK: return cString::sprintf("QPSK");
|
||||
case QAM_16: return cString::sprintf("QAM 16");
|
||||
case QAM_32: return cString::sprintf("QAM 32");
|
||||
case QAM_64: return cString::sprintf("QAM 64");
|
||||
case QAM_128: return cString::sprintf("QAM 128");
|
||||
case QAM_256: return cString::sprintf("QAM 256");
|
||||
case QAM_AUTO: return cString::sprintf("QAM %s", tr("Auto"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAspectRatio(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case AR_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
case AR_1_1: return cString::sprintf("1:1");
|
||||
case AR_4_3: return cString::sprintf("4:3");
|
||||
case AR_16_9: return cString::sprintf("16:9");
|
||||
case AR_2_21_1: return cString::sprintf("2.21:1");
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getVideoFormat(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case VF_UNKNOWN: return cString::sprintf("%s", tr("unknown"));
|
||||
case VF_PAL: return cString::sprintf("%s", tr("PAL"));
|
||||
case VF_NTSC: return cString::sprintf("%s", tr("NTSC"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3BitStreamMode(int value, int coding)
|
||||
{
|
||||
switch (value) {
|
||||
case 0: return cString::sprintf("%s", tr("Complete Main (CM)"));
|
||||
case 1: return cString::sprintf("%s", tr("Music and Effects (ME)"));
|
||||
case 2: return cString::sprintf("%s", tr("Visually Impaired (VI)"));
|
||||
case 3: return cString::sprintf("%s", tr("Hearing Impaired (HI)"));
|
||||
case 4: return cString::sprintf("%s", tr("Dialogue (D)"));
|
||||
case 5: return cString::sprintf("%s", tr("Commentary (C)"));
|
||||
case 6: return cString::sprintf("%s", tr("Emergency (E)"));
|
||||
case 7: return cString::sprintf("%s", (coding == 1) ? tr("Voice Over (VO)") : tr("Karaoke"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3AudioCodingMode(int value, int stream)
|
||||
{
|
||||
if (stream != 7) {
|
||||
switch (value) {
|
||||
case 0: return cString::sprintf("1+1 - %s, %s", tr("Ch1"), tr("Ch2"));
|
||||
case 1: return cString::sprintf("1/0 - %s", tr("C"));
|
||||
case 2: return cString::sprintf("2/0 - %s, %s", tr("L"), tr("R"));
|
||||
case 3: return cString::sprintf("3/0 - %s, %s, %s", tr("L"), tr("C"), tr("R"));
|
||||
case 4: return cString::sprintf("2/1 - %s, %s, %s", tr("L"), tr("R"), tr("S"));
|
||||
case 5: return cString::sprintf("3/1 - %s, %s, %s, %s", tr("L"), tr("C"), tr("R"), tr("S"));
|
||||
case 6: return cString::sprintf("2/2 - %s, %s, %s, %s", tr("L"), tr("R"), tr("SL"), tr("SR"));
|
||||
case 7: return cString::sprintf("3/2 - %s, %s, %s, %s, %s", tr("L"), tr("C"), tr("R"), tr("SL"), tr("SR"));
|
||||
}
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3CenterMixLevel(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case CML_MINUS_3dB: return cString::sprintf("-3.0 %s", tr("dB"));
|
||||
case CML_MINUS_4_5dB: return cString::sprintf("-4.5 %s", tr("dB"));
|
||||
case CML_MINUS_6dB: return cString::sprintf("-6.0 %s", tr("dB"));
|
||||
case CML_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3SurroundMixLevel(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case SML_MINUS_3dB: return cString::sprintf("-3 %s", tr("dB"));
|
||||
case SML_MINUS_6dB: return cString::sprintf("-6 %s", tr("dB"));
|
||||
case SML_0_dB: return cString::sprintf("0 %s", tr("dB"));
|
||||
case SML_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3DolbySurroundMode(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case DSM_NOT_INDICATED: return cString::sprintf("%s", tr("not indicated"));
|
||||
case DSM_NOT_DOLBYSURROUND: return cString::sprintf("%s", tr("no"));
|
||||
case DSM_DOLBYSURROUND: return cString::sprintf("%s", tr("yes"));
|
||||
case DSM_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3DialogLevel(int value)
|
||||
{
|
||||
if (value > 0)
|
||||
return cString::sprintf("-%d %s", value, tr("dB"));
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getFrequencyMHz(int value)
|
||||
{
|
||||
while (value > 20000) value /= 1000;
|
||||
return cString::sprintf("%d %s", value, tr("MHz"));
|
||||
}
|
||||
|
||||
cString getAudioSamplingFreq(int value)
|
||||
{
|
||||
switch (value) {
|
||||
case FR_NOTVALID: return cString::sprintf("---");
|
||||
case FR_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
}
|
||||
return cString::sprintf("%.1f %s", ((double)value / 1000.0), tr("kHz"));
|
||||
}
|
||||
|
||||
cString getAudioBitrate(double value, double stream)
|
||||
{
|
||||
switch ((int)stream) {
|
||||
case FR_NOTVALID: return cString::sprintf("---");
|
||||
case FR_RESERVED: return cString::sprintf("%s (%s)", tr("reserved"), *getBitrateKbits(value));
|
||||
case FR_FREE: return cString::sprintf("%s (%s)", tr("free"), *getBitrateKbits(value));
|
||||
}
|
||||
return cString::sprintf("%s (%s)", *getBitrateKbits(stream), *getBitrateKbits(value));
|
||||
}
|
||||
|
||||
cString getBitrateMbits(double value)
|
||||
{
|
||||
if (value >= 0)
|
||||
return cString::sprintf("%.2f %s", value / 1000000.0, tr("Mbit/s"));
|
||||
return cString::sprintf("--- %s", tr("Mbit/s"));
|
||||
}
|
||||
|
||||
cString getBitrateKbits(double value)
|
||||
{
|
||||
if (value >= 0)
|
||||
return cString::sprintf("%.0f %s", value / 1000.0, tr("kbit/s"));
|
||||
return cString::sprintf("--- %s", tr("kbit/s"));
|
||||
}
|
60
femontools.h
Normal file
60
femontools.h
Normal file
@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#ifndef __FEMONTOOLS_H
|
||||
#define __FEMONTOOLS_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <vdr/channels.h>
|
||||
#include <vdr/tools.h>
|
||||
|
||||
#ifdef DEBUG
|
||||
#define Dprintf(x...) printf(x);
|
||||
#else
|
||||
#define Dprintf(x...) ;
|
||||
#endif
|
||||
|
||||
#define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d"
|
||||
|
||||
cString getFrontendInfo(int cardIndex = 0);
|
||||
cString getFrontendName(int cardIndex = 0);
|
||||
cString getFrontendStatus(int cardIndex = 0);
|
||||
|
||||
uint16_t getSNR(int cardIndex = 0);
|
||||
uint16_t getSignal(int cardIndex = 0);
|
||||
|
||||
uint32_t getBER(int cardIndex = 0);
|
||||
uint32_t getUNC(int cardIndex = 0);
|
||||
|
||||
cString getApids(const cChannel *channel);
|
||||
cString getDpids(const cChannel *channel);
|
||||
cString getSpids(const cChannel *channel);
|
||||
cString getCAids(const cChannel *channel, bool identify = false);
|
||||
cString getCA(int value);
|
||||
cString getCoderate(int value);
|
||||
cString getTransmission(int value);
|
||||
cString getBandwidth(int value);
|
||||
cString getInversion(int value);
|
||||
cString getHierarchy(int value);
|
||||
cString getGuard(int value);
|
||||
cString getModulation(int value);
|
||||
cString getAspectRatio(int value);
|
||||
cString getVideoFormat(int value);
|
||||
cString getAC3BitStreamMode(int value, int coding);
|
||||
cString getAC3AudioCodingMode(int value, int stream);
|
||||
cString getAC3CenterMixLevel(int value);
|
||||
cString getAC3SurroundMixLevel(int value);
|
||||
cString getAC3DolbySurroundMode(int value);
|
||||
cString getAC3DialogLevel(int value);
|
||||
cString getFrequencyMHz(int value);
|
||||
cString getAudioSamplingFreq(int value);
|
||||
cString getAudioBitrate(double value, double stream);
|
||||
cString getBitrateMbits(double value);
|
||||
cString getBitrateKbits(double value);
|
||||
|
||||
#endif // __FEMONTOOLS_H
|
759
h264.c
759
h264.c
@ -1,759 +0,0 @@
|
||||
/*
|
||||
* h264.c: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "log.h"
|
||||
#include "tools.h"
|
||||
#include "h264.h"
|
||||
|
||||
const cFemonH264::t_DAR cFemonH264::darS[] =
|
||||
{
|
||||
{ VIDEO_ASPECT_RATIO_1_1, 100 },
|
||||
{ VIDEO_ASPECT_RATIO_4_3, 133 },
|
||||
{ VIDEO_ASPECT_RATIO_16_9, 177 },
|
||||
{ VIDEO_ASPECT_RATIO_2_21_1, 221 },
|
||||
{ VIDEO_ASPECT_RATIO_12_11, 109 },
|
||||
{ VIDEO_ASPECT_RATIO_10_11, 90 },
|
||||
{ VIDEO_ASPECT_RATIO_16_11, 145 },
|
||||
{ VIDEO_ASPECT_RATIO_40_33, 121 },
|
||||
{ VIDEO_ASPECT_RATIO_24_11, 218 },
|
||||
{ VIDEO_ASPECT_RATIO_20_11, 181 },
|
||||
{ VIDEO_ASPECT_RATIO_32_11, 290 },
|
||||
{ VIDEO_ASPECT_RATIO_80_33, 242 },
|
||||
{ VIDEO_ASPECT_RATIO_18_11, 163 },
|
||||
{ VIDEO_ASPECT_RATIO_15_11, 136 },
|
||||
{ VIDEO_ASPECT_RATIO_64_33, 193 },
|
||||
{ VIDEO_ASPECT_RATIO_160_99, 161 },
|
||||
{ VIDEO_ASPECT_RATIO_3_2, 150 },
|
||||
{ VIDEO_ASPECT_RATIO_2_1, 200 }
|
||||
};
|
||||
|
||||
const cFemonH264::t_SAR cFemonH264::sarS[] =
|
||||
{
|
||||
{ 0, 0 }, // VIDEO_ASPECT_RATIO_INVALID
|
||||
{ 1, 1 }, // VIDEO_ASPECT_RATIO_1_1
|
||||
{ 12, 11 }, // VIDEO_ASPECT_RATIO_12_11
|
||||
{ 10, 11 }, // VIDEO_ASPECT_RATIO_10_11
|
||||
{ 16, 11 }, // VIDEO_ASPECT_RATIO_16_11
|
||||
{ 40, 33 }, // VIDEO_ASPECT_RATIO_40_33
|
||||
{ 24, 11 }, // VIDEO_ASPECT_RATIO_24_11
|
||||
{ 20, 11 }, // VIDEO_ASPECT_RATIO_20_11
|
||||
{ 32, 11 }, // VIDEO_ASPECT_RATIO_32_11
|
||||
{ 80, 33 }, // VIDEO_ASPECT_RATIO_80_33
|
||||
{ 18, 11 }, // VIDEO_ASPECT_RATIO_18_11
|
||||
{ 15, 11 }, // VIDEO_ASPECT_RATIO_15_11
|
||||
{ 64, 33 }, // VIDEO_ASPECT_RATIO_64_33
|
||||
{ 160, 99 }, // VIDEO_ASPECT_RATIO_160_99
|
||||
{ 4, 3 }, // VIDEO_ASPECT_RATIO_4_3
|
||||
{ 3, 2 }, // VIDEO_ASPECT_RATIO_3_2
|
||||
{ 2, 1 } // VIDEO_ASPECT_RATIO_2_1
|
||||
};
|
||||
|
||||
const eVideoFormat cFemonH264::videoFormatS[] =
|
||||
{
|
||||
VIDEO_FORMAT_COMPONENT,
|
||||
VIDEO_FORMAT_PAL,
|
||||
VIDEO_FORMAT_NTSC,
|
||||
VIDEO_FORMAT_SECAM,
|
||||
VIDEO_FORMAT_MAC,
|
||||
VIDEO_FORMAT_UNKNOWN,
|
||||
VIDEO_FORMAT_RESERVED
|
||||
};
|
||||
|
||||
const uint8_t cFemonH264::seiNumClockTsTableS[9] =
|
||||
{
|
||||
1, 1, 1, 2, 2, 3, 3, 2, 3
|
||||
};
|
||||
|
||||
cFemonH264::cFemonH264(cFemonVideoIf *videoHandlerP)
|
||||
: videoHandlerM(videoHandlerP),
|
||||
widthM(0),
|
||||
heightM(0),
|
||||
aspectRatioM(VIDEO_ASPECT_RATIO_INVALID),
|
||||
formatM(VIDEO_FORMAT_INVALID),
|
||||
frameRateM(0),
|
||||
bitRateM(0),
|
||||
scanM(VIDEO_SCAN_INVALID),
|
||||
cpbDpbDelaysPresentFlagM(false),
|
||||
picStructPresentFlagM(false),
|
||||
frameMbsOnlyFlagM(false),
|
||||
mbAdaptiveFrameFieldFlagM(false),
|
||||
timeOffsetLengthM(0)
|
||||
{
|
||||
reset();
|
||||
}
|
||||
|
||||
cFemonH264::~cFemonH264()
|
||||
{
|
||||
}
|
||||
|
||||
bool cFemonH264::processVideo(const uint8_t *bufP, int lenP)
|
||||
{
|
||||
uint8_t nal_data[lenP];
|
||||
bool aud_found = false, sps_found = false, sei_found = true; // SEI temporarily disabled!
|
||||
const uint8_t *buf = bufP;
|
||||
const uint8_t *start = buf;
|
||||
const uint8_t *end = start + lenP;
|
||||
|
||||
if (!videoHandlerM)
|
||||
return false;
|
||||
|
||||
// skip PES header
|
||||
if (!PesLongEnough(lenP))
|
||||
return false;
|
||||
buf += PesPayloadOffset(buf);
|
||||
start = buf;
|
||||
|
||||
reset();
|
||||
|
||||
for (;;) {
|
||||
int consumed = 0;
|
||||
|
||||
buf = nextStartCode(buf, end);
|
||||
if (buf >= end)
|
||||
break;
|
||||
|
||||
switch (buf[3] & 0x1F) {
|
||||
case NAL_AUD:
|
||||
if (!aud_found) {
|
||||
switch (buf[4] >> 5) {
|
||||
case 0: case 3: case 5: // I_FRAME
|
||||
debug2("%s Found NAL AUD at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP);
|
||||
aud_found = true;
|
||||
break;
|
||||
case 1: case 4: case 6: // P_FRAME;
|
||||
case 2: case 7: // B_FRAME;
|
||||
default: // NO_PICTURE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case NAL_SPS:
|
||||
if (!sps_found) {
|
||||
debug2("%s Found NAL SPS at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP);
|
||||
int nal_len = nalUnescape(nal_data, buf + 4, int(end - buf - 4));
|
||||
consumed = parseSPS(nal_data, nal_len);
|
||||
if (consumed > 0)
|
||||
sps_found = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case NAL_SEI:
|
||||
if (!sei_found) {
|
||||
debug2("%s Found NAL SEI at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP);
|
||||
int nal_len = nalUnescape(nal_data, buf + 4, int(end - buf - 4));
|
||||
consumed = parseSEI(nal_data, nal_len);
|
||||
if (consumed > 0)
|
||||
sei_found = true;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (aud_found && sps_found && sei_found)
|
||||
break;
|
||||
|
||||
buf += consumed + 4;
|
||||
}
|
||||
|
||||
if (aud_found) {
|
||||
videoHandlerM->SetVideoCodec(VIDEO_CODEC_H264);
|
||||
if (sps_found) {
|
||||
debug2("%s width=%d height=%d, aspect=%d format=%d bitrate=%.0f", __PRETTY_FUNCTION__, widthM, heightM, aspectRatioM, formatM, bitRateM);
|
||||
videoHandlerM->SetVideoFormat(formatM);
|
||||
videoHandlerM->SetVideoSize(widthM, heightM);
|
||||
videoHandlerM->SetVideoAspectRatio(aspectRatioM);
|
||||
videoHandlerM->SetVideoBitrate(bitRateM);
|
||||
}
|
||||
if (sps_found || sei_found) {
|
||||
debug2("%s scan=%d framerate=%.2f", __PRETTY_FUNCTION__, scanM, (scanM == VIDEO_SCAN_PROGRESSIVE) ? (frameRateM / 2) : frameRateM);
|
||||
videoHandlerM->SetVideoScan(scanM);
|
||||
videoHandlerM->SetVideoFramerate((scanM == VIDEO_SCAN_PROGRESSIVE) ? (frameRateM / 2) : frameRateM);
|
||||
}
|
||||
}
|
||||
|
||||
return aud_found;
|
||||
}
|
||||
|
||||
void cFemonH264::reset()
|
||||
{
|
||||
cpbDpbDelaysPresentFlagM = false;
|
||||
picStructPresentFlagM = false;
|
||||
frameMbsOnlyFlagM = false;
|
||||
mbAdaptiveFrameFieldFlagM = false;
|
||||
timeOffsetLengthM = 0;
|
||||
}
|
||||
|
||||
const uint8_t *cFemonH264::nextStartCode(const uint8_t *startP, const uint8_t *endP)
|
||||
{
|
||||
for (endP -= 3; startP < endP; ++startP) {
|
||||
if ((startP[0] == 0x00) && (startP[1] == 0x00) && (startP[2] == 0x01))
|
||||
return startP;
|
||||
}
|
||||
return (endP + 3);
|
||||
}
|
||||
|
||||
int cFemonH264::nalUnescape(uint8_t *dstP, const uint8_t *srcP, int lenP)
|
||||
{
|
||||
int s = 0, d = 0;
|
||||
|
||||
while (s < lenP - 3) {
|
||||
if (!srcP[s] && !srcP[s + 1] && srcP[s + 2] == 3) {
|
||||
dstP[d++] = srcP[s++];
|
||||
dstP[d++] = srcP[s++];
|
||||
s++; // skip emulation_prevention_three_byte
|
||||
}
|
||||
else
|
||||
dstP[d++] = srcP[s++];
|
||||
}
|
||||
|
||||
while (s < lenP)
|
||||
dstP[d++] = srcP[s++];
|
||||
|
||||
return d;
|
||||
}
|
||||
|
||||
int cFemonH264::parseSPS(const uint8_t *bufP, int lenP)
|
||||
{
|
||||
int profile_idc, level_idc, constraint_set3_flag, pic_order_cnt_type, i, j;
|
||||
cFemonBitStream bs(bufP, lenP);
|
||||
|
||||
uint32_t width = widthM;
|
||||
uint32_t height = heightM;
|
||||
eVideoAspectRatio aspect_ratio = aspectRatioM;
|
||||
eVideoFormat format = formatM;
|
||||
double frame_rate = frameRateM;
|
||||
double bit_rate = bitRateM;
|
||||
bool cpb_dpb_delays_present_flag = cpbDpbDelaysPresentFlagM;
|
||||
bool pic_struct_present_flag = picStructPresentFlagM;
|
||||
bool frame_mbs_only_flag = frameMbsOnlyFlagM;
|
||||
bool mb_adaptive_frame_field_flag = mbAdaptiveFrameFieldFlagM;
|
||||
uint32_t time_offset_length = timeOffsetLengthM;
|
||||
|
||||
profile_idc = bs.GetBits(8); // profile_idc
|
||||
bs.SkipBit(); // constraint_set0_flag
|
||||
bs.SkipBit(); // constraint_set1_flag
|
||||
bs.SkipBit(); // constraint_set2_flag
|
||||
constraint_set3_flag = bs.GetBit(); // constraint_set3_flag
|
||||
bs.SkipBits(4); // reserved_zero_4bits
|
||||
level_idc = bs.GetBits(8); // level_idc
|
||||
bs.SkipUeGolomb(); // seq_parameter_set_id
|
||||
debug2("%s profile_idc=%d level_idc=%d", __PRETTY_FUNCTION__, profile_idc, level_idc);
|
||||
switch (profile_idc) {
|
||||
case 66: // baseline profile
|
||||
case 77: // main profile
|
||||
case 88: // extended profile
|
||||
switch (level_idc) {
|
||||
case 10: // level 1.0
|
||||
bit_rate = 64000;
|
||||
break;
|
||||
case 11: // level 1b / 1.1
|
||||
bit_rate = constraint_set3_flag ? 128000 : 192000;
|
||||
break;
|
||||
case 12: // level 1.2
|
||||
bit_rate = 384000;
|
||||
break;
|
||||
case 13: // level 1.3
|
||||
bit_rate = 768000;
|
||||
break;
|
||||
case 20: // level 2.0
|
||||
bit_rate = 2000000;
|
||||
break;
|
||||
case 21: // level 2.1
|
||||
bit_rate = 4000000;
|
||||
break;
|
||||
case 22: // level 2.2
|
||||
bit_rate = 4000000;
|
||||
break;
|
||||
case 30: // level 3.0
|
||||
bit_rate = 10000000;
|
||||
break;
|
||||
case 31: // level 3.1
|
||||
bit_rate = 14000000;
|
||||
break;
|
||||
case 32: // level 3.2
|
||||
bit_rate = 20000000;
|
||||
break;
|
||||
case 40: // level 4.0
|
||||
bit_rate = 20000000;
|
||||
break;
|
||||
case 41: // level 4.1
|
||||
bit_rate = 50000000;
|
||||
break;
|
||||
case 42: // level 4.2
|
||||
bit_rate = 50000000;
|
||||
break;
|
||||
case 50: // level 5.0
|
||||
bit_rate = 135000000;
|
||||
break;
|
||||
case 51: // level 5.1
|
||||
bit_rate = 240000000;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 100: // high profile
|
||||
switch (level_idc) {
|
||||
case 10: // level 1.0
|
||||
bit_rate = 80000;
|
||||
break;
|
||||
case 11: // level 1b / 1.1
|
||||
bit_rate = constraint_set3_flag ? 160000 : 240000;
|
||||
break;
|
||||
case 12: // level 1.2
|
||||
bit_rate = 480000;
|
||||
break;
|
||||
case 13: // level 1.3
|
||||
bit_rate = 960000;
|
||||
break;
|
||||
case 20: // level 2.0
|
||||
bit_rate = 2500000;
|
||||
break;
|
||||
case 21: // level 2.1
|
||||
bit_rate = 5000000;
|
||||
break;
|
||||
case 22: // level 2.2
|
||||
bit_rate = 5000000;
|
||||
break;
|
||||
case 30: // level 3.0
|
||||
bit_rate = 12500000;
|
||||
break;
|
||||
case 31: // level 3.1
|
||||
bit_rate = 17500000;
|
||||
break;
|
||||
case 32: // level 3.2
|
||||
bit_rate = 25000000;
|
||||
break;
|
||||
case 40: // level 4.0
|
||||
bit_rate = 25000000;
|
||||
break;
|
||||
case 41: // level 4.1
|
||||
bit_rate = 62500000;
|
||||
break;
|
||||
case 42: // level 4.2
|
||||
bit_rate = 62500000;
|
||||
break;
|
||||
case 50: // level 5.0
|
||||
bit_rate = 168750000;
|
||||
break;
|
||||
case 51: // level 5.1
|
||||
bit_rate = 300000000;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 110: // high 10 profile
|
||||
switch (level_idc) {
|
||||
case 10: // level 1.0
|
||||
bit_rate = 192000;
|
||||
break;
|
||||
case 11: // level 1b / 1.1
|
||||
bit_rate = constraint_set3_flag ? 384000 : 576000;
|
||||
break;
|
||||
case 12: // level 1.2
|
||||
bit_rate = 115200;
|
||||
break;
|
||||
case 13: // level 1.3
|
||||
bit_rate = 2304000;
|
||||
break;
|
||||
case 20: // level 2.0
|
||||
bit_rate = 6000000;
|
||||
break;
|
||||
case 21: // level 2.1
|
||||
bit_rate = 12000000;
|
||||
break;
|
||||
case 22: // level 2.2
|
||||
bit_rate = 12000000;
|
||||
break;
|
||||
case 30: // level 3.0
|
||||
bit_rate = 30000000;
|
||||
break;
|
||||
case 31: // level 3.1
|
||||
bit_rate = 42000000;
|
||||
break;
|
||||
case 32: // level 3.2
|
||||
bit_rate = 60000000;
|
||||
break;
|
||||
case 40: // level 4.0
|
||||
bit_rate = 60000000;
|
||||
break;
|
||||
case 41: // level 4.1
|
||||
bit_rate = 150000000;
|
||||
break;
|
||||
case 42: // level 4.2
|
||||
bit_rate = 150000000;
|
||||
break;
|
||||
case 50: // level 5.0
|
||||
bit_rate = 405000000;
|
||||
break;
|
||||
case 51: // level 5.1
|
||||
bit_rate = 720000000;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 122: // high 4:2:2 profile
|
||||
case 144: // high 4:4:4 profile
|
||||
switch (level_idc) {
|
||||
case 10: // level 1.0
|
||||
bit_rate = 256000;
|
||||
break;
|
||||
case 11: // level 1b / 1.1
|
||||
bit_rate = constraint_set3_flag ? 512000 : 768000;
|
||||
break;
|
||||
case 12: // level 1.2
|
||||
bit_rate = 1536000;
|
||||
break;
|
||||
case 13: // level 1.3
|
||||
bit_rate = 3072000;
|
||||
break;
|
||||
case 20: // level 2.0
|
||||
bit_rate = 8000000;
|
||||
break;
|
||||
case 21: // level 2.1
|
||||
bit_rate = 16000000;
|
||||
break;
|
||||
case 22: // level 2.2
|
||||
bit_rate = 16000000;
|
||||
break;
|
||||
case 30: // level 3.0
|
||||
bit_rate = 40000000;
|
||||
break;
|
||||
case 31: // level 3.1
|
||||
bit_rate = 56000000;
|
||||
break;
|
||||
case 32: // level 3.2
|
||||
bit_rate = 80000000;
|
||||
break;
|
||||
case 40: // level 4.0
|
||||
bit_rate = 80000000;
|
||||
break;
|
||||
case 41: // level 4.1
|
||||
bit_rate = 200000000;
|
||||
break;
|
||||
case 42: // level 4.2
|
||||
bit_rate = 200000000;
|
||||
break;
|
||||
case 50: // level 5.0
|
||||
bit_rate = 540000000;
|
||||
break;
|
||||
case 51: // level 5.1
|
||||
bit_rate = 960000000;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if ((profile_idc == 100) || (profile_idc == 110) || (profile_idc == 122) || (profile_idc == 144)) {
|
||||
if (bs.GetUeGolomb() == 3) // chroma_format_idc
|
||||
bs.SkipBit(); // residual_colour_transform_flag
|
||||
bs.SkipUeGolomb(); // bit_depth_luma_minus8
|
||||
bs.SkipUeGolomb(); // bit_depth_chroma_minus8
|
||||
bs.SkipBit(); // qpprime_y_zero_transform_bypass_flag
|
||||
if (bs.GetBit()) { // seq_scaling_matrix_present_flag
|
||||
for (i = 0; i < 8; ++i) {
|
||||
if (bs.GetBit()) { // seq_scaling_list_present_flag[i]
|
||||
int last = 8, next = 8, size = (i < 6) ? 16 : 64;
|
||||
for (j = 0; j < size; ++j) {
|
||||
if (next)
|
||||
next = (last + bs.GetSeGolomb()) & 0xff;
|
||||
last = next ?: last;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
bs.SkipUeGolomb(); // log2_max_frame_num_minus4
|
||||
pic_order_cnt_type = bs.GetUeGolomb(); // pic_order_cnt_type
|
||||
if (pic_order_cnt_type == 0)
|
||||
bs.SkipUeGolomb(); // log2_max_pic_order_cnt_lsb_minus4
|
||||
else if (pic_order_cnt_type == 1) {
|
||||
bs.SkipBit(); // delta_pic_order_always_zero
|
||||
bs.SkipSeGolomb(); // offset_for_non_ref_pic
|
||||
bs.SkipSeGolomb(); // offset_for_top_to_bottom_field
|
||||
j = bs.GetUeGolomb(); // num_ref_frames_in_pic_order_cnt_cycle
|
||||
for (i = 0; i < j; ++i)
|
||||
bs.SkipSeGolomb(); // offset_for_ref_frame[i]
|
||||
}
|
||||
bs.SkipUeGolomb(); // num_ref_frames
|
||||
bs.SkipBit(); // gaps_in_frame_num_value_allowed_flag
|
||||
width = bs.GetUeGolomb() + 1; // pic_width_in_mbs_minus1
|
||||
height = bs.GetUeGolomb() + 1; // pic_height_in_mbs_minus1
|
||||
frame_mbs_only_flag = bs.GetBit(); // frame_mbs_only_flag
|
||||
debug2("%s pic_width=%u", __PRETTY_FUNCTION__, width);
|
||||
debug2("%s pic_height=%u", __PRETTY_FUNCTION__, height);
|
||||
debug2("%s frame_mbs_only_flag=%d", __PRETTY_FUNCTION__, frame_mbs_only_flag);
|
||||
width *= 16;
|
||||
height *= 16 * (frame_mbs_only_flag ? 1 : 2);
|
||||
if (!frame_mbs_only_flag)
|
||||
mb_adaptive_frame_field_flag = bs.GetBit(); // mb_adaptive_frame_field_flag
|
||||
bs.SkipBit(); // direct_8x8_inference_flag
|
||||
if (bs.GetBit()) { // frame_cropping_flag
|
||||
uint32_t crop_left, crop_right, crop_top, crop_bottom;
|
||||
crop_left = bs.GetUeGolomb(); // frame_crop_left_offset
|
||||
crop_right = bs.GetUeGolomb(); // frame_crop_rigth_offset
|
||||
crop_top = bs.GetUeGolomb(); // frame_crop_top_offset
|
||||
crop_bottom = bs.GetUeGolomb(); // frame_crop_bottom_offset
|
||||
debug2("%s crop_left=%d crop_top=%d crop_right=%d crop_bottom=%d", __PRETTY_FUNCTION__, crop_left, crop_top, crop_right, crop_bottom);
|
||||
width -= 2 * (crop_left + crop_right);
|
||||
if (frame_mbs_only_flag)
|
||||
height -= 2 * (crop_top + crop_bottom);
|
||||
else
|
||||
height -= 4 * (crop_top + crop_bottom);
|
||||
}
|
||||
// VUI parameters
|
||||
if (bs.GetBit()) { // vui_parameters_present_flag
|
||||
if (bs.GetBit()) { // aspect_ratio_info_present
|
||||
uint32_t aspect_ratio_idc, sar_width = 0, sar_height = 0;
|
||||
aspect_ratio_idc = bs.GetBits(8); // aspect_ratio_idc
|
||||
debug2("%s aspect_ratio_idc=%d", __PRETTY_FUNCTION__, aspect_ratio_idc);
|
||||
if (aspect_ratio_idc == 255) { // extended sar
|
||||
sar_width = bs.GetBits(16); // sar_width
|
||||
sar_height = bs.GetBits(16); // sar_height
|
||||
}
|
||||
else if (aspect_ratio_idc < ELEMENTS(sarS)) {
|
||||
sar_width = sarS[aspect_ratio_idc].w;
|
||||
sar_height = sarS[aspect_ratio_idc].h;
|
||||
}
|
||||
if (sar_width && sar_height) {
|
||||
int index = -1, ratio = int(100.0L * sar_width * width / sar_height / height);
|
||||
for (unsigned int i = 0; i < ELEMENTS(darS); ++i) {
|
||||
if (darS[i].ratio == ratio) {
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (index < 0) {
|
||||
if (aspect_ratio_idc == 255)
|
||||
aspect_ratio = VIDEO_ASPECT_RATIO_EXTENDED;
|
||||
else
|
||||
aspect_ratio = VIDEO_ASPECT_RATIO_INVALID;
|
||||
}
|
||||
else
|
||||
aspect_ratio = darS[index].dar;
|
||||
debug2("%s sar_width=%d sar_height=%d aspect_ratio=%d", __PRETTY_FUNCTION__, sar_width, sar_height, aspect_ratio);
|
||||
}
|
||||
}
|
||||
if (bs.GetBit()) // overscan_info_present_flag
|
||||
bs.SkipBit(); // overscan_approriate_flag
|
||||
if (bs.GetBit()) { // video_signal_type_present_flag
|
||||
uint32_t video_format;
|
||||
video_format = bs.GetBits(3); // video_format
|
||||
if (video_format < ELEMENTS(videoFormatS)) {
|
||||
format = videoFormatS[video_format];
|
||||
debug2("%s video_format=%d", __PRETTY_FUNCTION__, format);
|
||||
}
|
||||
bs.SkipBit(); // video_full_range_flag
|
||||
if (bs.GetBit()) { // colour_description_present_flag
|
||||
bs.SkipBits(8); // colour_primaries
|
||||
bs.SkipBits(8); // transfer_characteristics
|
||||
bs.SkipBits(8); // matrix_coefficients
|
||||
}
|
||||
}
|
||||
if (bs.GetBit()) { // chroma_loc_info_present_flag
|
||||
bs.SkipUeGolomb(); // chroma_sample_loc_type_top_field
|
||||
bs.SkipUeGolomb(); // chroma_sample_loc_type_bottom_field
|
||||
}
|
||||
if (bs.GetBit()) { // timing_info_present_flag
|
||||
uint32_t num_units_in_tick, time_scale;
|
||||
num_units_in_tick = bs.GetBits(32); // num_units_in_tick
|
||||
time_scale = bs.GetBits(32); // time_scale
|
||||
if (num_units_in_tick > 0)
|
||||
frame_rate = time_scale / num_units_in_tick;
|
||||
bs.SkipBit(); // fixed_frame_rate_flag
|
||||
}
|
||||
int nal_hrd_parameters_present_flag = bs.GetBit(); // nal_hrd_parameters_present_flag
|
||||
if (nal_hrd_parameters_present_flag) {
|
||||
int cpb_cnt_minus1;
|
||||
cpb_cnt_minus1 = bs.GetUeGolomb(); // cpb_cnt_minus1
|
||||
bs.SkipBits(4); // bit_rate_scale
|
||||
bs.SkipBits(4); // cpb_size_scale
|
||||
for (int i = 0; i < cpb_cnt_minus1; ++i) {
|
||||
bs.SkipUeGolomb(); // bit_rate_value_minus1[i]
|
||||
bs.SkipUeGolomb(); // cpb_size_value_minus1[i]
|
||||
bs.SkipBit(); // cbr_flag[i]
|
||||
}
|
||||
bs.SkipBits(5); // initial_cpb_removal_delay_length_minus1
|
||||
bs.SkipBits(5); // cpb_removal_delay_length_minus1
|
||||
bs.SkipBits(5); // dpb_output_delay_length_minus1
|
||||
time_offset_length = bs.GetBits(5); // time_offset_length
|
||||
}
|
||||
int vlc_hrd_parameters_present_flag = bs.GetBit(); // vlc_hrd_parameters_present_flag
|
||||
if (vlc_hrd_parameters_present_flag) {
|
||||
int cpb_cnt_minus1;
|
||||
cpb_cnt_minus1 = bs.GetUeGolomb(); // cpb_cnt_minus1
|
||||
bs.SkipBits(4); // bit_rate_scale
|
||||
bs.SkipBits(4); // cpb_size_scale
|
||||
for (int i = 0; i < cpb_cnt_minus1; ++i) {
|
||||
bs.SkipUeGolomb(); // bit_rate_value_minus1[i]
|
||||
bs.SkipUeGolomb(); // cpb_size_value_minus1[i]
|
||||
bs.SkipBit(); // cbr_flag[i]
|
||||
}
|
||||
bs.SkipBits(5); // initial_cpb_removal_delay_length_minus1
|
||||
bs.SkipBits(5); // cpb_removal_delay_length_minus1
|
||||
bs.SkipBits(5); // dpb_output_delay_length_minus1
|
||||
time_offset_length = bs.GetBits(5);// time_offset_length
|
||||
}
|
||||
cpb_dpb_delays_present_flag = (nal_hrd_parameters_present_flag | vlc_hrd_parameters_present_flag);
|
||||
if (cpb_dpb_delays_present_flag)
|
||||
bs.SkipBit(); // low_delay_hrd_flag
|
||||
pic_struct_present_flag = bs.GetBit(); // pic_struct_present_flag
|
||||
if (bs.GetBit()) { // bitstream_restriction_flag
|
||||
bs.SkipBit(); // motion_vectors_over_pic_boundaries_flag
|
||||
bs.SkipUeGolomb(); // max_bytes_per_pic_denom
|
||||
bs.SkipUeGolomb(); // max_bits_per_mb_denom
|
||||
bs.SkipUeGolomb(); // log2_max_mv_length_horizontal
|
||||
bs.SkipUeGolomb(); // log2_max_mv_length_vertical
|
||||
bs.SkipUeGolomb(); // num_reorder_frames
|
||||
bs.SkipUeGolomb(); // max_dec_frame_buffering
|
||||
}
|
||||
}
|
||||
|
||||
widthM = width;
|
||||
heightM = height;
|
||||
aspectRatioM = aspect_ratio;
|
||||
formatM = format;
|
||||
scanM = frame_mbs_only_flag ? VIDEO_SCAN_PROGRESSIVE : VIDEO_SCAN_INTERLACED;
|
||||
frameRateM = frame_rate;
|
||||
bitRateM = bit_rate;
|
||||
cpbDpbDelaysPresentFlagM = cpb_dpb_delays_present_flag;
|
||||
picStructPresentFlagM = pic_struct_present_flag;
|
||||
frameMbsOnlyFlagM = frame_mbs_only_flag;
|
||||
mbAdaptiveFrameFieldFlagM = mb_adaptive_frame_field_flag;
|
||||
timeOffsetLengthM = time_offset_length;
|
||||
|
||||
return (bs.Index() / 8);
|
||||
}
|
||||
|
||||
int cFemonH264::parseSEI(const uint8_t *bufP, int lenP)
|
||||
{
|
||||
int num_referenced_subseqs, i;
|
||||
cFemonBitStream bs(bufP, lenP);
|
||||
|
||||
eVideoScan scan = scanM;
|
||||
|
||||
while ((bs.Index() * 8 + 16) < lenP) { // sei_message
|
||||
int lastByte, payloadSize = 0, payloadType = 0;
|
||||
|
||||
do {
|
||||
lastByte = bs.GetBits(8) & 0xFF;
|
||||
payloadType += lastByte;
|
||||
} while (lastByte == 0xFF); // last_payload_type_byte
|
||||
|
||||
do {
|
||||
lastByte = bs.GetBits(8) & 0xFF;
|
||||
payloadSize += lastByte;
|
||||
} while (lastByte == 0xFF); // last_payload_size_byte
|
||||
|
||||
switch (payloadType) { // sei_payload
|
||||
case 1: // pic_timing
|
||||
if (cpbDpbDelaysPresentFlagM) { // cpb_dpb_delays_present_flag
|
||||
bs.SkipUeGolomb(); // cpb_removal_delay
|
||||
bs.SkipUeGolomb(); // dpb_output_delay
|
||||
}
|
||||
if (picStructPresentFlagM) { // pic_struct_present_flag
|
||||
uint32_t pic_struct, ct_type = 0, i = 0;
|
||||
pic_struct = bs.GetBits(4); // pic_struct
|
||||
if (pic_struct >= ELEMENTS(seiNumClockTsTableS))
|
||||
return 0;
|
||||
if (frameMbsOnlyFlagM && !mbAdaptiveFrameFieldFlagM)
|
||||
scan = VIDEO_SCAN_PROGRESSIVE;
|
||||
else {
|
||||
switch (pic_struct) {
|
||||
case 0: // frame
|
||||
case 7: // frame doubling
|
||||
case 8: // frame tripling
|
||||
scan = VIDEO_SCAN_PROGRESSIVE;
|
||||
break;
|
||||
case 1: // top
|
||||
case 2: // bottom
|
||||
case 3: // top bottom
|
||||
case 4: // bottom top
|
||||
case 5: // top bottom top
|
||||
case 6: // bottom top bottom
|
||||
scan = VIDEO_SCAN_INTERLACED;
|
||||
break;
|
||||
default:
|
||||
scan = VIDEO_SCAN_RESERVED;
|
||||
break;
|
||||
}
|
||||
}
|
||||
debug2("%s pic_struct=%d scan_type=%d", __PRETTY_FUNCTION__, pic_struct, scan);
|
||||
for (i = 0; i < seiNumClockTsTableS[pic_struct]; ++i) {
|
||||
if (bs.GetBit()) { // clock_timestamp_flag[i]
|
||||
int full_timestamp_flag;
|
||||
ct_type |= (1 << bs.GetBits(2)); // ct_type
|
||||
debug2("%s ct_type=%04X", __PRETTY_FUNCTION__, ct_type);
|
||||
bs.SkipBit(); // nuit_field_based_flag
|
||||
bs.SkipBits(5); // counting_type
|
||||
full_timestamp_flag = bs.GetBit(); // full_timestamp_flag
|
||||
bs.SkipBit(); // discontinuity_flag
|
||||
bs.SkipBit(); // cnt_dropped_flag
|
||||
bs.SkipBits(8); // n_frames
|
||||
if (full_timestamp_flag) {
|
||||
bs.SkipBits(6); // seconds_value
|
||||
bs.SkipBits(6); // minutes_value
|
||||
bs.SkipBits(5); // hours_value
|
||||
}
|
||||
else {
|
||||
if (bs.GetBit()) { // seconds_flag
|
||||
bs.SkipBits(6); // seconds_value
|
||||
if (bs.GetBit()) { // minutes_flag
|
||||
bs.SkipBits(6); // minutes_value
|
||||
if (bs.GetBit()) // hours_flag
|
||||
bs.SkipBits(5); // hours_value
|
||||
}
|
||||
}
|
||||
}
|
||||
if (timeOffsetLengthM > 0)
|
||||
bs.SkipBits(timeOffsetLengthM); // time_offset
|
||||
}
|
||||
}
|
||||
if (i > 0)
|
||||
scan = (ct_type & (1 << 1)) ? VIDEO_SCAN_INTERLACED : VIDEO_SCAN_PROGRESSIVE;
|
||||
}
|
||||
break;
|
||||
|
||||
case 12: // sub_seq_characteristics
|
||||
bs.SkipUeGolomb(); // sub_seq_layer_num
|
||||
bs.SkipUeGolomb(); // sub_seq_id
|
||||
if (bs.GetBit()) // duration_flag
|
||||
bs.SkipBits(32); // sub_seq_duration
|
||||
if (bs.GetBit()) { // average_rate_flag
|
||||
bs.SkipBit(); // accurate_statistics_flag
|
||||
bs.SkipBits(16); // average_bit_rate (1000 bit/s)
|
||||
bs.SkipBits(16); // average_frame_rate (frames per 256s)
|
||||
}
|
||||
num_referenced_subseqs = bs.GetUeGolomb(); // num_referenced_subseqs
|
||||
for (i = 0; i < num_referenced_subseqs; ++i) {
|
||||
bs.SkipUeGolomb(); // ref_sub_seq_layer_num
|
||||
bs.SkipUeGolomb(); // ref_sub_seq_id
|
||||
bs.GetBit(); // ref_sub_seq_direction
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
bs.SkipBits(payloadSize * 8);
|
||||
break;
|
||||
}
|
||||
|
||||
// force byte align
|
||||
bs.ByteAlign();
|
||||
}
|
||||
|
||||
scanM = scan;
|
||||
|
||||
return (bs.Index() / 8);
|
||||
}
|
64
h264.h
64
h264.h
@ -1,64 +0,0 @@
|
||||
/*
|
||||
* h264.h: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __FEMON_H264_H
|
||||
#define __FEMON_H264_H
|
||||
|
||||
#include "video.h"
|
||||
|
||||
class cFemonH264 {
|
||||
private:
|
||||
enum {
|
||||
NAL_SEI = 0x06, // Supplemental Enhancement Information
|
||||
NAL_SPS = 0x07, // Sequence Parameter Set
|
||||
NAL_AUD = 0x09, // Access Unit Delimiter
|
||||
NAL_END_SEQ = 0x0A // End of Sequence
|
||||
};
|
||||
|
||||
typedef struct DAR {
|
||||
eVideoAspectRatio dar;
|
||||
int ratio;
|
||||
} t_DAR;
|
||||
|
||||
typedef struct SAR {
|
||||
int w;
|
||||
int h;
|
||||
} t_SAR;
|
||||
|
||||
cFemonVideoIf *videoHandlerM;
|
||||
uint32_t widthM;
|
||||
uint32_t heightM;
|
||||
eVideoAspectRatio aspectRatioM;
|
||||
eVideoFormat formatM;
|
||||
double frameRateM;
|
||||
double bitRateM;
|
||||
eVideoScan scanM;
|
||||
bool cpbDpbDelaysPresentFlagM;
|
||||
bool picStructPresentFlagM;
|
||||
bool frameMbsOnlyFlagM;
|
||||
bool mbAdaptiveFrameFieldFlagM;
|
||||
uint32_t timeOffsetLengthM;
|
||||
|
||||
void reset();
|
||||
const uint8_t *nextStartCode(const uint8_t *start, const uint8_t *end);
|
||||
int nalUnescape(uint8_t *dst, const uint8_t *src, int len);
|
||||
int parseSPS(const uint8_t *buf, int len);
|
||||
int parseSEI(const uint8_t *buf, int len);
|
||||
|
||||
static const t_SAR sarS[];
|
||||
static const t_DAR darS[];
|
||||
static const eVideoFormat videoFormatS[];
|
||||
static const uint8_t seiNumClockTsTableS[9];
|
||||
|
||||
public:
|
||||
cFemonH264(cFemonVideoIf *videoHandlerP);
|
||||
virtual ~cFemonH264();
|
||||
|
||||
bool processVideo(const uint8_t *bufP, int lenP);
|
||||
};
|
||||
|
||||
#endif //__FEMON_H264_H
|
715
h265.c
715
h265.c
@ -1,715 +0,0 @@
|
||||
/*
|
||||
* h265.c: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "log.h"
|
||||
#include "tools.h"
|
||||
#include "h265.h"
|
||||
|
||||
const cFemonH265::t_DAR cFemonH265::darS[] =
|
||||
{
|
||||
{ VIDEO_ASPECT_RATIO_1_1, 100 },
|
||||
{ VIDEO_ASPECT_RATIO_4_3, 133 },
|
||||
{ VIDEO_ASPECT_RATIO_16_9, 177 },
|
||||
{ VIDEO_ASPECT_RATIO_2_21_1, 221 },
|
||||
{ VIDEO_ASPECT_RATIO_12_11, 109 },
|
||||
{ VIDEO_ASPECT_RATIO_10_11, 90 },
|
||||
{ VIDEO_ASPECT_RATIO_16_11, 145 },
|
||||
{ VIDEO_ASPECT_RATIO_40_33, 121 },
|
||||
{ VIDEO_ASPECT_RATIO_24_11, 218 },
|
||||
{ VIDEO_ASPECT_RATIO_20_11, 181 },
|
||||
{ VIDEO_ASPECT_RATIO_32_11, 290 },
|
||||
{ VIDEO_ASPECT_RATIO_80_33, 242 },
|
||||
{ VIDEO_ASPECT_RATIO_18_11, 163 },
|
||||
{ VIDEO_ASPECT_RATIO_15_11, 136 },
|
||||
{ VIDEO_ASPECT_RATIO_64_33, 193 },
|
||||
{ VIDEO_ASPECT_RATIO_160_99, 161 },
|
||||
{ VIDEO_ASPECT_RATIO_3_2, 150 },
|
||||
{ VIDEO_ASPECT_RATIO_2_1, 200 }
|
||||
};
|
||||
|
||||
const cFemonH265::t_SAR cFemonH265::sarS[] =
|
||||
{
|
||||
{ 0, 0 }, // VIDEO_ASPECT_RATIO_INVALID
|
||||
{ 1, 1 }, // VIDEO_ASPECT_RATIO_1_1
|
||||
{ 12, 11 }, // VIDEO_ASPECT_RATIO_12_11
|
||||
{ 10, 11 }, // VIDEO_ASPECT_RATIO_10_11
|
||||
{ 16, 11 }, // VIDEO_ASPECT_RATIO_16_11
|
||||
{ 40, 33 }, // VIDEO_ASPECT_RATIO_40_33
|
||||
{ 24, 11 }, // VIDEO_ASPECT_RATIO_24_11
|
||||
{ 20, 11 }, // VIDEO_ASPECT_RATIO_20_11
|
||||
{ 32, 11 }, // VIDEO_ASPECT_RATIO_32_11
|
||||
{ 80, 33 }, // VIDEO_ASPECT_RATIO_80_33
|
||||
{ 18, 11 }, // VIDEO_ASPECT_RATIO_18_11
|
||||
{ 15, 11 }, // VIDEO_ASPECT_RATIO_15_11
|
||||
{ 64, 33 }, // VIDEO_ASPECT_RATIO_64_33
|
||||
{ 160, 99 }, // VIDEO_ASPECT_RATIO_160_99
|
||||
{ 4, 3 }, // VIDEO_ASPECT_RATIO_4_3
|
||||
{ 3, 2 }, // VIDEO_ASPECT_RATIO_3_2
|
||||
{ 2, 1 } // VIDEO_ASPECT_RATIO_2_1
|
||||
};
|
||||
|
||||
const eVideoFormat cFemonH265::videoFormatS[] =
|
||||
{
|
||||
VIDEO_FORMAT_COMPONENT,
|
||||
VIDEO_FORMAT_PAL,
|
||||
VIDEO_FORMAT_NTSC,
|
||||
VIDEO_FORMAT_SECAM,
|
||||
VIDEO_FORMAT_MAC,
|
||||
VIDEO_FORMAT_UNKNOWN,
|
||||
VIDEO_FORMAT_RESERVED,
|
||||
VIDEO_FORMAT_RESERVED
|
||||
};
|
||||
|
||||
cFemonH265::cFemonH265(cFemonVideoIf *videoHandlerP)
|
||||
: videoHandlerM(videoHandlerP),
|
||||
widthM(0),
|
||||
heightM(0),
|
||||
aspectRatioM(VIDEO_ASPECT_RATIO_INVALID),
|
||||
formatM(VIDEO_FORMAT_INVALID),
|
||||
frameRateM(0),
|
||||
bitRateM(0),
|
||||
scanM(VIDEO_SCAN_INVALID),
|
||||
frameFieldInfoPresentFlagM(false)
|
||||
{
|
||||
reset();
|
||||
}
|
||||
|
||||
cFemonH265::~cFemonH265()
|
||||
{
|
||||
}
|
||||
|
||||
bool cFemonH265::processVideo(const uint8_t *bufP, int lenP)
|
||||
{
|
||||
uint8_t nal_data[lenP];
|
||||
bool aud_found = false, sps_found = false, sei_found = true; // SEI temporarily disabled!
|
||||
const uint8_t *buf = bufP;
|
||||
const uint8_t *start = buf;
|
||||
const uint8_t *end = start + lenP;
|
||||
|
||||
if (!videoHandlerM)
|
||||
return false;
|
||||
|
||||
// skip PES header
|
||||
if (!PesLongEnough(lenP))
|
||||
return false;
|
||||
buf += PesPayloadOffset(buf);
|
||||
start = buf;
|
||||
|
||||
reset();
|
||||
|
||||
for (;;) {
|
||||
int consumed = 0;
|
||||
|
||||
buf = nextStartCode(buf, end);
|
||||
if (buf >= end)
|
||||
break;
|
||||
|
||||
switch ((buf[3] >> 1) & 0x3F) {
|
||||
case NAL_AUD:
|
||||
if (!aud_found) {
|
||||
debug2("%s Found NAL AUD at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP);
|
||||
aud_found = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case NAL_SPS:
|
||||
if (!sps_found) {
|
||||
debug2("%s Found NAL SPS at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP);
|
||||
int nal_len = nalUnescape(nal_data, buf + 5, int(end - buf - 5));
|
||||
consumed = parseSPS(nal_data, nal_len);
|
||||
if (consumed > 0)
|
||||
sps_found = true;
|
||||
}
|
||||
break;
|
||||
|
||||
case NAL_SEI:
|
||||
if (!sei_found) {
|
||||
debug2("%s Found NAL SEI at offset %d/%d", __PRETTY_FUNCTION__, int(buf - start), lenP);
|
||||
int nal_len = nalUnescape(nal_data, buf + 5, int(end - buf - 5));
|
||||
consumed = parseSEI(nal_data, nal_len);
|
||||
if (consumed > 0)
|
||||
sei_found = true;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (aud_found && sps_found && sei_found)
|
||||
break;
|
||||
|
||||
buf += consumed + 4;
|
||||
}
|
||||
|
||||
if (aud_found) {
|
||||
videoHandlerM->SetVideoCodec(VIDEO_CODEC_H265);
|
||||
if (sps_found) {
|
||||
debug2("%s width=%d height=%d, aspect=%d format=%d bitrate=%.0f", __PRETTY_FUNCTION__, widthM, heightM, aspectRatioM, formatM, bitRateM);
|
||||
videoHandlerM->SetVideoSize(widthM, heightM);
|
||||
videoHandlerM->SetVideoFormat(formatM);
|
||||
videoHandlerM->SetVideoAspectRatio(aspectRatioM);
|
||||
videoHandlerM->SetVideoBitrate(bitRateM);
|
||||
}
|
||||
if (sps_found || sei_found) {
|
||||
debug2("%s scan=%d framerate=%.2f", __PRETTY_FUNCTION__, scanM, frameRateM);
|
||||
videoHandlerM->SetVideoScan(scanM);
|
||||
videoHandlerM->SetVideoFramerate(frameRateM);
|
||||
}
|
||||
}
|
||||
|
||||
return sps_found;
|
||||
}
|
||||
|
||||
void cFemonH265::reset()
|
||||
{
|
||||
frameFieldInfoPresentFlagM = false;
|
||||
}
|
||||
|
||||
const uint8_t *cFemonH265::nextStartCode(const uint8_t *startP, const uint8_t *endP)
|
||||
{
|
||||
for (endP -= 3; startP < endP; ++startP) {
|
||||
if ((startP[0] == 0x00) && (startP[1] == 0x00) && (startP[2] == 0x01))
|
||||
return startP;
|
||||
}
|
||||
return (endP + 3);
|
||||
}
|
||||
|
||||
int cFemonH265::nalUnescape(uint8_t *dstP, const uint8_t *srcP, int lenP)
|
||||
{
|
||||
int s = 0, d = 0;
|
||||
|
||||
while (s < lenP - 3) {
|
||||
if (!srcP[s] && !srcP[s + 1] && srcP[s + 2] == 3) {
|
||||
dstP[d++] = srcP[s++];
|
||||
dstP[d++] = srcP[s++];
|
||||
s++; // skip emulation_prevention_three_byte
|
||||
}
|
||||
else
|
||||
dstP[d++] = srcP[s++];
|
||||
}
|
||||
|
||||
while (s < lenP)
|
||||
dstP[d++] = srcP[s++];
|
||||
|
||||
return d;
|
||||
}
|
||||
|
||||
int cFemonH265::parseSPS(const uint8_t *bufP, int lenP)
|
||||
{
|
||||
cFemonBitStream bs(bufP, lenP);
|
||||
|
||||
uint32_t width = widthM;
|
||||
uint32_t height = heightM;
|
||||
eVideoFormat format = formatM;
|
||||
eVideoAspectRatio aspect_ratio = aspectRatioM;
|
||||
eVideoScan scan = scanM;
|
||||
double frame_rate = frameRateM;
|
||||
double bit_rate = bitRateM;
|
||||
bool frame_field_info_present_flag = frameFieldInfoPresentFlagM;
|
||||
|
||||
const char *profile_name = NULL;
|
||||
bool general_tier_flag, conformance_window_flag, sps_sub_layer_ordering_info_present_flag, profilePresentFlag = true;
|
||||
bool general_max_12bit_constraint_flag = false, general_max_10bit_constraint_flag = false, general_max_8bit_constraint_flag = false;
|
||||
bool general_max_422chroma_constraint_flag = false, general_max_420chroma_constraint_flag = false, general_max_monochrome_constraint_flag = false;
|
||||
bool general_intra_constraint_flag = false, general_one_picture_only_constraint_flag = false, general_lower_bit_rate_constraint_flag = false;
|
||||
bool general_progressive_source_flag, general_interlaced_source_flag, general_profile_compatibility_flag[32];
|
||||
uint32_t chroma_format_idc, log2_max_pic_order_cnt_lsb_minus4, num_short_term_ref_pic_sets, num_long_term_ref_pics_sps;
|
||||
uint8_t sps_max_sub_layers_minus1, sub_layer_profile_present_flag[8], sub_layer_level_present_flag[8], general_profile_idc, general_level_idc;
|
||||
|
||||
bs.SkipBits(4); // sps_video_parameter_set_id
|
||||
sps_max_sub_layers_minus1 = bs.GetBits(3); // sps_max_sub_layers_minus1
|
||||
bs.SkipBit(); // sps_temporal_id_nesting_flag
|
||||
// start of profile_tier_level(1, sps_max_sub_layers_minus1)
|
||||
if (profilePresentFlag) {
|
||||
bs.SkipBits(2); // general_profile_space
|
||||
general_tier_flag = bs.GetBit(); // general_tier_flag
|
||||
general_profile_idc = bs.GetBits(5); // general_profile_idc
|
||||
for (int i = 0; i < 32; ++i) {
|
||||
general_profile_compatibility_flag[i] = bs.GetBit(); // general_profile_compatibility_flag[i]
|
||||
}
|
||||
general_progressive_source_flag = bs.GetBit(); // general_progressive_source_flag
|
||||
general_interlaced_source_flag = bs.GetBit(); // general_interlaced_source_flag
|
||||
if (general_progressive_source_flag && !general_interlaced_source_flag)
|
||||
scan = VIDEO_SCAN_PROGRESSIVE;
|
||||
else if (!general_progressive_source_flag && general_interlaced_source_flag)
|
||||
scan = VIDEO_SCAN_INTERLACED;
|
||||
else if (!general_progressive_source_flag && !general_interlaced_source_flag)
|
||||
scan = VIDEO_SCAN_UNKNOWN;
|
||||
else
|
||||
scan = VIDEO_SCAN_INVALID;
|
||||
debug2("%s general_progressive_source_flag=%d general_interlaced_source_flag=%d scan_type=%d", __PRETTY_FUNCTION__, general_progressive_source_flag, general_interlaced_source_flag, scan);
|
||||
bs.SkipBit(); // general_non_packed_constraint_flag
|
||||
bs.SkipBit(); // general_frame_only_constraint_flag
|
||||
if (general_profile_idc == 4 || general_profile_compatibility_flag[4] ||
|
||||
general_profile_idc == 5 || general_profile_compatibility_flag[5] ||
|
||||
general_profile_idc == 6 || general_profile_compatibility_flag[6] ||
|
||||
general_profile_idc == 7 || general_profile_compatibility_flag[7]) {
|
||||
// the number of bits in this syntax structure is not affected by this condition
|
||||
general_max_12bit_constraint_flag = bs.GetBit(); // general_max_12bit_constraint_flag
|
||||
general_max_10bit_constraint_flag = bs.GetBit(); // general_max_10bit_constraint_flag
|
||||
general_max_8bit_constraint_flag = bs.GetBit(); // general_max_8bit_constraint_flag
|
||||
debug2("%s general_max_12bit_constraint_flag=%d general_max_10bit_constraint_flag=%d general_max_8bit_constraint_flag=%d", __PRETTY_FUNCTION__, general_max_12bit_constraint_flag, general_max_10bit_constraint_flag, general_max_8bit_constraint_flag);
|
||||
general_max_422chroma_constraint_flag = bs.GetBit(); // general_max_422chroma_constraint_flag
|
||||
general_max_420chroma_constraint_flag = bs.GetBit(); // general_max_420chroma_constraint_flag
|
||||
general_max_monochrome_constraint_flag = bs.GetBit(); // general_max_monochrome_constraint_flag
|
||||
debug2("%s general_max_422chroma_constraint_flag=%d general_max_420chroma_constraint_flag=%d general_max_monochrome_constraint_flag=%d", __PRETTY_FUNCTION__, general_max_422chroma_constraint_flag, general_max_420chroma_constraint_flag, general_max_monochrome_constraint_flag);
|
||||
general_intra_constraint_flag = bs.GetBit(); // general_intra_constraint_flag
|
||||
general_one_picture_only_constraint_flag = bs.GetBit(); // general_one_picture_only_constraint_flag
|
||||
general_lower_bit_rate_constraint_flag = bs.GetBit(); // general_lower_bit_rate_constraint_flag
|
||||
debug2("%s general_intra_constraint_flag=%d general_one_picture_only_constraint_flag=%d general_lower_bit_rate_constraint_flag=%d", __PRETTY_FUNCTION__, general_intra_constraint_flag, general_one_picture_only_constraint_flag, general_lower_bit_rate_constraint_flag);
|
||||
bs.SkipBits(34); // general_reserved_zero_34bits
|
||||
}
|
||||
else
|
||||
bs.SkipBits(43); // general_reserved_zero_43bits
|
||||
// the number of bits in this syntax structure is not affected by this condition
|
||||
bs.SkipBit(); // general_reserved_zero_bit
|
||||
}
|
||||
general_level_idc = bs.GetBits(8); // general_level_idc
|
||||
debug2("%s general_profile_idc=%d general_tier_flag=%d general_level_idc=%d", __PRETTY_FUNCTION__, general_profile_idc, general_tier_flag, general_level_idc);
|
||||
switch (general_profile_idc) {
|
||||
default:
|
||||
case 0:
|
||||
profile_name = "None";
|
||||
break;
|
||||
case 1:
|
||||
profile_name = "Main";
|
||||
break;
|
||||
case 2:
|
||||
profile_name = "Main 10";
|
||||
break;
|
||||
case 3:
|
||||
profile_name = "Main Still Picture";
|
||||
break;
|
||||
case 4:
|
||||
profile_name = "Format Range Extensions";
|
||||
break;
|
||||
case 5:
|
||||
profile_name = "Format Range Extensions High Throughput";
|
||||
break;
|
||||
}
|
||||
if (general_profile_idc == 1 || general_profile_idc == 2)
|
||||
switch (general_level_idc) {
|
||||
case 30: // level 1
|
||||
bit_rate = general_tier_flag ? 0 : 128000;
|
||||
break;
|
||||
case 60: // level 2
|
||||
bit_rate = general_tier_flag ? 0 : 1500000;
|
||||
break;
|
||||
case 63: // level 2.1
|
||||
bit_rate = general_tier_flag ? 0 : 3000000;
|
||||
break;
|
||||
case 90: // level 3
|
||||
bit_rate = general_tier_flag ? 0 : 6000000;
|
||||
break;
|
||||
case 93: // level 3
|
||||
bit_rate = general_tier_flag ? 0 : 10000000;
|
||||
break;
|
||||
case 120: // level 4
|
||||
bit_rate = general_tier_flag ? 30000000 : 12000000;
|
||||
break;
|
||||
case 123: // level 4.1
|
||||
bit_rate = general_tier_flag ? 50000000 : 20000000;
|
||||
break;
|
||||
case 150: // level 5
|
||||
bit_rate = general_tier_flag ? 100000000 : 25000000;
|
||||
break;
|
||||
case 153: // level 5.1
|
||||
bit_rate = general_tier_flag ? 160000000 : 40000000;
|
||||
break;
|
||||
case 156: // level 5.2
|
||||
bit_rate = general_tier_flag ? 240000000 : 60000000;
|
||||
break;
|
||||
case 180: // level 6
|
||||
bit_rate = general_tier_flag ? 240000000 : 60000000;
|
||||
break;
|
||||
case 183: // level 6.1
|
||||
bit_rate = general_tier_flag ? 480000000 : 120000000;
|
||||
break;
|
||||
case 186: // level 6.2
|
||||
bit_rate = general_tier_flag ? 800000000 : 240000000;
|
||||
break;
|
||||
default:
|
||||
bit_rate = 0;
|
||||
break;
|
||||
}
|
||||
else
|
||||
bit_rate = 0;
|
||||
debug2("%s profile=\"%s@L%.1f@%s\" bit_rate=%.f", __PRETTY_FUNCTION__, profile_name, (double)general_level_idc / 30, general_tier_flag ? "High" : "Main", bit_rate);
|
||||
for (int i = 0; i < sps_max_sub_layers_minus1; ++i) {
|
||||
sub_layer_profile_present_flag[i] = bs.GetBit(); // sub_layer_profile_present_flag[i]
|
||||
sub_layer_level_present_flag[i] = bs.GetBit(); // sub_layer_level_present_flag[i]
|
||||
}
|
||||
if (sps_max_sub_layers_minus1 > 0) {
|
||||
for (int i = sps_max_sub_layers_minus1; i < 8; ++i)
|
||||
bs.SkipBits(2); // reserved_zero_2bits[i]
|
||||
}
|
||||
for (int i = 0; i < sps_max_sub_layers_minus1; ++i) {
|
||||
if (sub_layer_profile_present_flag[i]) {
|
||||
bs.SkipBits(2); // sub_layer_profile_space[i]
|
||||
bs.SkipBit(); // sub_layer_tier_flag[i]
|
||||
bs.SkipBits(5); // sub_layer_profile_idc[i]
|
||||
bs.SkipBits(32); // sub_layer_profile_compatibility_flag[i][0-31]
|
||||
bs.SkipBit(); // sub_layer_progressive_source_flag[i]
|
||||
bs.SkipBit(); // sub_layer_interlaced_source_flag[i]
|
||||
bs.SkipBit(); // sub_layer_non_packed_constraint_flag[i]
|
||||
bs.SkipBit(); // sub_layer_frame_only_constraint_flag[i]
|
||||
// the number of bits in this syntax structure is not affected by this condition
|
||||
bs.SkipBits(43); // sub_layer_reserved_zero_43bits[i]
|
||||
// the number of bits in this syntax structure is not affected by this condition
|
||||
bs.SkipBit(); // sub_layer_reserved_zero_bit[i]
|
||||
}
|
||||
if (sub_layer_level_present_flag[i])
|
||||
bs.SkipBits(8); // sub_layer_level_idc[i]
|
||||
}
|
||||
// end of profile_tier_level
|
||||
bs.SkipUeGolomb(); // sps_seq_parameter_set_id
|
||||
chroma_format_idc = bs.GetUeGolomb(); // chroma_format_idc
|
||||
if (chroma_format_idc == 3)
|
||||
bs.SkipBit(); // separate_colour_plane_flag
|
||||
width = bs.GetUeGolomb(); // pic_width_in_luma_samples
|
||||
height = bs.GetUeGolomb(); // pic_height_in_luma_samples
|
||||
|
||||
conformance_window_flag = bs.GetBit(); // conformance_window_flag
|
||||
if (conformance_window_flag) {
|
||||
bs.SkipUeGolomb(); // conf_win_left_offset
|
||||
bs.SkipUeGolomb(); // conf_win_right_offset
|
||||
bs.SkipUeGolomb(); // conf_win_top_offset
|
||||
bs.SkipUeGolomb(); // conf_win_bottom_offset
|
||||
}
|
||||
bs.SkipUeGolomb(); // bit_depth_luma_minus8
|
||||
bs.SkipUeGolomb(); // bit_depth_chroma_minus8
|
||||
log2_max_pic_order_cnt_lsb_minus4 = bs.GetUeGolomb(); // log2_max_pic_order_cnt_lsb_minus4
|
||||
sps_sub_layer_ordering_info_present_flag = bs.GetBit(); // sps_sub_layer_ordering_info_present_flag
|
||||
for (int i = (sps_sub_layer_ordering_info_present_flag ? 0 : sps_max_sub_layers_minus1); i <= sps_max_sub_layers_minus1; ++i) {
|
||||
bs.SkipUeGolomb(); // sps_max_dec_pic_buffering_minus1[i]
|
||||
bs.SkipUeGolomb(); // sps_max_num_reorder_pics[i]
|
||||
bs.SkipUeGolomb(); // sps_max_latency_increase_plus1[i]
|
||||
}
|
||||
bs.SkipUeGolomb(); // log2_min_luma_coding_block_size_minus3
|
||||
bs.SkipUeGolomb(); // log2_diff_max_min_luma_coding_block_size
|
||||
bs.SkipUeGolomb(); // log2_min_luma_transform_block_size_minus2
|
||||
bs.SkipUeGolomb(); // log2_diff_max_min_luma_transform_block_size
|
||||
bs.SkipUeGolomb(); // max_transform_hierarchy_depth_inter
|
||||
bs.SkipUeGolomb(); // max_transform_hierarchy_depth_intra
|
||||
if (bs.GetBit()) { // scaling_list_enabled_flag
|
||||
if (bs.GetBit()) { // sps_scaling_list_data_present_flag
|
||||
// start of scaling_list_data()
|
||||
for (int sizeId = 0; sizeId < 4; ++sizeId) {
|
||||
for (int matrixId = 0; matrixId < 6; matrixId += (sizeId == 3) ? 3 : 1) {
|
||||
if (!bs.GetBit()) // scaling_list_pred_mode_flag[sizeId][matrixId]
|
||||
bs.SkipUeGolomb(); // scaling_list_pred_matrix_id_delta[sizeId][matrixId]
|
||||
else {
|
||||
int coefNum = min(64, (1 << (4 + (sizeId << 1))));
|
||||
if (sizeId > 1)
|
||||
bs.SkipSeGolomb(); // scaling_list_dc_coef_minus8[sizeId−2][matrixId]
|
||||
for (int i = 0; i < coefNum; ++i)
|
||||
bs.SkipSeGolomb(); // scaling_list_delta_coef
|
||||
}
|
||||
}
|
||||
}
|
||||
// end of scaling_list_data()
|
||||
}
|
||||
}
|
||||
bs.SkipBit(); // amp_enabled_flag
|
||||
bs.SkipBit(); // sample_adaptive_offset_enabled_flag
|
||||
if (bs.GetBit()) { // pcm_enabled_flag
|
||||
bs.SkipBits(4); // pcm_sample_bit_depth_luma_minus1
|
||||
bs.SkipBits(4); // pcm_sample_bit_depth_chroma_minus1
|
||||
bs.SkipUeGolomb(); // log2_min_pcm_luma_coding_block_size_minus3
|
||||
bs.SkipUeGolomb(); // log2_diff_max_min_pcm_luma_coding_block_size
|
||||
bs.SkipBit(); // pcm_loop_filter_disabled_flag
|
||||
}
|
||||
num_short_term_ref_pic_sets = bs.GetUeGolomb(); // num_short_term_ref_pic_sets
|
||||
uint32_t NumDeltaPocs[num_short_term_ref_pic_sets];
|
||||
for (uint32_t stRpsIdx = 0; stRpsIdx < num_short_term_ref_pic_sets; ++stRpsIdx) {
|
||||
// start of st_ref_pic_set(stRpsIdx)
|
||||
bool inter_ref_pic_set_prediction_flag = false;
|
||||
if (stRpsIdx != 0)
|
||||
inter_ref_pic_set_prediction_flag = bs.GetBit(); // inter_ref_pic_set_prediction_flag
|
||||
if (inter_ref_pic_set_prediction_flag) {
|
||||
uint32_t RefRpsIdx, delta_idx_minus1 = 0;
|
||||
if (stRpsIdx == num_short_term_ref_pic_sets)
|
||||
delta_idx_minus1 = bs.GetUeGolomb(); // delta_idx_minus1
|
||||
bs.SkipBit(); // delta_rps_sign
|
||||
bs.SkipUeGolomb(); // abs_delta_rps_minus1
|
||||
RefRpsIdx = stRpsIdx - (delta_idx_minus1 + 1);
|
||||
NumDeltaPocs[stRpsIdx] = 0;
|
||||
for (uint32_t j = 0; j <= NumDeltaPocs[RefRpsIdx]; ++j) {
|
||||
if (!bs.GetBit()) { // used_by_curr_pic_flag[j]
|
||||
if (bs.GetBit()) // use_delta_flag[j]
|
||||
NumDeltaPocs[stRpsIdx]++;
|
||||
}
|
||||
else
|
||||
NumDeltaPocs[stRpsIdx]++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
uint32_t num_negative_pics = bs.GetUeGolomb(); // num_negative_pics
|
||||
uint32_t num_positive_pics = bs.GetUeGolomb(); // num_positive_pics
|
||||
for (uint32_t j = 0; j < num_negative_pics; ++j) {
|
||||
bs.SkipUeGolomb(); // delta_poc_s0_minus1[i]
|
||||
bs.SkipBit(); // used_by_curr_pic_s0_flag[i]
|
||||
}
|
||||
for (uint32_t j = 0; j < num_positive_pics; ++j) {
|
||||
bs.SkipUeGolomb(); // delta_poc_s1_minus1[i]
|
||||
bs.SkipBit(); // delta_poc_s1_minus1[i]
|
||||
}
|
||||
NumDeltaPocs[stRpsIdx] = num_negative_pics + num_positive_pics;
|
||||
}
|
||||
// end of st_ref_pic_set(stRpsIdx)
|
||||
}
|
||||
if (bs.GetBit()) { // long_term_ref_pics_present_flag
|
||||
num_long_term_ref_pics_sps = bs.GetUeGolomb(); // num_long_term_ref_pics_sps
|
||||
for (uint32_t i = 0; i < num_long_term_ref_pics_sps; ++i) {
|
||||
bs.SkipBits(log2_max_pic_order_cnt_lsb_minus4 + 4); // lt_ref_pic_poc_lsb_sps[i]
|
||||
bs.SkipBit(); // used_by_curr_pic_lt_sps_flag[i]
|
||||
}
|
||||
}
|
||||
bs.SkipBit(); // sps_temporal_mvp_enabled_flag
|
||||
bs.SkipBit(); // strong_intra_smoothing_enabled_flag
|
||||
if (bs.GetBit()) { // vui_parameters_present_flag
|
||||
// start of vui_parameters()
|
||||
if (bs.GetBit()) { // aspect_ratio_info_present_flag
|
||||
uint32_t sar_width = 0, sar_height = 0;
|
||||
uint8_t aspect_ratio_idc = bs.GetBits(8); // aspect_ratio_idc
|
||||
debug2("%s aspect_ratio_idc=%d", __PRETTY_FUNCTION__, aspect_ratio_idc);
|
||||
if (aspect_ratio_idc == 255) { // EXTENDED_SAR
|
||||
sar_width = bs.GetBits(16); // sar_width
|
||||
sar_height = bs.GetBits(16); // sar_height
|
||||
}
|
||||
else if (aspect_ratio_idc < ELEMENTS(sarS)) {
|
||||
sar_width = sarS[aspect_ratio_idc].w;
|
||||
sar_height = sarS[aspect_ratio_idc].h;
|
||||
}
|
||||
if (sar_width && sar_height) {
|
||||
int index = -1, ratio = int(100.0L * sar_width * width / sar_height / height);
|
||||
for (unsigned int i = 0; i < ELEMENTS(darS); ++i) {
|
||||
if (darS[i].ratio == ratio) {
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (index < 0) {
|
||||
if (aspect_ratio_idc == 255)
|
||||
aspect_ratio = VIDEO_ASPECT_RATIO_EXTENDED;
|
||||
else
|
||||
aspect_ratio = VIDEO_ASPECT_RATIO_INVALID;
|
||||
}
|
||||
else
|
||||
aspect_ratio = darS[index].dar;
|
||||
debug2("%s sar_width=%d sar_height=%d aspect_ratio=%d", __PRETTY_FUNCTION__, sar_width, sar_height, aspect_ratio);
|
||||
}
|
||||
}
|
||||
if (bs.GetBit()) // overscan_info_present_flag
|
||||
bs.SkipBit(); // overscan_appropriate_flag
|
||||
if (bs.GetBit()) { // video_signal_type_present_flag
|
||||
uint32_t video_format = bs.GetBits(3); // video_format
|
||||
if (video_format < ELEMENTS(videoFormatS)) {
|
||||
format = videoFormatS[video_format];
|
||||
debug2("%s video_format=%d format=%d", __PRETTY_FUNCTION__, video_format, format);
|
||||
}
|
||||
bs.SkipBit(); // video_full_range_flag
|
||||
if (bs.GetBit()) { // colour_description_present_flag
|
||||
bs.SkipBits(8); // colour_primaries
|
||||
bs.SkipBits(8); // transfer_characteristics
|
||||
bs.SkipBits(8); // matrix_coeffs
|
||||
}
|
||||
}
|
||||
if (bs.GetBit()) { // chroma_loc_info_present_flag
|
||||
bs.SkipUeGolomb(); // chroma_sample_loc_type_top_field
|
||||
bs.SkipUeGolomb(); // chroma_sample_loc_type_bottom_field
|
||||
}
|
||||
bs.SkipBit(); // neutral_chroma_indication_flag
|
||||
bs.SkipBit(); // field_seq_flag
|
||||
frame_field_info_present_flag = bs.GetBit(); // frame_field_info_present_flag
|
||||
debug2("%s frame_field_info_present_flag=%d", __PRETTY_FUNCTION__, frame_field_info_present_flag);
|
||||
if (bs.GetBit()) { // default_display_window_flag
|
||||
bs.SkipUeGolomb(); // def_disp_win_left_offset
|
||||
bs.SkipUeGolomb(); // def_disp_win_right_offset
|
||||
bs.SkipUeGolomb(); // def_disp_win_top_offset
|
||||
bs.SkipUeGolomb(); // def_disp_win_bottom_offset
|
||||
}
|
||||
if (bs.GetBit()) { // vui_timing_info_present_flag
|
||||
uint32_t vui_num_units_in_tick = bs.GetBits(32); // vui_num_units_in_tick
|
||||
uint32_t vui_time_scale = bs.GetBits(32); // vui_time_scale
|
||||
if (vui_num_units_in_tick > 0) {
|
||||
frame_rate = (double)vui_time_scale / vui_num_units_in_tick;
|
||||
debug2("%s frame_rate = vui_time_scale(%d) / vui_num_units_in_tick(%d) = %.f", __PRETTY_FUNCTION__, vui_time_scale, vui_num_units_in_tick, frame_rate);
|
||||
}
|
||||
if (bs.GetBit()) // vui_poc_proportional_to_timing_flag
|
||||
bs.SkipUeGolomb(); // vui_num_ticks_poc_diff_one_minus1
|
||||
if (bs.GetBit()) { // vui_hrd_parameters_present_flag
|
||||
// start of hrd_parameters(1, sps_max_sub_layers_minus1)
|
||||
uint32_t bit_rate_scale = 0;
|
||||
bool commonInfPresentFlag = true, nal_hrd_parameters_present_flag = false, vcl_hrd_parameters_present_flag = false, sub_pic_hrd_params_present_flag = false;
|
||||
if (commonInfPresentFlag) {
|
||||
nal_hrd_parameters_present_flag = bs.GetBit(); // nal_hrd_parameters_present_flag
|
||||
vcl_hrd_parameters_present_flag = bs.GetBit(); // vcl_hrd_parameters_present_flag
|
||||
if (nal_hrd_parameters_present_flag || vcl_hrd_parameters_present_flag) {
|
||||
sub_pic_hrd_params_present_flag = bs.GetBit(); // sub_pic_hrd_params_present_flag
|
||||
if (sub_pic_hrd_params_present_flag) {
|
||||
bs.SkipBits(8); // tick_divisor_minus2
|
||||
bs.SkipBits(5); // du_cpb_removal_delay_increment_length_minus1
|
||||
bs.SkipBit(); // sub_pic_cpb_params_in_pic_timing_sei_flag
|
||||
bs.SkipBits(5); // dpb_output_delay_du_length_minus1
|
||||
}
|
||||
bit_rate_scale = bs.GetBits(4); // bit_rate_scale
|
||||
bs.SkipBits(4); // cpb_size_scale
|
||||
if (sub_pic_hrd_params_present_flag)
|
||||
bs.SkipBits(4); // cpb_size_du_scale
|
||||
bs.SkipBits(5); // initial_cpb_removal_delay_length_minus1
|
||||
bs.SkipBits(5); // au_cpb_removal_delay_length_minus1
|
||||
bs.SkipBits(5); // dpb_output_delay_length_minus1
|
||||
}
|
||||
}
|
||||
for (uint32_t i = 0; i <= sps_max_sub_layers_minus1; ++i) {
|
||||
bool fixed_pic_rate_within_cvs_flag = false, low_delay_hrd_flag = false;
|
||||
uint32_t cpb_cnt_minus1 = 0;
|
||||
if (!bs.GetBit()) // fixed_pic_rate_general_flag[i]
|
||||
fixed_pic_rate_within_cvs_flag = bs.GetBit(); // fixed_pic_rate_within_cvs_flag[i]
|
||||
if (fixed_pic_rate_within_cvs_flag)
|
||||
bs.SkipUeGolomb(); // elemental_duration_in_tc_minus1[i]
|
||||
else
|
||||
low_delay_hrd_flag = bs.GetBit(); // low_delay_hrd_flag[i]
|
||||
if (!low_delay_hrd_flag)
|
||||
cpb_cnt_minus1 = bs.GetUeGolomb(); // cpb_cnt_minus1[i]
|
||||
if (nal_hrd_parameters_present_flag) {
|
||||
// start of sub_layer_hrd_parameters(i)
|
||||
for (uint32_t i = 0; i <= cpb_cnt_minus1; ++i) {
|
||||
uint32_t bit_rate_value_minus1;
|
||||
bit_rate_value_minus1 = bs.GetUeGolomb(); // bit_rate_value_minus1[i]
|
||||
bs.SkipUeGolomb(); // cpb_size_value_minus1[i]
|
||||
if (sub_pic_hrd_params_present_flag) {
|
||||
bs.SkipUeGolomb(); // cpb_size_du_value_minus1[i]
|
||||
bs.SkipUeGolomb(); // bit_rate_du_value_minus1[i]
|
||||
}
|
||||
else {
|
||||
double bitrate = (double)((bit_rate_value_minus1 + 1) * pow(2.0, 6 + bit_rate_scale));
|
||||
debug2("%s bit_rate_value_minus1(%u) + 1 * 2 ^ (6 + bit_rate_scale(%u)) = %.f", __PRETTY_FUNCTION__, bit_rate_value_minus1, bit_rate_scale, bitrate);
|
||||
}
|
||||
bs.SkipBit(); // cbr_flag[i]
|
||||
}
|
||||
// end of sub_layer_hrd_parameters(i)
|
||||
}
|
||||
if (vcl_hrd_parameters_present_flag) {
|
||||
// start of sub_layer_hrd_parameters(i)
|
||||
for (uint32_t i = 0; i <= cpb_cnt_minus1; ++i) {
|
||||
bs.SkipUeGolomb(); // bit_rate_value_minus1[i]
|
||||
bs.SkipUeGolomb(); // cpb_size_value_minus1[i]
|
||||
if (sub_pic_hrd_params_present_flag) {
|
||||
bs.SkipUeGolomb(); // cpb_size_du_value_minus1[i]
|
||||
bs.SkipUeGolomb(); // bit_rate_du_value_minus1[i]
|
||||
}
|
||||
bs.SkipBit(); // cbr_flag[i]
|
||||
}
|
||||
// end of sub_layer_hrd_parameters(i)
|
||||
}
|
||||
}
|
||||
// end of hrd_parameters(1, sps_max_sub_layers_minus1)
|
||||
}
|
||||
}
|
||||
if (bs.GetBit()) { // bitstream_restriction_flag
|
||||
bs.SkipBit(); // tiles_fixed_structure_flag
|
||||
bs.SkipBit(); // motion_vectors_over_pic_boundaries_flag
|
||||
bs.SkipBit(); // restricted_ref_pic_lists_flag
|
||||
bs.SkipUeGolomb(); // min_spatial_segmentation_idc
|
||||
bs.SkipUeGolomb(); // max_bytes_per_pic_denom
|
||||
bs.SkipUeGolomb(); // max_bits_per_min_cu_denom
|
||||
bs.SkipUeGolomb(); // log2_max_mv_length_horizontal
|
||||
bs.SkipUeGolomb(); // log2_max_mv_length_vertical
|
||||
}
|
||||
// end of vui_parameters()
|
||||
}
|
||||
if (bs.GetBit()) { // sps_extension_present_flag
|
||||
bs.SkipBit(); // sps_range_extension_flag
|
||||
bs.SkipBit(); // sps_multilayer_extension_flag
|
||||
bs.SkipBit(); // sps_3d_extension_flag
|
||||
bs.SkipBits(5); // sps_extension_5bits
|
||||
}
|
||||
|
||||
widthM = width;
|
||||
heightM = height;
|
||||
formatM = format;
|
||||
aspectRatioM = aspect_ratio;
|
||||
scanM = scan;
|
||||
frameRateM = frame_rate;
|
||||
bitRateM = bit_rate;
|
||||
frameFieldInfoPresentFlagM = frame_field_info_present_flag;
|
||||
|
||||
return (bs.Index() / 8);
|
||||
}
|
||||
|
||||
int cFemonH265::parseSEI(const uint8_t *bufP, int lenP)
|
||||
{
|
||||
cFemonBitStream bs(bufP, lenP);
|
||||
|
||||
eVideoScan scan = scanM;
|
||||
|
||||
while ((bs.Index() * 8 + 16) < lenP) { // sei_message
|
||||
int len, lastByte, payloadSize = 0, payloadType = 0;
|
||||
|
||||
do {
|
||||
lastByte = bs.GetBits(8) & 0xFF;
|
||||
payloadType += lastByte;
|
||||
} while (lastByte == 0xFF); // last_payload_type_byte
|
||||
|
||||
do {
|
||||
lastByte = bs.GetBits(8) & 0xFF;
|
||||
payloadSize += lastByte;
|
||||
} while (lastByte == 0xFF); // last_payload_size_byte
|
||||
|
||||
switch (payloadType) { // sei_payload
|
||||
case 1: // pic_timing
|
||||
len = payloadSize * 8;
|
||||
if (frameFieldInfoPresentFlagM) {
|
||||
uint8_t pic_struct = bs.GetBits(4); // pic_struct
|
||||
switch (pic_struct) {
|
||||
case 0: // frame
|
||||
case 7: // frame doubling
|
||||
case 8: // frame tripling
|
||||
scan = VIDEO_SCAN_PROGRESSIVE;
|
||||
break;
|
||||
case 1: // top
|
||||
case 2: // bottom
|
||||
case 3: // top bottom
|
||||
case 4: // bottom top
|
||||
case 5: // top bottom top
|
||||
case 6: // bottom top bottom
|
||||
case 9: // top paired with previous bottom
|
||||
case 10: // bottom paired with previous top
|
||||
case 11: // top paired with next bottom
|
||||
case 12: // bottom paired with next top
|
||||
scan = VIDEO_SCAN_INTERLACED;
|
||||
break;
|
||||
default:
|
||||
scan = VIDEO_SCAN_RESERVED;
|
||||
break;
|
||||
}
|
||||
debug2("%s pic_struct=%d scan_type=%d", __PRETTY_FUNCTION__, pic_struct, scan);
|
||||
bs.SkipBits(2); // source_scan_type
|
||||
bs.SkipBit(); // duplicate_flag
|
||||
len -= 7;
|
||||
}
|
||||
bs.SkipBits(len);
|
||||
break;
|
||||
|
||||
default:
|
||||
bs.SkipBits(payloadSize * 8);
|
||||
break;
|
||||
}
|
||||
|
||||
// force byte align
|
||||
bs.ByteAlign();
|
||||
}
|
||||
|
||||
scanM = scan;
|
||||
|
||||
return (bs.Index() / 8);
|
||||
}
|
62
h265.h
62
h265.h
@ -1,62 +0,0 @@
|
||||
/*
|
||||
* h265.h: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __FEMON_H265_H
|
||||
#define __FEMON_H265_H
|
||||
|
||||
#include "video.h"
|
||||
|
||||
class cFemonH265 {
|
||||
private:
|
||||
enum {
|
||||
NAL_VPS = 32, // Video Parameter Set
|
||||
NAL_SPS = 33, // Sequence Parameter Set
|
||||
NAL_PPS = 34, // Picture Parameter Set
|
||||
NAL_AUD = 35, // Access Unit Delimiter
|
||||
NAL_EOS = 36, // End of Sequence
|
||||
NAL_EOB = 37, // End of Bitstream
|
||||
NAL_SEI = 39, // Prefix Supplemental Enchancement Information
|
||||
};
|
||||
|
||||
typedef struct DAR {
|
||||
eVideoAspectRatio dar;
|
||||
int ratio;
|
||||
} t_DAR;
|
||||
|
||||
typedef struct SAR {
|
||||
int w;
|
||||
int h;
|
||||
} t_SAR;
|
||||
|
||||
cFemonVideoIf *videoHandlerM;
|
||||
uint32_t widthM;
|
||||
uint32_t heightM;
|
||||
eVideoAspectRatio aspectRatioM;
|
||||
eVideoFormat formatM;
|
||||
double frameRateM;
|
||||
double bitRateM;
|
||||
eVideoScan scanM;
|
||||
bool frameFieldInfoPresentFlagM;
|
||||
|
||||
void reset();
|
||||
const uint8_t *nextStartCode(const uint8_t *start, const uint8_t *end);
|
||||
int nalUnescape(uint8_t *dst, const uint8_t *src, int len);
|
||||
int parseSPS(const uint8_t *buf, int len);
|
||||
int parseSEI(const uint8_t *buf, int len);
|
||||
|
||||
static const t_SAR sarS[];
|
||||
static const t_DAR darS[];
|
||||
static const eVideoFormat videoFormatS[];
|
||||
|
||||
public:
|
||||
cFemonH265(cFemonVideoIf *videoHandlerP);
|
||||
virtual ~cFemonH265();
|
||||
|
||||
bool processVideo(const uint8_t *bufP, int lenP);
|
||||
};
|
||||
|
||||
#endif //__FEMON_H265_H
|
@ -1,22 +0,0 @@
|
||||
/*
|
||||
* iptvservice.h: IPTV plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __IPTVSERVICE_H
|
||||
#define __IPTVSERVICE_H
|
||||
|
||||
#include <vdr/tools.h>
|
||||
|
||||
#define stIptv ('I' << 24)
|
||||
|
||||
struct IptvService_v1_0 {
|
||||
unsigned int cardIndex;
|
||||
cString protocol;
|
||||
cString bitrate;
|
||||
};
|
||||
|
||||
#endif //__IPTVSERVICE_H
|
||||
|
112
latm.c
112
latm.c
@ -1,112 +0,0 @@
|
||||
/*
|
||||
* latm.c: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "tools.h"
|
||||
#include "latm.h"
|
||||
|
||||
int cFemonLATM::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::sampleRateS[4] =
|
||||
{
|
||||
22050, 24000, 16000, -1
|
||||
};
|
||||
|
||||
cFemonLATM::cFemonLATM(cFemonAudioIf *audioHandlerP)
|
||||
: audioHandlerM(audioHandlerP)
|
||||
{
|
||||
}
|
||||
|
||||
cFemonLATM::~cFemonLATM()
|
||||
{
|
||||
}
|
||||
|
||||
bool cFemonLATM::processAudio(const uint8_t *bufP, int lenP)
|
||||
{
|
||||
cFemonBitStream bs(bufP, lenP * 8);
|
||||
|
||||
if (!audioHandlerM)
|
||||
return false;
|
||||
|
||||
// skip PES header
|
||||
if (!PesLongEnough(lenP))
|
||||
return false;
|
||||
bs.SkipBits(8 * PesPayloadOffset(bufP));
|
||||
|
||||
// MPEG audio detection
|
||||
if (bs.GetBits(12) != 0x56E) // syncword
|
||||
return false;
|
||||
|
||||
audioHandlerM->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:
|
||||
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_STEREO);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_JOINT_STEREO);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_DUAL);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_SINGLE);
|
||||
break;
|
||||
|
||||
default:
|
||||
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_INVALID);
|
||||
break;
|
||||
}
|
||||
|
||||
if (layer == 3) {
|
||||
audioHandlerM->SetAudioBitrate(AUDIO_BITRATE_FREE);
|
||||
}
|
||||
else {
|
||||
switch (bit_rate_index) {
|
||||
case 0:
|
||||
audioHandlerM->SetAudioBitrate(AUDIO_BITRATE_FREE);
|
||||
break;
|
||||
|
||||
case 0xF:
|
||||
audioHandlerM->SetAudioBitrate(AUDIO_BITRATE_RESERVED);
|
||||
break;
|
||||
|
||||
default:
|
||||
audioHandlerM->SetAudioBitrate(1000 * bitrateS[layer][bit_rate_index]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (sampling_frequency) {
|
||||
case 3:
|
||||
audioHandlerM->SetAudioSamplingFrequency(AUDIO_SAMPLING_FREQUENCY_RESERVED);
|
||||
break;
|
||||
|
||||
default:
|
||||
audioHandlerM->SetAudioSamplingFrequency(sampleRateS[sampling_frequency]);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
27
latm.h
27
latm.h
@ -1,27 +0,0 @@
|
||||
/*
|
||||
* latm.h: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __FEMON_LATM_H
|
||||
#define __FEMON_LATM_H
|
||||
|
||||
#include "audio.h"
|
||||
|
||||
class cFemonLATM {
|
||||
private:
|
||||
cFemonAudioIf *audioHandlerM;
|
||||
|
||||
static int bitrateS[3][16];
|
||||
static int sampleRateS[4];
|
||||
|
||||
public:
|
||||
cFemonLATM(cFemonAudioIf *audioHandlerP);
|
||||
virtual ~cFemonLATM();
|
||||
|
||||
bool processAudio(const uint8_t *bufP, int lenP);
|
||||
};
|
||||
|
||||
#endif //__FEMON_LATM_H
|
48
log.h
48
log.h
@ -1,48 +0,0 @@
|
||||
/*
|
||||
* log.h: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __FEMON_LOG_H
|
||||
#define __FEMON_LOG_H
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#define error(x...) esyslog("FEMON-ERROR: " x)
|
||||
#define info(x...) isyslog("FEMON: " x)
|
||||
// 0x0001: Generic call stack
|
||||
#define debug1(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug1) ? dsyslog("FEMON1: " x) : void() )
|
||||
// 0x0002: H.264
|
||||
#define debug2(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug2) ? dsyslog("FEMON2: " x) : void() )
|
||||
// 0x0004: TBD
|
||||
#define debug3(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug3) ? dsyslog("FEMON3: " x) : void() )
|
||||
// 0x0008: TBD
|
||||
#define debug4(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug4) ? dsyslog("FEMON4: " x) : void() )
|
||||
// 0x0010: TBD
|
||||
#define debug5(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug5) ? dsyslog("FEMON5: " x) : void() )
|
||||
// 0x0020: TBD
|
||||
#define debug6(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug6) ? dsyslog("FEMON6: " x) : void() )
|
||||
// 0x0040: TBD
|
||||
#define debug7(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug7) ? dsyslog("FEMON7: " x) : void() )
|
||||
// 0x0080: TBD
|
||||
#define debug8(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug8) ? dsyslog("FEMON8: " x) : void() )
|
||||
// 0x0100: TBD
|
||||
#define debug9(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug9) ? dsyslog("FEMON9: " x) : void() )
|
||||
// 0x0200: TBD
|
||||
#define debug10(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug10) ? dsyslog("FEMON10: " x) : void() )
|
||||
// 0x0400: TBD
|
||||
#define debug11(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug11) ? dsyslog("FEMON11: " x) : void() )
|
||||
// 0x0800: TBD
|
||||
#define debug12(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug12) ? dsyslog("FEMON12: " x) : void() )
|
||||
// 0x1000: TBD
|
||||
#define debug13(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug13) ? dsyslog("FEMON13: " x) : void() )
|
||||
// 0x2000: TBD
|
||||
#define debug14(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug14) ? dsyslog("FEMON14: " x) : void() )
|
||||
// 0x4000: TBD
|
||||
#define debug15(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug15) ? dsyslog("FEMON15: " x) : void() )
|
||||
// 0x8000; Extra call stack
|
||||
#define debug16(x...) void( FemonConfig.IsTraceMode(cFemonConfig::eTraceModeDebug16) ? dsyslog("FEMON16: " x) : void() )
|
||||
|
||||
#endif // __FEMON_LOG_H
|
286
mpeg.c
286
mpeg.c
@ -1,286 +0,0 @@
|
||||
/*
|
||||
* mpeg.c: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "tools.h"
|
||||
#include "mpeg.h"
|
||||
|
||||
#define IS_EXTENSION_START(buf) (((buf)[0] == 0x00) && ((buf)[1] == 0x00) && ((buf)[2] == 0x01) && ((buf)[3] == 0xB5))
|
||||
|
||||
int cFemonMPEG::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, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1}, // MPEG-2 Layer II/III
|
||||
{0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160, -1} // MPEG-2 Layer II/III
|
||||
},
|
||||
{
|
||||
{0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1}, // MPEG-1 Layer I
|
||||
{0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1}, // MPEG-1 Layer II
|
||||
{0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1} // MPEG-1 Layer III
|
||||
}
|
||||
};
|
||||
|
||||
int cFemonMPEG::sampleRateS[2][4] =
|
||||
{
|
||||
{22050, 24000, 16000, -1}, // MPEG-2
|
||||
{44100, 48000, 32000, -1} // MPEG-1
|
||||
};
|
||||
|
||||
eAudioCodec cFemonMPEG::formatS[2][4] =
|
||||
{
|
||||
{AUDIO_CODEC_MPEG2_I, AUDIO_CODEC_MPEG2_II, AUDIO_CODEC_MPEG2_III, AUDIO_CODEC_UNKNOWN}, // MPEG-2
|
||||
{AUDIO_CODEC_MPEG1_I, AUDIO_CODEC_MPEG1_II, AUDIO_CODEC_MPEG1_III, AUDIO_CODEC_UNKNOWN} // MPEG-1
|
||||
};
|
||||
|
||||
cFemonMPEG::cFemonMPEG(cFemonVideoIf *videoHandlerP, cFemonAudioIf *audioHandlerP)
|
||||
: videoHandlerM(videoHandlerP),
|
||||
audioHandlerM(audioHandlerP)
|
||||
{
|
||||
}
|
||||
|
||||
cFemonMPEG::~cFemonMPEG()
|
||||
{
|
||||
}
|
||||
|
||||
bool cFemonMPEG::processAudio(const uint8_t *bufP, int lenP)
|
||||
{
|
||||
cFemonBitStream bs(bufP, lenP * 8);
|
||||
|
||||
if (!audioHandlerM)
|
||||
return false;
|
||||
|
||||
// skip PES header
|
||||
if (!PesLongEnough(lenP))
|
||||
return false;
|
||||
bs.SkipBits(8 * PesPayloadOffset(bufP));
|
||||
|
||||
// MPEG audio detection
|
||||
if (bs.GetBits(12) != 0xFFF) // syncword
|
||||
return false;
|
||||
|
||||
int id = bs.GetBit(); // id: MPEG-2=0, MPEG-1=1
|
||||
int layer = 3 - bs.GetBits(2); // layer: I=11, II=10, III=01
|
||||
bs.SkipBit(); // protection bit
|
||||
int bit_rate_index = bs.GetBits(4); // bitrate index
|
||||
int sampling_frequency = bs.GetBits(2); // sampling frequency
|
||||
bs.SkipBit(); // padding bit
|
||||
bs.SkipBit(); // private pid
|
||||
int mode = bs.GetBits(2); // mode
|
||||
|
||||
audioHandlerM->SetAudioCodec(formatS[id][layer]);
|
||||
|
||||
switch (mode) {
|
||||
case 0:
|
||||
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_STEREO);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_JOINT_STEREO);
|
||||
break;
|
||||
|
||||
case 2:
|
||||
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_DUAL);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_SINGLE);
|
||||
break;
|
||||
|
||||
default:
|
||||
audioHandlerM->SetAudioChannel(AUDIO_CHANNEL_MODE_INVALID);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (bit_rate_index) {
|
||||
case 0:
|
||||
audioHandlerM->SetAudioBitrate(AUDIO_BITRATE_FREE);
|
||||
break;
|
||||
|
||||
case 0xF:
|
||||
audioHandlerM->SetAudioBitrate(AUDIO_BITRATE_RESERVED);
|
||||
break;
|
||||
|
||||
default:
|
||||
audioHandlerM->SetAudioBitrate(1000 * bitrateS[id][layer][bit_rate_index]);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (sampling_frequency) {
|
||||
case 3:
|
||||
audioHandlerM->SetAudioSamplingFrequency(AUDIO_SAMPLING_FREQUENCY_RESERVED);
|
||||
break;
|
||||
|
||||
default:
|
||||
audioHandlerM->SetAudioSamplingFrequency(sampleRateS[id][sampling_frequency]);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool cFemonMPEG::processVideo(const uint8_t *bufP, int lenP)
|
||||
{
|
||||
cFemonBitStream bs(bufP, lenP * 8);
|
||||
|
||||
if (!videoHandlerM)
|
||||
return false;
|
||||
|
||||
// skip PES header
|
||||
if (!PesLongEnough(lenP))
|
||||
return false;
|
||||
bs.SkipBits(8 * PesPayloadOffset(bufP));
|
||||
|
||||
// MPEG-2 video detection, search for start code
|
||||
if (bs.GetBits(32) != 0x000001B3) // sequence header
|
||||
return false;
|
||||
|
||||
int scan = VIDEO_SCAN_UNKNOWN;
|
||||
int format = VIDEO_FORMAT_UNKNOWN;
|
||||
int aspect = VIDEO_ASPECT_RATIO_RESERVED;
|
||||
|
||||
int horizontal_size = bs.GetBits(12); // horizontal size value
|
||||
int vertical_size = bs.GetBits(12); // vertical size value
|
||||
|
||||
switch (bs.GetBits(4)) { // aspect ratio information
|
||||
case 1:
|
||||
aspect = VIDEO_ASPECT_RATIO_1_1;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
aspect = VIDEO_ASPECT_RATIO_4_3;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
aspect = VIDEO_ASPECT_RATIO_16_9;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
aspect = VIDEO_ASPECT_RATIO_2_21_1;
|
||||
break;
|
||||
|
||||
case 5 ... 15:
|
||||
default:
|
||||
aspect = VIDEO_ASPECT_RATIO_RESERVED;
|
||||
break;
|
||||
}
|
||||
|
||||
double frame_rate = 0;
|
||||
switch (bs.GetBits(4)) { // frame rate code
|
||||
case 1:
|
||||
frame_rate = 24000 / 1001.0;
|
||||
format = VIDEO_FORMAT_UNKNOWN;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
frame_rate = 24.0;
|
||||
format = VIDEO_FORMAT_UNKNOWN;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
frame_rate = 25.0;
|
||||
format = VIDEO_FORMAT_PAL;
|
||||
break;
|
||||
|
||||
case 4:
|
||||
frame_rate = 30000 / 1001.0;
|
||||
format = VIDEO_FORMAT_NTSC;
|
||||
break;
|
||||
|
||||
case 5:
|
||||
frame_rate = 30.0;
|
||||
format = VIDEO_FORMAT_NTSC;
|
||||
break;
|
||||
|
||||
case 6:
|
||||
frame_rate = 50.0;
|
||||
format = VIDEO_FORMAT_PAL;
|
||||
break;
|
||||
|
||||
case 7:
|
||||
frame_rate = 60.0;
|
||||
format = VIDEO_FORMAT_NTSC;
|
||||
break;
|
||||
|
||||
case 8:
|
||||
frame_rate = 60000 / 1001.0;
|
||||
format = VIDEO_FORMAT_NTSC;
|
||||
break;
|
||||
|
||||
case 9 ... 15:
|
||||
default:
|
||||
frame_rate = 0;
|
||||
format = VIDEO_FORMAT_UNKNOWN;
|
||||
break;
|
||||
}
|
||||
|
||||
int bit_rate = bs.GetBits(18); // bit rate value
|
||||
|
||||
bs.SkipBit(); // marker bit
|
||||
bs.SkipBits(10); // vbv buffer size value
|
||||
bs.SkipBit(); // constrained parameters value
|
||||
if (bs.GetBit()) // load intra quantizer matrix
|
||||
bs.SkipBits(8 * 64); // intra quantizer matrix
|
||||
if (bs.GetBit()) // load non-intra quantizer matrix
|
||||
bs.SkipBits(8 * 64); // non-intra quantizer matrix
|
||||
|
||||
if (bs.GetBits(32) != 0x000001B5) { // extension start
|
||||
bs.SkipBits(4); // extension start code identifier
|
||||
bs.SkipBits(8); // profile and level indicator
|
||||
scan = bs.GetBit() ? VIDEO_SCAN_PROGRESSIVE :
|
||||
VIDEO_SCAN_INTERLACED; // progressive sequence
|
||||
bs.SkipBits(2); // chroma format
|
||||
horizontal_size |= (bs.GetBits(2) << 12); // horizontal size extension
|
||||
vertical_size |= (bs.GetBits(2) << 12); // vertical size extension
|
||||
bit_rate |= (bs.GetBits(12) << 18); // bit rate extension
|
||||
bs.SkipBit(); // marker bit
|
||||
bs.SkipBits(8); // vpv buffer size extension
|
||||
bs.SkipBit(); // low delay
|
||||
bs.SkipBits(2); // frame rate extension n
|
||||
bs.SkipBits(5); // frame rate extension d
|
||||
|
||||
if ((bs.GetBits(32) != 0x000001B5) && // extension start code
|
||||
(bs.GetBits(4) == 0x0010)) { // sequence display extension id
|
||||
switch (bs.GetBits(3)) { // video format
|
||||
case 0x000:
|
||||
format = VIDEO_FORMAT_COMPONENT;
|
||||
break;
|
||||
case 0x001:
|
||||
format = VIDEO_FORMAT_PAL;
|
||||
break;
|
||||
case 0x010:
|
||||
format = VIDEO_FORMAT_NTSC;
|
||||
break;
|
||||
case 0x011:
|
||||
format = VIDEO_FORMAT_SECAM;
|
||||
break;
|
||||
case 0x100:
|
||||
format = VIDEO_FORMAT_MAC;
|
||||
break;
|
||||
case 0x101:
|
||||
format = VIDEO_FORMAT_UNKNOWN;
|
||||
break;
|
||||
case 0x110:
|
||||
case 0x111:
|
||||
format = VIDEO_FORMAT_RESERVED;
|
||||
break;
|
||||
default:
|
||||
format = VIDEO_FORMAT_INVALID;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
videoHandlerM->SetVideoCodec(VIDEO_CODEC_MPEG2);
|
||||
videoHandlerM->SetVideoSize(horizontal_size, vertical_size);
|
||||
videoHandlerM->SetVideoBitrate(400.0 * (double)(bit_rate));
|
||||
videoHandlerM->SetVideoFramerate(frame_rate);
|
||||
videoHandlerM->SetVideoScan(eVideoScan(scan));
|
||||
videoHandlerM->SetVideoAspectRatio(eVideoAspectRatio(aspect));
|
||||
videoHandlerM->SetVideoFormat(eVideoFormat(format));
|
||||
|
||||
return true;
|
||||
}
|
31
mpeg.h
31
mpeg.h
@ -1,31 +0,0 @@
|
||||
/*
|
||||
* mpeg.h: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __FEMON_MPEG_H
|
||||
#define __FEMON_MPEG_H
|
||||
|
||||
#include "video.h"
|
||||
#include "audio.h"
|
||||
|
||||
class cFemonMPEG {
|
||||
private:
|
||||
cFemonVideoIf *videoHandlerM;
|
||||
cFemonAudioIf *audioHandlerM;
|
||||
|
||||
static int bitrateS[2][3][16];
|
||||
static int sampleRateS[2][4];
|
||||
static eAudioCodec formatS[2][4];
|
||||
|
||||
public:
|
||||
cFemonMPEG(cFemonVideoIf *videoHandlerP, cFemonAudioIf *audioHandlerP);
|
||||
virtual ~cFemonMPEG();
|
||||
|
||||
bool processVideo(const uint8_t *bufP, int lenP);
|
||||
bool processAudio(const uint8_t *bufP, int lenP);
|
||||
};
|
||||
|
||||
#endif //__FEMON_MPEG_H
|
101
osd.h
101
osd.h
@ -1,101 +0,0 @@
|
||||
/*
|
||||
* osd.h: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __FEMON_OSD_H
|
||||
#define __FEMON_OSD_H
|
||||
|
||||
#include <sys/time.h>
|
||||
#include <vdr/osd.h>
|
||||
#include <vdr/thread.h>
|
||||
#include <vdr/status.h>
|
||||
#include <vdr/plugin.h>
|
||||
#include <vdr/channels.h>
|
||||
#include <vdr/transfer.h>
|
||||
#include <vdr/tools.h>
|
||||
|
||||
#include "receiver.h"
|
||||
#include "svdrpservice.h"
|
||||
|
||||
#define MAX_BM_NUMBER 8
|
||||
|
||||
class cFemonOsd : public cOsdObject, public cThread, public cStatus {
|
||||
private:
|
||||
enum eDeviceSourceType {
|
||||
DEVICESOURCE_DVBAPI = 0,
|
||||
DEVICESOURCE_IPTV,
|
||||
DEVICESOURCE_PVRINPUT,
|
||||
DEVICESOURCE_COUNT
|
||||
};
|
||||
|
||||
static cFemonOsd *pInstanceS;
|
||||
|
||||
cOsd *osdM;
|
||||
cFemonReceiver *receiverM;
|
||||
int svdrpFrontendM;
|
||||
double svdrpVideoBitRateM;
|
||||
double svdrpAudioBitRateM;
|
||||
SvdrpConnection_v1_0 svdrpConnectionM;
|
||||
cPlugin *svdrpPluginM;
|
||||
int numberM;
|
||||
int oldNumberM;
|
||||
int qualityM;
|
||||
bool qualityValidM;
|
||||
int strengthM;
|
||||
bool strengthValidM;
|
||||
double cnrM;
|
||||
bool cnrValidM;
|
||||
double signalM;
|
||||
bool signalValidM;
|
||||
double berM;
|
||||
bool berValidM;
|
||||
double perM;
|
||||
bool perValidM;
|
||||
cString frontendNameM;
|
||||
cString frontendTypeM;
|
||||
int frontendStatusM;
|
||||
bool frontendStatusValidM;
|
||||
dvb_frontend_info frontendInfoM;
|
||||
eDeviceSourceType deviceSourceM;
|
||||
int displayModeM;
|
||||
int osdWidthM;
|
||||
int osdHeightM;
|
||||
int osdLeftM;
|
||||
int osdTopM;
|
||||
cFont *fontM;
|
||||
cTimeMs inputTimeM;
|
||||
cCondWait sleepM;
|
||||
cMutex mutexM;
|
||||
|
||||
bool AttachFrontend(void);
|
||||
void DrawStatusWindow(void);
|
||||
void DrawInfoWindow(void);
|
||||
bool SvdrpConnect(void);
|
||||
bool SvdrpTune(void);
|
||||
|
||||
protected:
|
||||
cFemonOsd();
|
||||
cFemonOsd(const cFemonOsd&);
|
||||
cFemonOsd& operator= (const cFemonOsd&);
|
||||
virtual void Action(void);
|
||||
virtual void ChannelSwitch(const cDevice *deviceP, int channelNumberP, bool liveViewP);
|
||||
virtual void SetAudioTrack(int indexP, const char * const *tracksP);
|
||||
|
||||
public:
|
||||
static cFemonOsd *Instance(bool createP = false);
|
||||
~cFemonOsd();
|
||||
|
||||
virtual void Show(void);
|
||||
virtual eOSState ProcessKey(eKeys keyP);
|
||||
|
||||
bool DeviceSwitch(int directionP);
|
||||
double GetVideoBitrate(void);
|
||||
double GetAudioBitrate(void);
|
||||
double GetDolbyBitrate(void);
|
||||
};
|
||||
|
||||
#endif //__FEMON_OSD_H
|
||||
|
410
po/de_DE.po
410
po/de_DE.po
@ -1,410 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
||||
# This file is distributed under the same license as the femon package.
|
||||
# Peter Marquardt
|
||||
# Andreas Brachold
|
||||
# Christian Wieninger
|
||||
# Winfried
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
||||
"Last-Translator: Christian Wieninger\n"
|
||||
"Language-Team: German <vdr@linuxtv.org>\n"
|
||||
"Language: de\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "DVB Signal Information Monitor (OSD)"
|
||||
msgstr "DVB Signal Informationsanzeige (OSD)"
|
||||
|
||||
msgid "Signal Information"
|
||||
msgstr "Signalinformationen"
|
||||
|
||||
msgid "Femon not available"
|
||||
msgstr "Femon nicht verfügbar"
|
||||
|
||||
msgid "Video"
|
||||
msgstr "Video"
|
||||
|
||||
msgid "AC-3"
|
||||
msgstr "AC-3"
|
||||
|
||||
msgid "Audio"
|
||||
msgstr "Audio"
|
||||
|
||||
msgid "Transponder Information"
|
||||
msgstr "Transponderinformation"
|
||||
|
||||
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 "Protokoll"
|
||||
|
||||
msgid "Bitrate"
|
||||
msgstr "Bitrate"
|
||||
|
||||
msgid "Stream Information"
|
||||
msgstr "Streaminformation"
|
||||
|
||||
msgid "Video Stream"
|
||||
msgstr "Videostream"
|
||||
|
||||
msgid "Codec"
|
||||
msgstr "Codec"
|
||||
|
||||
msgid "Aspect Ratio"
|
||||
msgstr "Seitenverhältnis"
|
||||
|
||||
msgid "Frame Rate"
|
||||
msgstr "Bildrate"
|
||||
|
||||
msgid "Video Format"
|
||||
msgstr "Videoformat"
|
||||
|
||||
msgid "Resolution"
|
||||
msgstr "Auflösung"
|
||||
|
||||
msgid "Audio Stream"
|
||||
msgstr "Audiostream"
|
||||
|
||||
msgid "Channel Mode"
|
||||
msgstr "Kanalmodus"
|
||||
|
||||
msgid "Sampling Frequency"
|
||||
msgstr "Abtastrate"
|
||||
|
||||
msgid "AC-3 Stream"
|
||||
msgstr "AC-3 Stream"
|
||||
|
||||
msgid "Bit Stream Mode"
|
||||
msgstr "Bitstream Modus"
|
||||
|
||||
msgid "Audio Coding Mode"
|
||||
msgstr "Audiokodierung"
|
||||
|
||||
msgid "Center Mix Level"
|
||||
msgstr "Center Mix Pegel"
|
||||
|
||||
msgid "Surround Mix Level"
|
||||
msgstr "Surround Mix Pegel"
|
||||
|
||||
msgid "Dolby Surround Mode"
|
||||
msgstr "Dolby Surround Modus"
|
||||
|
||||
msgid "Low Frequency Effects"
|
||||
msgstr "Tieftöner Effekte"
|
||||
|
||||
msgid "Dialogue Normalization"
|
||||
msgstr "Dialog Normalisierung"
|
||||
|
||||
msgid "basic"
|
||||
msgstr "Standard"
|
||||
|
||||
msgid "transponder"
|
||||
msgstr "Transponder"
|
||||
|
||||
msgid "stream"
|
||||
msgstr "Stream"
|
||||
|
||||
msgid "dBm"
|
||||
msgstr "dBm"
|
||||
|
||||
msgid "dBuV"
|
||||
msgstr "dBuV"
|
||||
|
||||
msgid "dBV"
|
||||
msgstr "dBV"
|
||||
|
||||
msgid "Classic"
|
||||
msgstr "Klassischer"
|
||||
|
||||
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 "Hauptmenüeintrag verstecken"
|
||||
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr "Legt fest, ob der Hauptmenüeintrag ausgeblendet ist."
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "Standard Anzeigemodus"
|
||||
|
||||
msgid "Define the default display mode at startup."
|
||||
msgstr "Definiert den Standard-Anzeigemodus beim Start."
|
||||
|
||||
msgid "Define the used OSD skin."
|
||||
msgstr "Definiert die verwendete OSD-Oberfläche."
|
||||
|
||||
msgid "Define the used OSD theme."
|
||||
msgstr "Definiert das verwendete OSD-Theme."
|
||||
|
||||
msgid "Position"
|
||||
msgstr "Position"
|
||||
|
||||
msgid "Define the position of OSD."
|
||||
msgstr "Definiert die Position des OSD."
|
||||
|
||||
msgid "Downscale OSD size [%]"
|
||||
msgstr "OSD Größe verkleinern [%]"
|
||||
|
||||
msgid "Define the downscale ratio for OSD size."
|
||||
msgstr "Definiert den Verkleinerungsfaktor der OSD-Größe."
|
||||
|
||||
msgid "Signal level unit"
|
||||
msgstr "Signalpegel Einheiten"
|
||||
|
||||
msgid "Define the used signal level unit."
|
||||
msgstr "Definiert der Einheit für Signalpegel."
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "Grenze Rot [%]"
|
||||
|
||||
msgid "Define a limit for red bar, which is used to indicate a bad signal."
|
||||
msgstr "Definiert einen Grenzwert für den roten Balken, um ein schlechtes Signal zu kennzeichnen."
|
||||
|
||||
msgid "Green limit [%]"
|
||||
msgstr "Grenze Grün [%]"
|
||||
|
||||
msgid "Define a limit for green bar, which is used to indicate a good signal."
|
||||
msgstr "Definiert einen Grenzwert für den grünen Balken, um ein gutes Signal zu kennzeichnen."
|
||||
|
||||
msgid "OSD update interval [0.1s]"
|
||||
msgstr "OSD Updateintervall [0.1s]"
|
||||
|
||||
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
|
||||
msgstr "Definiert den Intervall für OSD-Updates. Ein kleineres Intervall erzeugt eine höhere CPU-Last."
|
||||
|
||||
msgid "Analyze stream"
|
||||
msgstr "Stream analysieren"
|
||||
|
||||
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
|
||||
msgstr "Definiert ob der DVB-Stream analysiert und die Bitraten berechnet werden."
|
||||
|
||||
msgid "Calculation interval [0.1s]"
|
||||
msgstr "Berechnungsintervall [0.1s]"
|
||||
|
||||
msgid "Define an interval for calculation. The bigger interval generates more stable values."
|
||||
msgstr "Definiert den Intervall für die Berechnung. Ein größerer Intervall erzeugt stabilere Werte."
|
||||
|
||||
msgid "Use SVDRP service"
|
||||
msgstr "SVDRP-Service verwenden"
|
||||
|
||||
msgid "Define whether the SVDRP service is used in client/server setups."
|
||||
msgstr "Legt fest, ob der SVDRP-Service in Client/Server-Setups verwendet wird."
|
||||
|
||||
msgid "SVDRP service port"
|
||||
msgstr "SVDRP-Service Port"
|
||||
|
||||
msgid "Define the port number of SVDRP service."
|
||||
msgstr "Definiert die Portnummer des SVDRP-Service."
|
||||
|
||||
msgid "SVDRP service IP"
|
||||
msgstr "SVDRP-Service IP"
|
||||
|
||||
msgid "Define the IP address of SVDRP service."
|
||||
msgstr "Definiert die IP-Adresse des SVDRP-Service."
|
||||
|
||||
msgid "Help"
|
||||
msgstr "Hilfe"
|
||||
|
||||
msgid "Fixed"
|
||||
msgstr "Fest"
|
||||
|
||||
msgid "Analog"
|
||||
msgstr "Analog"
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr "MPEG-2"
|
||||
|
||||
msgid "H.264"
|
||||
msgstr "H.264"
|
||||
|
||||
msgid "H.265"
|
||||
msgstr "H.265"
|
||||
|
||||
msgid "MPEG-1 Layer I"
|
||||
msgstr "MPEG-1 Layer I"
|
||||
|
||||
msgid "MPEG-1 Layer II"
|
||||
msgstr "MPEG-1 Layer II"
|
||||
|
||||
msgid "MPEG-1 Layer III"
|
||||
msgstr "MPEG-1 Layer III"
|
||||
|
||||
msgid "MPEG-2 Layer I"
|
||||
msgstr "MPEG-2 Layer I"
|
||||
|
||||
msgid "MPEG-2 Layer II"
|
||||
msgstr "MPEG-2 Layer II"
|
||||
|
||||
msgid "MPEG-2 Layer III"
|
||||
msgstr "MPEG-2 Layer III"
|
||||
|
||||
msgid "HE-AAC"
|
||||
msgstr "HE-AAC"
|
||||
|
||||
msgid "LATM"
|
||||
msgstr "LATM"
|
||||
|
||||
msgid "stereo"
|
||||
msgstr "Stereo"
|
||||
|
||||
msgid "joint Stereo"
|
||||
msgstr "Joint-Stereo"
|
||||
|
||||
msgid "dual"
|
||||
msgstr "Dual"
|
||||
|
||||
msgid "mono"
|
||||
msgstr "Mono"
|
||||
|
||||
msgid "interlaced"
|
||||
msgstr "Interlaced"
|
||||
|
||||
msgid "progressive"
|
||||
msgstr "Progressiv"
|
||||
|
||||
msgid "reserved"
|
||||
msgstr "belegt"
|
||||
|
||||
msgid "extended"
|
||||
msgstr "erweitert"
|
||||
|
||||
msgid "unknown"
|
||||
msgstr "unbekannt"
|
||||
|
||||
msgid "component"
|
||||
msgstr "Komponentenvideo"
|
||||
|
||||
msgid "PAL"
|
||||
msgstr "PAL"
|
||||
|
||||
msgid "NTSC"
|
||||
msgstr "NTSC"
|
||||
|
||||
msgid "SECAM"
|
||||
msgstr "SECAM"
|
||||
|
||||
msgid "MAC"
|
||||
msgstr "MAC"
|
||||
|
||||
msgid "Hz"
|
||||
msgstr "Hz"
|
||||
|
||||
msgid "Complete Main (CM)"
|
||||
msgstr "Complete Main (CM)"
|
||||
|
||||
msgid "Music and Effects (ME)"
|
||||
msgstr "Musik und Effekte (ME)"
|
||||
|
||||
msgid "Visually Impaired (VI)"
|
||||
msgstr "Sehbehindert (VI)"
|
||||
|
||||
msgid "Hearing Impaired (HI)"
|
||||
msgstr "Hörbehindert (HI)"
|
||||
|
||||
msgid "Dialogue (D)"
|
||||
msgstr "Dialog (D)"
|
||||
|
||||
msgid "Commentary (C)"
|
||||
msgstr "Kommentar (C)"
|
||||
|
||||
msgid "Emergency (E)"
|
||||
msgstr "Notfall (E)"
|
||||
|
||||
msgid "Voice Over (VO)"
|
||||
msgstr "Überlagerte Stimme (VO)"
|
||||
|
||||
msgid "Karaoke"
|
||||
msgstr "Karaoke"
|
||||
|
||||
msgid "Ch1"
|
||||
msgstr "Kan1"
|
||||
|
||||
msgid "Ch2"
|
||||
msgstr "Kan2"
|
||||
|
||||
msgid "C"
|
||||
msgstr "C"
|
||||
|
||||
msgid "L"
|
||||
msgstr "L"
|
||||
|
||||
msgid "R"
|
||||
msgstr "R"
|
||||
|
||||
msgid "S"
|
||||
msgstr "S"
|
||||
|
||||
msgid "SL"
|
||||
msgstr "SL"
|
||||
|
||||
msgid "SR"
|
||||
msgstr "SR"
|
||||
|
||||
msgid "dB"
|
||||
msgstr "dB"
|
||||
|
||||
msgid "not indicated"
|
||||
msgstr "nicht angegeben"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "MHz"
|
||||
|
||||
msgid "free"
|
||||
msgstr "frei"
|
||||
|
||||
msgid "Mbit/s"
|
||||
msgstr "Mbit/s"
|
||||
|
||||
msgid "kbit/s"
|
||||
msgstr "kbit/s"
|
407
po/es_ES.po
407
po/es_ES.po
@ -1,407 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
||||
# This file is distributed under the same license as the femon package.
|
||||
# Luis Palacios
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
||||
"Last-Translator: Luis Palacios\n"
|
||||
"Language-Team: Spanish <vdr@linuxtv.org>\n"
|
||||
"Language: es\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "DVB Signal Information Monitor (OSD)"
|
||||
msgstr "Monitorización de la señal DVB"
|
||||
|
||||
msgid "Signal Information"
|
||||
msgstr "Monitorización de la señal DVB"
|
||||
|
||||
msgid "Femon not available"
|
||||
msgstr ""
|
||||
|
||||
msgid "Video"
|
||||
msgstr "Video"
|
||||
|
||||
msgid "AC-3"
|
||||
msgstr "AC-3"
|
||||
|
||||
msgid "Audio"
|
||||
msgstr "Audio"
|
||||
|
||||
msgid "Transponder Information"
|
||||
msgstr "Información del transpondedor"
|
||||
|
||||
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 "Tasa de bits"
|
||||
|
||||
msgid "Stream Information"
|
||||
msgstr "Información del flujo"
|
||||
|
||||
msgid "Video Stream"
|
||||
msgstr "Flujo de video"
|
||||
|
||||
msgid "Codec"
|
||||
msgstr ""
|
||||
|
||||
msgid "Aspect Ratio"
|
||||
msgstr "Proporciones de la imagen"
|
||||
|
||||
msgid "Frame Rate"
|
||||
msgstr "Tasa de frames"
|
||||
|
||||
msgid "Video Format"
|
||||
msgstr "Formato de video"
|
||||
|
||||
msgid "Resolution"
|
||||
msgstr "Resolución"
|
||||
|
||||
msgid "Audio Stream"
|
||||
msgstr "Flujo de audio"
|
||||
|
||||
msgid "Channel Mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "Sampling Frequency"
|
||||
msgstr "Frecuencia de muestreo"
|
||||
|
||||
msgid "AC-3 Stream"
|
||||
msgstr "Flujo AC-3"
|
||||
|
||||
msgid "Bit Stream Mode"
|
||||
msgstr "Modo bitstream"
|
||||
|
||||
msgid "Audio Coding Mode"
|
||||
msgstr "Modo de codificación de audio"
|
||||
|
||||
msgid "Center Mix Level"
|
||||
msgstr "Nivel sonoro central"
|
||||
|
||||
msgid "Surround Mix Level"
|
||||
msgstr "Nivel sonoro surround"
|
||||
|
||||
msgid "Dolby Surround Mode"
|
||||
msgstr "Nivel sonoro Dolby Surround"
|
||||
|
||||
msgid "Low Frequency Effects"
|
||||
msgstr "Efectos de baja frecuencia"
|
||||
|
||||
msgid "Dialogue Normalization"
|
||||
msgstr "Normalización del diálogo"
|
||||
|
||||
msgid "basic"
|
||||
msgstr "Básico"
|
||||
|
||||
msgid "transponder"
|
||||
msgstr "Transpondedor"
|
||||
|
||||
msgid "stream"
|
||||
msgstr "Flujo"
|
||||
|
||||
msgid "dBm"
|
||||
msgstr "dBm"
|
||||
|
||||
msgid "dBuV"
|
||||
msgstr "dBuV"
|
||||
|
||||
msgid "dBV"
|
||||
msgstr "dBV"
|
||||
|
||||
msgid "Classic"
|
||||
msgstr "Clásico"
|
||||
|
||||
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 "Ocultar en el menú principal"
|
||||
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr ""
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "Modo de visualización estandar"
|
||||
|
||||
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 "Posición"
|
||||
|
||||
msgid "Define the position of OSD."
|
||||
msgstr ""
|
||||
|
||||
msgid "Downscale OSD size [%]"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the downscale ratio for OSD size."
|
||||
msgstr ""
|
||||
|
||||
msgid "Signal level unit"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the used signal level unit."
|
||||
msgstr ""
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "Límite de rojo [%s]"
|
||||
|
||||
msgid "Define a limit for red bar, which is used to indicate a bad signal."
|
||||
msgstr ""
|
||||
|
||||
msgid "Green limit [%]"
|
||||
msgstr "Límite verde [%]"
|
||||
|
||||
msgid "Define a limit for green bar, which is used to indicate a good signal."
|
||||
msgstr ""
|
||||
|
||||
msgid "OSD update interval [0.1s]"
|
||||
msgstr "Intervalo de actualización (0,1)"
|
||||
|
||||
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
|
||||
msgstr ""
|
||||
|
||||
msgid "Analyze stream"
|
||||
msgstr "Analizar el flujo"
|
||||
|
||||
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
|
||||
msgstr ""
|
||||
|
||||
msgid "Calculation interval [0.1s]"
|
||||
msgstr "Intervalo de cálculo (0,1s)"
|
||||
|
||||
msgid "Define an interval for calculation. The bigger interval generates more stable values."
|
||||
msgstr ""
|
||||
|
||||
msgid "Use SVDRP service"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define whether the SVDRP service is used in client/server setups."
|
||||
msgstr ""
|
||||
|
||||
msgid "SVDRP service port"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the port number of SVDRP service."
|
||||
msgstr ""
|
||||
|
||||
msgid "SVDRP service IP"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the IP address of SVDRP service."
|
||||
msgstr ""
|
||||
|
||||
msgid "Help"
|
||||
msgstr "Ayuda"
|
||||
|
||||
msgid "Fixed"
|
||||
msgstr "Fijo"
|
||||
|
||||
msgid "Analog"
|
||||
msgstr "Analógico"
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr ""
|
||||
|
||||
msgid "H.264"
|
||||
msgstr ""
|
||||
|
||||
msgid "H.265"
|
||||
msgstr ""
|
||||
|
||||
msgid "MPEG-1 Layer I"
|
||||
msgstr ""
|
||||
|
||||
msgid "MPEG-1 Layer II"
|
||||
msgstr ""
|
||||
|
||||
msgid "MPEG-1 Layer III"
|
||||
msgstr ""
|
||||
|
||||
msgid "MPEG-2 Layer I"
|
||||
msgstr ""
|
||||
|
||||
msgid "MPEG-2 Layer II"
|
||||
msgstr ""
|
||||
|
||||
msgid "MPEG-2 Layer III"
|
||||
msgstr ""
|
||||
|
||||
msgid "HE-AAC"
|
||||
msgstr ""
|
||||
|
||||
msgid "LATM"
|
||||
msgstr ""
|
||||
|
||||
msgid "stereo"
|
||||
msgstr ""
|
||||
|
||||
msgid "joint Stereo"
|
||||
msgstr ""
|
||||
|
||||
msgid "dual"
|
||||
msgstr ""
|
||||
|
||||
msgid "mono"
|
||||
msgstr "o"
|
||||
|
||||
msgid "interlaced"
|
||||
msgstr ""
|
||||
|
||||
msgid "progressive"
|
||||
msgstr ""
|
||||
|
||||
msgid "reserved"
|
||||
msgstr "reservado"
|
||||
|
||||
msgid "extended"
|
||||
msgstr ""
|
||||
|
||||
msgid "unknown"
|
||||
msgstr "desconocido"
|
||||
|
||||
msgid "component"
|
||||
msgstr ""
|
||||
|
||||
msgid "PAL"
|
||||
msgstr "PAL"
|
||||
|
||||
msgid "NTSC"
|
||||
msgstr "NTSC"
|
||||
|
||||
msgid "SECAM"
|
||||
msgstr ""
|
||||
|
||||
msgid "MAC"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hz"
|
||||
msgstr "Hz"
|
||||
|
||||
msgid "Complete Main (CM)"
|
||||
msgstr "Principal (CM)"
|
||||
|
||||
msgid "Music and Effects (ME)"
|
||||
msgstr "Música y efectos (ME)"
|
||||
|
||||
msgid "Visually Impaired (VI)"
|
||||
msgstr "Imagen deteriorada (VI)"
|
||||
|
||||
msgid "Hearing Impaired (HI)"
|
||||
msgstr "Hearing deteriorado"
|
||||
|
||||
msgid "Dialogue (D)"
|
||||
msgstr "Diálogo (D)"
|
||||
|
||||
msgid "Commentary (C)"
|
||||
msgstr "Comentario (C)"
|
||||
|
||||
msgid "Emergency (E)"
|
||||
msgstr "Emergencia (E)"
|
||||
|
||||
msgid "Voice Over (VO)"
|
||||
msgstr "Voz off (VO)"
|
||||
|
||||
msgid "Karaoke"
|
||||
msgstr "Karaoke"
|
||||
|
||||
msgid "Ch1"
|
||||
msgstr "Can. 1"
|
||||
|
||||
msgid "Ch2"
|
||||
msgstr "Can. 2"
|
||||
|
||||
msgid "C"
|
||||
msgstr "C"
|
||||
|
||||
msgid "L"
|
||||
msgstr "I"
|
||||
|
||||
msgid "R"
|
||||
msgstr "D"
|
||||
|
||||
msgid "S"
|
||||
msgstr "S"
|
||||
|
||||
msgid "SL"
|
||||
msgstr "SI"
|
||||
|
||||
msgid "SR"
|
||||
msgstr "SD"
|
||||
|
||||
msgid "dB"
|
||||
msgstr "dB"
|
||||
|
||||
msgid "not indicated"
|
||||
msgstr "no indicado"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "MHz"
|
||||
|
||||
msgid "free"
|
||||
msgstr "libre"
|
||||
|
||||
msgid "Mbit/s"
|
||||
msgstr "Mbit/s"
|
||||
|
||||
msgid "kbit/s"
|
||||
msgstr "kbit/s"
|
407
po/et_EE.po
407
po/et_EE.po
@ -1,407 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
||||
# This file is distributed under the same license as the femon package.
|
||||
# Arthur Konovalov
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
||||
"Last-Translator: Arthur Konovalov\n"
|
||||
"Language-Team: Estonian <vdr@linuxtv.org>\n"
|
||||
"Language: et\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-13\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "DVB Signal Information Monitor (OSD)"
|
||||
msgstr "DVB Signaalmonitor (OSD)"
|
||||
|
||||
msgid "Signal Information"
|
||||
msgstr "Signaaliinfo"
|
||||
|
||||
msgid "Femon not available"
|
||||
msgstr "Femon ei ole kättesaadav"
|
||||
|
||||
msgid "Video"
|
||||
msgstr "Video"
|
||||
|
||||
msgid "AC-3"
|
||||
msgstr "AC-3"
|
||||
|
||||
msgid "Audio"
|
||||
msgstr "Audio"
|
||||
|
||||
msgid "Transponder Information"
|
||||
msgstr "Transponderi info"
|
||||
|
||||
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 "Bitikiirus"
|
||||
|
||||
msgid "Stream Information"
|
||||
msgstr "Vooinfo"
|
||||
|
||||
msgid "Video Stream"
|
||||
msgstr "Videovoog"
|
||||
|
||||
msgid "Codec"
|
||||
msgstr "Koodek"
|
||||
|
||||
msgid "Aspect Ratio"
|
||||
msgstr "Külgsuhe"
|
||||
|
||||
msgid "Frame Rate"
|
||||
msgstr "Kaadrisagedus"
|
||||
|
||||
msgid "Video Format"
|
||||
msgstr "Videoformaat"
|
||||
|
||||
msgid "Resolution"
|
||||
msgstr "Resolutsioon"
|
||||
|
||||
msgid "Audio Stream"
|
||||
msgstr "Audiovoog"
|
||||
|
||||
msgid "Channel Mode"
|
||||
msgstr "Kanalimoodus"
|
||||
|
||||
msgid "Sampling Frequency"
|
||||
msgstr "Sämplimissagedus"
|
||||
|
||||
msgid "AC-3 Stream"
|
||||
msgstr "AC-3 voog"
|
||||
|
||||
msgid "Bit Stream Mode"
|
||||
msgstr "Bitivoo tüüp"
|
||||
|
||||
msgid "Audio Coding Mode"
|
||||
msgstr "Audiokodeering"
|
||||
|
||||
msgid "Center Mix Level"
|
||||
msgstr "Keskmise kanali tase"
|
||||
|
||||
msgid "Surround Mix Level"
|
||||
msgstr "Surround kanali tase"
|
||||
|
||||
msgid "Dolby Surround Mode"
|
||||
msgstr "Dolby Surround'i tüüp"
|
||||
|
||||
msgid "Low Frequency Effects"
|
||||
msgstr "LFE kanal"
|
||||
|
||||
msgid "Dialogue Normalization"
|
||||
msgstr "Dialoogi normalisatsioon"
|
||||
|
||||
msgid "basic"
|
||||
msgstr "standard"
|
||||
|
||||
msgid "transponder"
|
||||
msgstr "transponder"
|
||||
|
||||
msgid "stream"
|
||||
msgstr "voog"
|
||||
|
||||
msgid "dBm"
|
||||
msgstr "dBm"
|
||||
|
||||
msgid "dBuV"
|
||||
msgstr "dBuV"
|
||||
|
||||
msgid "dBV"
|
||||
msgstr "dBV"
|
||||
|
||||
msgid "Classic"
|
||||
msgstr "Classic"
|
||||
|
||||
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 "Peita valik peamenüüs"
|
||||
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr "Valiku peamenüüs peitmise määritlemine."
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "Vaikemoodus"
|
||||
|
||||
msgid "Define the default display mode at startup."
|
||||
msgstr "Käivitamisel vaikemooduse määritlemine."
|
||||
|
||||
msgid "Define the used OSD skin."
|
||||
msgstr "Kasutatava ekraanikesta määritlemine."
|
||||
|
||||
msgid "Define the used OSD theme."
|
||||
msgstr "Kasutatava teema määritlemine."
|
||||
|
||||
msgid "Position"
|
||||
msgstr "Positsioon"
|
||||
|
||||
msgid "Define the position of OSD."
|
||||
msgstr "Ekraaniinfo positsiooni määritlemine."
|
||||
|
||||
msgid "Downscale OSD size [%]"
|
||||
msgstr "Ekraanimenüü vähendamine [%]"
|
||||
|
||||
msgid "Define the downscale ratio for OSD size."
|
||||
msgstr "Ekraanimenüü suuruse vähendamise määritlemine"
|
||||
|
||||
msgid "Signal level unit"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the used signal level unit."
|
||||
msgstr ""
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "Punase limiit [%]"
|
||||
|
||||
msgid "Define a limit for red bar, which is used to indicate a bad signal."
|
||||
msgstr "Seaded punasele limiidile. Iseloomustab kehva signaali."
|
||||
|
||||
msgid "Green limit [%]"
|
||||
msgstr "Rohelise limiit [%]"
|
||||
|
||||
msgid "Define a limit for green bar, which is used to indicate a good signal."
|
||||
msgstr "Seaded rohelisele limiidile. Iseloomustab head signaali."
|
||||
|
||||
msgid "OSD update interval [0.1s]"
|
||||
msgstr "Uuendusintervall [0,1s]"
|
||||
|
||||
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
|
||||
msgstr "Ekraaniinfo uuendamise intervalli määritlemine. Väiksem intervall- suurem CPU koormus."
|
||||
|
||||
msgid "Analyze stream"
|
||||
msgstr "Voo analüüs"
|
||||
|
||||
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
|
||||
msgstr "DVB voo bitikiiruse rehkendamise määritlemine."
|
||||
|
||||
msgid "Calculation interval [0.1s]"
|
||||
msgstr "Arvutamise intervall [0,1s]"
|
||||
|
||||
msgid "Define an interval for calculation. The bigger interval generates more stable values."
|
||||
msgstr "Arvutamise intervalli määritlemine. Suurem intervall annab stabiilsemaid tulemusi."
|
||||
|
||||
msgid "Use SVDRP service"
|
||||
msgstr "SVDRP teenus"
|
||||
|
||||
msgid "Define whether the SVDRP service is used in client/server setups."
|
||||
msgstr "SVDRP teenuse klient/server seadete määritlemine."
|
||||
|
||||
msgid "SVDRP service port"
|
||||
msgstr "SVDRP port"
|
||||
|
||||
msgid "Define the port number of SVDRP service."
|
||||
msgstr "SVDRP teenuse pordi määritlemine."
|
||||
|
||||
msgid "SVDRP service IP"
|
||||
msgstr "SVDRP IP"
|
||||
|
||||
msgid "Define the IP address of SVDRP service."
|
||||
msgstr "SVDRP teenuse IP aadressi määritlemine."
|
||||
|
||||
msgid "Help"
|
||||
msgstr "Abi"
|
||||
|
||||
msgid "Fixed"
|
||||
msgstr "Fikseeritud"
|
||||
|
||||
msgid "Analog"
|
||||
msgstr "Analoog"
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr "MPEG-2"
|
||||
|
||||
msgid "H.264"
|
||||
msgstr "H.264"
|
||||
|
||||
msgid "H.265"
|
||||
msgstr "H.265"
|
||||
|
||||
msgid "MPEG-1 Layer I"
|
||||
msgstr "MPEG-1 Layet I"
|
||||
|
||||
msgid "MPEG-1 Layer II"
|
||||
msgstr "MPEG-1 Layer II"
|
||||
|
||||
msgid "MPEG-1 Layer III"
|
||||
msgstr "MPEG-1 Layer III"
|
||||
|
||||
msgid "MPEG-2 Layer I"
|
||||
msgstr "MPEG-2 Layer I"
|
||||
|
||||
msgid "MPEG-2 Layer II"
|
||||
msgstr "MPEG-2 Layer II"
|
||||
|
||||
msgid "MPEG-2 Layer III"
|
||||
msgstr "MPEG-2 Layer III"
|
||||
|
||||
msgid "HE-AAC"
|
||||
msgstr "HE-AAC"
|
||||
|
||||
msgid "LATM"
|
||||
msgstr "LATM"
|
||||
|
||||
msgid "stereo"
|
||||
msgstr "stereo"
|
||||
|
||||
msgid "joint Stereo"
|
||||
msgstr "joint stereo"
|
||||
|
||||
msgid "dual"
|
||||
msgstr "duaalne"
|
||||
|
||||
msgid "mono"
|
||||
msgstr "mono"
|
||||
|
||||
msgid "interlaced"
|
||||
msgstr "ülerealaotus"
|
||||
|
||||
msgid "progressive"
|
||||
msgstr "progressiivne"
|
||||
|
||||
msgid "reserved"
|
||||
msgstr "reserv."
|
||||
|
||||
msgid "extended"
|
||||
msgstr "laiendatud"
|
||||
|
||||
msgid "unknown"
|
||||
msgstr "tundmatu"
|
||||
|
||||
msgid "component"
|
||||
msgstr "komponentne"
|
||||
|
||||
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 "Täiskomplekt (CM)"
|
||||
|
||||
msgid "Music and Effects (ME)"
|
||||
msgstr "Muusika ja efektid (ME)"
|
||||
|
||||
msgid "Visually Impaired (VI)"
|
||||
msgstr "Vaegnägemine (VE)"
|
||||
|
||||
msgid "Hearing Impaired (HI)"
|
||||
msgstr "Vaegkuulmine (HI)"
|
||||
|
||||
msgid "Dialogue (D)"
|
||||
msgstr "Dialoog (D)"
|
||||
|
||||
msgid "Commentary (C)"
|
||||
msgstr "Kommentaar (C)"
|
||||
|
||||
msgid "Emergency (E)"
|
||||
msgstr "Hädateade (E)"
|
||||
|
||||
msgid "Voice Over (VO)"
|
||||
msgstr "Pealerääkimine (VO)"
|
||||
|
||||
msgid "Karaoke"
|
||||
msgstr "Karaoke"
|
||||
|
||||
msgid "Ch1"
|
||||
msgstr "Kan.1"
|
||||
|
||||
msgid "Ch2"
|
||||
msgstr "Kan.2"
|
||||
|
||||
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 "märkimata"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "MHz"
|
||||
|
||||
msgid "free"
|
||||
msgstr "vaba"
|
||||
|
||||
msgid "Mbit/s"
|
||||
msgstr "Mbit/s"
|
||||
|
||||
msgid "kbit/s"
|
||||
msgstr "kbit/s"
|
410
po/fi_FI.po
410
po/fi_FI.po
@ -1,410 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
||||
# This file is distributed under the same license as the femon package.
|
||||
# Rolf Ahrenberg
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2019-10-27 16:29+0200\n"
|
||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
||||
"Last-Translator: Rolf Ahrenberg\n"
|
||||
"Language-Team: Finnish <vdr@linuxtv.org>\n"
|
||||
"Language: fi\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "DVB Signal Information Monitor (OSD)"
|
||||
msgstr "Signaalimittari (OSD)"
|
||||
|
||||
msgid "Signal Information"
|
||||
msgstr "Signaalimittari"
|
||||
|
||||
msgid "Femon not available"
|
||||
msgstr "Signaalimittari ei ole käytettävissä"
|
||||
|
||||
msgid "Video"
|
||||
msgstr "Kuva"
|
||||
|
||||
msgid "AC-3"
|
||||
msgstr "AC-3"
|
||||
|
||||
msgid "Audio"
|
||||
msgstr "Ääni"
|
||||
|
||||
msgid "Transponder Information"
|
||||
msgstr "Transponderin tiedot"
|
||||
|
||||
msgid "Apid"
|
||||
msgstr "Ääni-PID"
|
||||
|
||||
msgid "Dpid"
|
||||
msgstr "Dolby-PID"
|
||||
|
||||
msgid "Spid"
|
||||
msgstr "Tekstitys-PID"
|
||||
|
||||
msgid "Nid"
|
||||
msgstr "Verkko-ID"
|
||||
|
||||
msgid "Tid"
|
||||
msgstr "TS-ID"
|
||||
|
||||
msgid "Rid"
|
||||
msgstr "Radio-ID"
|
||||
|
||||
msgid "Coderate"
|
||||
msgstr "Suojaustaso"
|
||||
|
||||
msgid "Protocol"
|
||||
msgstr "Protokolla"
|
||||
|
||||
msgid "Bitrate"
|
||||
msgstr "Bittinopeus"
|
||||
|
||||
msgid "Stream Information"
|
||||
msgstr "Lähetteen tiedot"
|
||||
|
||||
msgid "Video Stream"
|
||||
msgstr "Kuvaraita"
|
||||
|
||||
msgid "Codec"
|
||||
msgstr "Koodekki"
|
||||
|
||||
msgid "Aspect Ratio"
|
||||
msgstr "Kuvasuhde"
|
||||
|
||||
msgid "Frame Rate"
|
||||
msgstr "Ruudunpäivitystaajuus"
|
||||
|
||||
msgid "Video Format"
|
||||
msgstr "Kuvaformaatti"
|
||||
|
||||
msgid "Resolution"
|
||||
msgstr "Resoluutio"
|
||||
|
||||
msgid "Audio Stream"
|
||||
msgstr "Ääniraita"
|
||||
|
||||
msgid "Channel Mode"
|
||||
msgstr "Kanavatila"
|
||||
|
||||
msgid "Sampling Frequency"
|
||||
msgstr "Näytteenottotaajuus"
|
||||
|
||||
msgid "AC-3 Stream"
|
||||
msgstr "AC-3-ääniraita"
|
||||
|
||||
msgid "Bit Stream Mode"
|
||||
msgstr "Lähetteen tyyppi"
|
||||
|
||||
msgid "Audio Coding Mode"
|
||||
msgstr "Äänikoodaus"
|
||||
|
||||
msgid "Center Mix Level"
|
||||
msgstr "Keskikanavan taso"
|
||||
|
||||
msgid "Surround Mix Level"
|
||||
msgstr "Tehostekanavien taso"
|
||||
|
||||
msgid "Dolby Surround Mode"
|
||||
msgstr "Dolby Surround -tehoste"
|
||||
|
||||
msgid "Low Frequency Effects"
|
||||
msgstr "LFE-kanava"
|
||||
|
||||
msgid "Dialogue Normalization"
|
||||
msgstr "Dialogin normalisointi"
|
||||
|
||||
msgid "basic"
|
||||
msgstr "perus"
|
||||
|
||||
msgid "transponder"
|
||||
msgstr "transponderi"
|
||||
|
||||
msgid "stream"
|
||||
msgstr "lähete"
|
||||
|
||||
msgid "dBm"
|
||||
msgstr "dBm"
|
||||
|
||||
msgid "dBuV"
|
||||
msgstr "dBuV"
|
||||
|
||||
msgid "dBV"
|
||||
msgstr "dBV"
|
||||
|
||||
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 "Piilota valinta päävalikosta"
|
||||
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr "Määrittele, näytetäänkö laajennoksen valinta päävalikossa."
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "Oletusnäyttötila"
|
||||
|
||||
msgid "Define the default display mode at startup."
|
||||
msgstr "Määrittele käytettävä näyttötila käynnistettäessä."
|
||||
|
||||
msgid "Define the used OSD skin."
|
||||
msgstr "Määrittele käytettävä ulkoasu näytölle."
|
||||
|
||||
msgid "Define the used OSD theme."
|
||||
msgstr "Määrittele käytettävä väriteema näytölle."
|
||||
|
||||
msgid "Position"
|
||||
msgstr "Sijainti"
|
||||
|
||||
msgid "Define the position of OSD."
|
||||
msgstr "Määrittele näytön sijainti."
|
||||
|
||||
msgid "Downscale OSD size [%]"
|
||||
msgstr "Pienennä näytön kokoa [%]"
|
||||
|
||||
msgid "Define the downscale ratio for OSD size."
|
||||
msgstr "Määrittele näytön pienennyssuhde."
|
||||
|
||||
msgid "Signal level unit"
|
||||
msgstr "Signaalitason yksikkö"
|
||||
|
||||
msgid "Define the used signal level unit."
|
||||
msgstr "Määrittele yksikkö signaalin tasolle."
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "Punaisen taso [%]"
|
||||
|
||||
msgid "Define a limit for red bar, which is used to indicate a bad signal."
|
||||
msgstr "Määrittele taso punaiselle palkille, jota käytetään huonon signaalin ilmaisimena."
|
||||
|
||||
msgid "Green limit [%]"
|
||||
msgstr "Vihreän taso [%]"
|
||||
|
||||
msgid "Define a limit for green bar, which is used to indicate a good signal."
|
||||
msgstr "Määrittele taso vihreälle palkille, jota käytetään hyvän signaalin ilmaisimena."
|
||||
|
||||
msgid "OSD update interval [0.1s]"
|
||||
msgstr "Näytön päivitysväli [0.1s]"
|
||||
|
||||
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
|
||||
msgstr "Määrittele näytönvirkistystaajuus. Mitä pienempi arvo, sitä suurempi CPU-kuorma."
|
||||
|
||||
msgid "Analyze stream"
|
||||
msgstr "Lähetteen analysointi"
|
||||
|
||||
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
|
||||
msgstr "Määrittele, analysoidaanko DVB-lähetettä ja lasketaanko bittinopeuksia."
|
||||
|
||||
msgid "Calculation interval [0.1s]"
|
||||
msgstr "Laskennan päivitysväli [0.1s]"
|
||||
|
||||
msgid "Define an interval for calculation. The bigger interval generates more stable values."
|
||||
msgstr "Määrittele laskentaikkunan koko. Mitä suurempi laskentaikkuna, sitä todenmukaisemmat lopputulokset."
|
||||
|
||||
msgid "Use SVDRP service"
|
||||
msgstr "Käytä SVDRP-palvelua"
|
||||
|
||||
msgid "Define whether the SVDRP service is used in client/server setups."
|
||||
msgstr "Määrittele käytetäänkö SVDRP-palvelua asiakas/palvelin-kokoonpanoissa."
|
||||
|
||||
msgid "SVDRP service port"
|
||||
msgstr "SVDRP-palvelun portti"
|
||||
|
||||
msgid "Define the port number of SVDRP service."
|
||||
msgstr "Määrittele SVDRP-palvelun käyttämä portti."
|
||||
|
||||
msgid "SVDRP service IP"
|
||||
msgstr "SVDRP-palvelun IP-osoite"
|
||||
|
||||
msgid "Define the IP address of SVDRP service."
|
||||
msgstr "Määrittele SVDRP-palvelun käyttämä IP-osoite."
|
||||
|
||||
msgid "Help"
|
||||
msgstr "Opaste"
|
||||
|
||||
msgid "Fixed"
|
||||
msgstr "kiinteä"
|
||||
|
||||
msgid "Analog"
|
||||
msgstr "analoginen"
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr "MPEG-2"
|
||||
|
||||
msgid "H.264"
|
||||
msgstr "H.264"
|
||||
|
||||
msgid "H.265"
|
||||
msgstr "H.265"
|
||||
|
||||
msgid "MPEG-1 Layer I"
|
||||
msgstr "MPEG-1 kerros I"
|
||||
|
||||
msgid "MPEG-1 Layer II"
|
||||
msgstr "MPEG-1 kerros II"
|
||||
|
||||
msgid "MPEG-1 Layer III"
|
||||
msgstr "MPEG-1 kerros III"
|
||||
|
||||
msgid "MPEG-2 Layer I"
|
||||
msgstr "MPEG-2 kerros I"
|
||||
|
||||
msgid "MPEG-2 Layer II"
|
||||
msgstr "MPEG-2 kerros II"
|
||||
|
||||
msgid "MPEG-2 Layer III"
|
||||
msgstr "MPEG-2 kerros III"
|
||||
|
||||
msgid "HE-AAC"
|
||||
msgstr "HE-AAC"
|
||||
|
||||
msgid "LATM"
|
||||
msgstr "LATM"
|
||||
|
||||
msgid "stereo"
|
||||
msgstr "stereo"
|
||||
|
||||
msgid "joint Stereo"
|
||||
msgstr "joint-stereo"
|
||||
|
||||
msgid "dual"
|
||||
msgstr "kaksikanavainen"
|
||||
|
||||
msgid "mono"
|
||||
msgstr "mono"
|
||||
|
||||
msgid "interlaced"
|
||||
msgstr "lomiteltu"
|
||||
|
||||
msgid "progressive"
|
||||
msgstr "lomittelematon"
|
||||
|
||||
msgid "reserved"
|
||||
msgstr "varattu"
|
||||
|
||||
msgid "extended"
|
||||
msgstr "laajennettu"
|
||||
|
||||
msgid "unknown"
|
||||
msgstr "tuntematon"
|
||||
|
||||
msgid "component"
|
||||
msgstr "komponentti"
|
||||
|
||||
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 "Pääasiallinen (CM)"
|
||||
|
||||
msgid "Music and Effects (ME)"
|
||||
msgstr "Musiikki ja tehosteet (ME)"
|
||||
|
||||
msgid "Visually Impaired (VI)"
|
||||
msgstr "Näkörajoitteinen (VI)"
|
||||
|
||||
msgid "Hearing Impaired (HI)"
|
||||
msgstr "Kuulorajoitteinen (HI)"
|
||||
|
||||
msgid "Dialogue (D)"
|
||||
msgstr "Vuoropuhelu (D)"
|
||||
|
||||
msgid "Commentary (C)"
|
||||
msgstr "Kommentointi (C)"
|
||||
|
||||
msgid "Emergency (E)"
|
||||
msgstr "Hätätiedote (E)"
|
||||
|
||||
msgid "Voice Over (VO)"
|
||||
msgstr "Päälle puhuttu (VO)"
|
||||
|
||||
msgid "Karaoke"
|
||||
msgstr "Karaoke"
|
||||
|
||||
msgid "Ch1"
|
||||
msgstr "kan. 1"
|
||||
|
||||
msgid "Ch2"
|
||||
msgstr "kan. 2"
|
||||
|
||||
msgid "C"
|
||||
msgstr "K"
|
||||
|
||||
msgid "L"
|
||||
msgstr "V"
|
||||
|
||||
msgid "R"
|
||||
msgstr "O"
|
||||
|
||||
msgid "S"
|
||||
msgstr "T"
|
||||
|
||||
msgid "SL"
|
||||
msgstr "TV"
|
||||
|
||||
msgid "SR"
|
||||
msgstr "TO"
|
||||
|
||||
msgid "dB"
|
||||
msgstr "dB"
|
||||
|
||||
msgid "not indicated"
|
||||
msgstr "ei ilmaistu"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "MHz"
|
||||
|
||||
msgid "free"
|
||||
msgstr "vapaa"
|
||||
|
||||
msgid "Mbit/s"
|
||||
msgstr "Mbit/s"
|
||||
|
||||
msgid "kbit/s"
|
||||
msgstr "kbit/s"
|
||||
|
||||
#~ msgid "Clasxsic"
|
||||
#~ msgstr "Klassinen"
|
409
po/fr_FR.po
409
po/fr_FR.po
@ -1,409 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
||||
# This file is distributed under the same license as the femon package.
|
||||
# Nicolas Huillard
|
||||
# Michaël Nival <mnival@club-internet.fr>, 2010
|
||||
# Bernard Jaulin <bernard.jaulin@gmail.com>, 2013
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
||||
"Last-Translator: Bernard Jaulin <bernard.jaulin@gmail.com>\n"
|
||||
"Language-Team: French <vdr@linuxtv.org>\n"
|
||||
"Language: fr\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "DVB Signal Information Monitor (OSD)"
|
||||
msgstr "Moniteur sur le signal DVB"
|
||||
|
||||
msgid "Signal Information"
|
||||
msgstr "Infos sur le signal DVB"
|
||||
|
||||
msgid "Femon not available"
|
||||
msgstr "Femon n'est pas disponible"
|
||||
|
||||
msgid "Video"
|
||||
msgstr "Vidéo"
|
||||
|
||||
msgid "AC-3"
|
||||
msgstr "AC-3"
|
||||
|
||||
msgid "Audio"
|
||||
msgstr "Audio"
|
||||
|
||||
msgid "Transponder Information"
|
||||
msgstr "Information du transpondeur"
|
||||
|
||||
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 "Protocole"
|
||||
|
||||
msgid "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"
|
||||
msgstr "Format de l'image"
|
||||
|
||||
msgid "Frame Rate"
|
||||
msgstr "Rafraîchissement"
|
||||
|
||||
msgid "Video Format"
|
||||
msgstr "Standard vidéo"
|
||||
|
||||
msgid "Resolution"
|
||||
msgstr "Résolution"
|
||||
|
||||
msgid "Audio Stream"
|
||||
msgstr "Flux audio"
|
||||
|
||||
msgid "Channel Mode"
|
||||
msgstr "Mode chaîne"
|
||||
|
||||
msgid "Sampling Frequency"
|
||||
msgstr "Fréquence d'échantillonage"
|
||||
|
||||
msgid "AC-3 Stream"
|
||||
msgstr "Flux AC-3"
|
||||
|
||||
msgid "Bit Stream Mode"
|
||||
msgstr "Mode bitstream"
|
||||
|
||||
msgid "Audio Coding Mode"
|
||||
msgstr "Mode de codage audio"
|
||||
|
||||
msgid "Center Mix Level"
|
||||
msgstr "Niveau sonore milieu"
|
||||
|
||||
msgid "Surround Mix Level"
|
||||
msgstr "Niveau sonore surround"
|
||||
|
||||
msgid "Dolby Surround Mode"
|
||||
msgstr "Mode Dolby Surround"
|
||||
|
||||
msgid "Low Frequency Effects"
|
||||
msgstr "Effets de basses"
|
||||
|
||||
msgid "Dialogue Normalization"
|
||||
msgstr "Normalisation des dialogues"
|
||||
|
||||
msgid "basic"
|
||||
msgstr "basique"
|
||||
|
||||
msgid "transponder"
|
||||
msgstr "transpondeur"
|
||||
|
||||
msgid "stream"
|
||||
msgstr "flux"
|
||||
|
||||
msgid "dBm"
|
||||
msgstr "dBm"
|
||||
|
||||
msgid "dBuV"
|
||||
msgstr "dBuV"
|
||||
|
||||
msgid "dBV"
|
||||
msgstr "dBV"
|
||||
|
||||
msgid "Classic"
|
||||
msgstr "Classique"
|
||||
|
||||
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 "Masquer dans le menu principal"
|
||||
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr "Définit si l'entrée doit être masquée dans le menu principal."
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "Affichage par défaut"
|
||||
|
||||
msgid "Define the default display mode at startup."
|
||||
msgstr "Définit l'affichage par défaut au démarrage."
|
||||
|
||||
msgid "Define the used OSD skin."
|
||||
msgstr "Définit le skin OSD à utiliser."
|
||||
|
||||
msgid "Define the used OSD theme."
|
||||
msgstr "Définit le thème OSD à utiliser."
|
||||
|
||||
msgid "Position"
|
||||
msgstr "Position"
|
||||
|
||||
msgid "Define the position of OSD."
|
||||
msgstr "Définit la position de l'OSD."
|
||||
|
||||
msgid "Downscale OSD size [%]"
|
||||
msgstr "Réduit la taille de l'OSD (%)"
|
||||
|
||||
msgid "Define the downscale ratio for OSD size."
|
||||
msgstr "Définit le ration de réduction de l'OSD."
|
||||
|
||||
msgid "Signal level unit"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the used signal level unit."
|
||||
msgstr ""
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "Limite du rouge (%)"
|
||||
|
||||
msgid "Define a limit for red bar, which is used to indicate a bad signal."
|
||||
msgstr "Définit la limite de la barre rouge, qui est utilisé pour indiquer un mauvais signal."
|
||||
|
||||
msgid "Green limit [%]"
|
||||
msgstr "Limite du vert (%)"
|
||||
|
||||
msgid "Define a limit for green bar, which is used to indicate a good signal."
|
||||
msgstr "Définit la limite de la barre rouge, qui est utilisé pour indiquer un bon signal."
|
||||
|
||||
msgid "OSD update interval [0.1s]"
|
||||
msgstr "Intervalle de mise à jour (0,1s)"
|
||||
|
||||
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
|
||||
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"
|
||||
msgstr "Analyser le flux"
|
||||
|
||||
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
|
||||
msgstr "Définit si le flux DVB est analysé et le taux d'échantillonnage fixe calculé."
|
||||
|
||||
msgid "Calculation interval [0.1s]"
|
||||
msgstr "Intervalle de calcul (0,1s)"
|
||||
|
||||
msgid "Define an interval for calculation. The bigger interval generates more stable values."
|
||||
msgstr "Définit l'intervalle de cacul. Un plus grand intervalle génère une valeur plus stable."
|
||||
|
||||
msgid "Use SVDRP service"
|
||||
msgstr "Utiliser le service SVDRP"
|
||||
|
||||
msgid "Define whether the SVDRP service is used in client/server setups."
|
||||
msgstr "Définit si le service SVDRP est utilisé dans la configuration client/serveur."
|
||||
|
||||
msgid "SVDRP service port"
|
||||
msgstr "Port du service SVDRP"
|
||||
|
||||
msgid "Define the port number of SVDRP service."
|
||||
msgstr "Définit le port d'écoute du service SVDRP."
|
||||
|
||||
msgid "SVDRP service IP"
|
||||
msgstr "IP du service SVDRP"
|
||||
|
||||
msgid "Define the IP address of SVDRP service."
|
||||
msgstr "Définit l'adresse IP du service SVDRP."
|
||||
|
||||
msgid "Help"
|
||||
msgstr "Aide"
|
||||
|
||||
msgid "Fixed"
|
||||
msgstr "Fixe"
|
||||
|
||||
msgid "Analog"
|
||||
msgstr "Analogique"
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr "MPEG-2"
|
||||
|
||||
msgid "H.264"
|
||||
msgstr "H.264"
|
||||
|
||||
msgid "H.265"
|
||||
msgstr "H.265"
|
||||
|
||||
msgid "MPEG-1 Layer I"
|
||||
msgstr "MPEG-1 Layer I"
|
||||
|
||||
msgid "MPEG-1 Layer II"
|
||||
msgstr "MPEG-1 Layer II"
|
||||
|
||||
msgid "MPEG-1 Layer III"
|
||||
msgstr "MPEG-1 Layer III"
|
||||
|
||||
msgid "MPEG-2 Layer I"
|
||||
msgstr "MPEG-2 Layer I"
|
||||
|
||||
msgid "MPEG-2 Layer II"
|
||||
msgstr "MPEG-2 Layer II"
|
||||
|
||||
msgid "MPEG-2 Layer III"
|
||||
msgstr "MPEG-2 Layer III"
|
||||
|
||||
msgid "HE-AAC"
|
||||
msgstr "HE-AAC"
|
||||
|
||||
msgid "LATM"
|
||||
msgstr "LATM"
|
||||
|
||||
msgid "stereo"
|
||||
msgstr "stéréo"
|
||||
|
||||
msgid "joint Stereo"
|
||||
msgstr "joint Stereo"
|
||||
|
||||
msgid "dual"
|
||||
msgstr "double"
|
||||
|
||||
msgid "mono"
|
||||
msgstr "mono"
|
||||
|
||||
msgid "interlaced"
|
||||
msgstr "entrelacé"
|
||||
|
||||
msgid "progressive"
|
||||
msgstr "progressif"
|
||||
|
||||
msgid "reserved"
|
||||
msgstr "réservé"
|
||||
|
||||
msgid "extended"
|
||||
msgstr "étendu"
|
||||
|
||||
msgid "unknown"
|
||||
msgstr "inconnu"
|
||||
|
||||
msgid "component"
|
||||
msgstr "composant"
|
||||
|
||||
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 "Principal (CM)"
|
||||
|
||||
msgid "Music and Effects (ME)"
|
||||
msgstr "Musique et effets (ME)"
|
||||
|
||||
msgid "Visually Impaired (VI)"
|
||||
msgstr "Malvoyants (VI)"
|
||||
|
||||
msgid "Hearing Impaired (HI)"
|
||||
msgstr "Malentendants (HI)"
|
||||
|
||||
msgid "Dialogue (D)"
|
||||
msgstr "Dialogue (D)"
|
||||
|
||||
msgid "Commentary (C)"
|
||||
msgstr "Commentaires (C)"
|
||||
|
||||
msgid "Emergency (E)"
|
||||
msgstr "Urgence (E)"
|
||||
|
||||
msgid "Voice Over (VO)"
|
||||
msgstr "Voix off (VO)"
|
||||
|
||||
msgid "Karaoke"
|
||||
msgstr "Karaoke"
|
||||
|
||||
msgid "Ch1"
|
||||
msgstr "Can. 1"
|
||||
|
||||
msgid "Ch2"
|
||||
msgstr "Can. 2"
|
||||
|
||||
msgid "C"
|
||||
msgstr "Centre"
|
||||
|
||||
msgid "L"
|
||||
msgstr "Gauche"
|
||||
|
||||
msgid "R"
|
||||
msgstr "Droite"
|
||||
|
||||
msgid "S"
|
||||
msgstr "Surround"
|
||||
|
||||
msgid "SL"
|
||||
msgstr "Surround gauche"
|
||||
|
||||
msgid "SR"
|
||||
msgstr "Surround droit"
|
||||
|
||||
msgid "dB"
|
||||
msgstr "dB"
|
||||
|
||||
msgid "not indicated"
|
||||
msgstr "non indiqué"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "MHz"
|
||||
|
||||
msgid "free"
|
||||
msgstr "libre"
|
||||
|
||||
msgid "Mbit/s"
|
||||
msgstr "Mbit/s"
|
||||
|
||||
msgid "kbit/s"
|
||||
msgstr "kbit/s"
|
410
po/hu_HU.po
410
po/hu_HU.po
@ -1,410 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
||||
# This file is distributed under the same license as the femon package.
|
||||
# Füley István <ifuley at tigercomp dot ro>, 2011
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
||||
"Last-Translator: Füley Istvá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áció"
|
||||
|
||||
msgid "Femon not available"
|
||||
msgstr "Femon nem elérhetõ"
|
||||
|
||||
msgid "Video"
|
||||
msgstr "Video"
|
||||
|
||||
msgid "AC-3"
|
||||
msgstr "AC-3"
|
||||
|
||||
msgid "Audio"
|
||||
msgstr "Audio"
|
||||
|
||||
msgid "Transponder Information"
|
||||
msgstr "Transponder infó"
|
||||
|
||||
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áta"
|
||||
|
||||
msgid "Stream Information"
|
||||
msgstr "Adatfolyam infó"
|
||||
|
||||
msgid "Video Stream"
|
||||
msgstr "Videó adatfolyam"
|
||||
|
||||
msgid "Codec"
|
||||
msgstr "Kodek"
|
||||
|
||||
msgid "Aspect Ratio"
|
||||
msgstr "Méretarány"
|
||||
|
||||
msgid "Frame Rate"
|
||||
msgstr "Képfrissítés"
|
||||
|
||||
msgid "Video Format"
|
||||
msgstr "Videó formátum"
|
||||
|
||||
msgid "Resolution"
|
||||
msgstr "Felbontás"
|
||||
|
||||
msgid "Audio Stream"
|
||||
msgstr "Hang adatfolyam"
|
||||
|
||||
msgid "Channel Mode"
|
||||
msgstr "Hangsáv mód"
|
||||
|
||||
msgid "Sampling Frequency"
|
||||
msgstr "Mintavételezé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ási mód"
|
||||
|
||||
msgid "Center Mix Level"
|
||||
msgstr "Középcsatorna keverési jelszintje"
|
||||
|
||||
msgid "Surround Mix Level"
|
||||
msgstr "Térhatás csatorna keverési szintje"
|
||||
|
||||
msgid "Dolby Surround Mode"
|
||||
msgstr "Dolby Surround mód"
|
||||
|
||||
msgid "Low Frequency Effects"
|
||||
msgstr "LFE - alacsony frekvenciás effektek"
|
||||
|
||||
msgid "Dialogue Normalization"
|
||||
msgstr "Párbeszéd jelszint normalizálása"
|
||||
|
||||
msgid "basic"
|
||||
msgstr "alap"
|
||||
|
||||
msgid "transponder"
|
||||
msgstr "transponder"
|
||||
|
||||
msgid "stream"
|
||||
msgstr "adatfolyam (stream)"
|
||||
|
||||
msgid "dBm"
|
||||
msgstr "dBm"
|
||||
|
||||
msgid "dBuV"
|
||||
msgstr "dBuV"
|
||||
|
||||
msgid "dBV"
|
||||
msgstr "dBV"
|
||||
|
||||
msgid "Classic"
|
||||
msgstr "Klasszikus"
|
||||
|
||||
msgid "Elchi"
|
||||
msgstr "Elchi"
|
||||
|
||||
msgid "ST:TNG"
|
||||
msgstr "ST:TNG"
|
||||
|
||||
msgid "DeepBlue"
|
||||
msgstr "Sötétkék"
|
||||
|
||||
msgid "Moronimo"
|
||||
msgstr "Moronimo"
|
||||
|
||||
msgid "Enigma"
|
||||
msgstr "Enigma"
|
||||
|
||||
msgid "EgalsTry"
|
||||
msgstr "EgalsTry"
|
||||
|
||||
msgid "Duotone"
|
||||
msgstr "Kétszínû (duotone)"
|
||||
|
||||
msgid "SilverGreen"
|
||||
msgstr "Ezüst-zöld"
|
||||
|
||||
msgid "PearlHD"
|
||||
msgstr "PearlHD"
|
||||
|
||||
msgid "Hide main menu entry"
|
||||
msgstr "Menübejegyzés elrejtése"
|
||||
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr "Meghatározza, hogy megjelenjen-e a fõmenüben."
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "Alapértelmezett megjelenítési mód"
|
||||
|
||||
msgid "Define the default display mode at startup."
|
||||
msgstr "Bekapcsoláskor melyik megjelenítési móddal induljon."
|
||||
|
||||
msgid "Define the used OSD skin."
|
||||
msgstr "Az OSD bõr kiválasztása."
|
||||
|
||||
msgid "Define the used OSD theme."
|
||||
msgstr "Az OSD téma kiválasztása."
|
||||
|
||||
msgid "Position"
|
||||
msgstr "Elhelyezés"
|
||||
|
||||
msgid "Define the position of OSD."
|
||||
msgstr "A képernyõelhelyezés kiválasztása"
|
||||
|
||||
msgid "Downscale OSD size [%]"
|
||||
msgstr "Az OSD leméretezése [%]"
|
||||
|
||||
msgid "Define the downscale ratio for OSD size."
|
||||
msgstr "Az OSD méretének leméretezése százalékban."
|
||||
|
||||
msgid "Signal level unit"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the used signal level unit."
|
||||
msgstr ""
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "Piros színt határa [%]"
|
||||
|
||||
msgid "Define a limit for red bar, which is used to indicate a bad signal."
|
||||
msgstr "A piros sáv határának beállítása, ezt használjuk a nem elégséges jelszint kijelzéséhez."
|
||||
|
||||
msgid "Green limit [%]"
|
||||
msgstr "Zöld színt határa [%]"
|
||||
|
||||
msgid "Define a limit for green bar, which is used to indicate a good signal."
|
||||
msgstr "A zöld sáv határának beállítása, ezt használjuk az elégséges jelszint kijelzéséhez."
|
||||
|
||||
msgid "OSD update interval [0.1s]"
|
||||
msgstr "OSD frissítésének gyakorisága [0.1mp]"
|
||||
|
||||
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
|
||||
msgstr "Meghatározza, hogy milyen gyakran legyen frissítve az OSD. Kisebb intervallum nagyobb CPU terhelést eredményez."
|
||||
|
||||
msgid "Analyze stream"
|
||||
msgstr "Adatfolyam (stream) elemzése."
|
||||
|
||||
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
|
||||
msgstr "Meghatározza, hogy a DVB adatfolyam elemzésre kerüljön-e, és számolódjon-e bitráta."
|
||||
|
||||
msgid "Calculation interval [0.1s]"
|
||||
msgstr "Számítás gyakorisága [0.1mp]"
|
||||
|
||||
msgid "Define an interval for calculation. The bigger interval generates more stable values."
|
||||
msgstr "Meghatározza, hogy milyen gyakran történjen számítás. Nagyobb intervallum pontosabb értékeket eredményez."
|
||||
|
||||
msgid "Use SVDRP service"
|
||||
msgstr "SVDRP szolgáltatás használata."
|
||||
|
||||
msgid "Define whether the SVDRP service is used in client/server setups."
|
||||
msgstr "Ki-bekapcsolja az SVDRP szolgáltatást, amely kliens-szerver környezetben használatos."
|
||||
|
||||
msgid "SVDRP service port"
|
||||
msgstr "Az SVDRP szolgáltatás portja"
|
||||
|
||||
msgid "Define the port number of SVDRP service."
|
||||
msgstr "Meghatározza, hogy melyik porton fut az SVDRP."
|
||||
|
||||
msgid "SVDRP service IP"
|
||||
msgstr "Az SVDRP szolgáltatás IP-je"
|
||||
|
||||
msgid "Define the IP address of SVDRP service."
|
||||
msgstr "Meghatározza, hogy milyen IP címen fut az SVDRP szolgáltatás."
|
||||
|
||||
msgid "Help"
|
||||
msgstr "Segítség"
|
||||
|
||||
msgid "Fixed"
|
||||
msgstr "Állandó"
|
||||
|
||||
msgid "Analog"
|
||||
msgstr "analog"
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr "MPEG-2"
|
||||
|
||||
msgid "H.264"
|
||||
msgstr "H.264"
|
||||
|
||||
msgid "H.265"
|
||||
msgstr "H.265"
|
||||
|
||||
msgid "MPEG-1 Layer I"
|
||||
msgstr "MPEG-1 Layer I"
|
||||
|
||||
msgid "MPEG-1 Layer II"
|
||||
msgstr "MPEG-1 Layer II"
|
||||
|
||||
msgid "MPEG-1 Layer III"
|
||||
msgstr "MPEG-1 Layer III"
|
||||
|
||||
msgid "MPEG-2 Layer I"
|
||||
msgstr "MPEG-2 Layer I"
|
||||
|
||||
msgid "MPEG-2 Layer II"
|
||||
msgstr "MPEG-2 Layer II"
|
||||
|
||||
msgid "MPEG-2 Layer III"
|
||||
msgstr "MPEG-2 Layer III"
|
||||
|
||||
msgid "HE-AAC"
|
||||
msgstr "HE-AAC"
|
||||
|
||||
msgid "LATM"
|
||||
msgstr "LATM"
|
||||
|
||||
msgid "stereo"
|
||||
msgstr "sztereó"
|
||||
|
||||
msgid "joint Stereo"
|
||||
msgstr "joint sztereó"
|
||||
|
||||
msgid "dual"
|
||||
msgstr "duál"
|
||||
|
||||
msgid "mono"
|
||||
msgstr "monó"
|
||||
|
||||
msgid "interlaced"
|
||||
msgstr "váltottsávos"
|
||||
|
||||
msgid "progressive"
|
||||
msgstr "progresszí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 és effektek (ME)"
|
||||
|
||||
msgid "Visually Impaired (VI)"
|
||||
msgstr "Látáskárosultak (VI)"
|
||||
|
||||
msgid "Hearing Impaired (HI)"
|
||||
msgstr "Halláskárosultak (HI)"
|
||||
|
||||
msgid "Dialogue (D)"
|
||||
msgstr "Párbeszéd (D)"
|
||||
|
||||
msgid "Commentary (C)"
|
||||
msgstr "Narráció (C)"
|
||||
|
||||
msgid "Emergency (E)"
|
||||
msgstr "Sürgõsségi (E)"
|
||||
|
||||
msgid "Voice Over (VO)"
|
||||
msgstr "Rábeszélé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üntetve"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "MHz"
|
||||
|
||||
msgid "free"
|
||||
msgstr "szabad"
|
||||
|
||||
msgid "Mbit/s"
|
||||
msgstr "Mbit/s"
|
||||
|
||||
msgid "kbit/s"
|
||||
msgstr "kbit/s"
|
411
po/it_IT.po
411
po/it_IT.po
@ -1,411 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
||||
# This file is distributed under the same license as the femon package.
|
||||
# Sean Carlos
|
||||
# Diego Pierotto <vdr-italian@tiscali.it>
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
||||
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
|
||||
"Language-Team: Italian <vdr@linuxtv.org>\n"
|
||||
"Language: it\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Poedit-Language: Italian\n"
|
||||
"X-Poedit-Country: ITALY\n"
|
||||
"X-Poedit-SourceCharset: utf-8\n"
|
||||
|
||||
msgid "DVB Signal Information Monitor (OSD)"
|
||||
msgstr "Mostra info segnale DVB (OSD)"
|
||||
|
||||
msgid "Signal Information"
|
||||
msgstr "Info segnale"
|
||||
|
||||
msgid "Femon not available"
|
||||
msgstr "Femon non disponibile"
|
||||
|
||||
msgid "Video"
|
||||
msgstr "Video"
|
||||
|
||||
msgid "AC-3"
|
||||
msgstr "AC-3"
|
||||
|
||||
msgid "Audio"
|
||||
msgstr "Audio"
|
||||
|
||||
msgid "Transponder Information"
|
||||
msgstr "Informazioni transponder"
|
||||
|
||||
msgid "Apid"
|
||||
msgstr "PID Audio"
|
||||
|
||||
msgid "Dpid"
|
||||
msgstr "PID AC3"
|
||||
|
||||
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 "Bitrate"
|
||||
|
||||
msgid "Stream Information"
|
||||
msgstr "Informazioni flusso"
|
||||
|
||||
msgid "Video Stream"
|
||||
msgstr "Flusso video"
|
||||
|
||||
msgid "Codec"
|
||||
msgstr "Codifica"
|
||||
|
||||
msgid "Aspect Ratio"
|
||||
msgstr "Formato immagine"
|
||||
|
||||
msgid "Frame Rate"
|
||||
msgstr "Frame rate"
|
||||
|
||||
msgid "Video Format"
|
||||
msgstr "Formato video"
|
||||
|
||||
msgid "Resolution"
|
||||
msgstr "Risoluzione"
|
||||
|
||||
msgid "Audio Stream"
|
||||
msgstr "Flusso audio"
|
||||
|
||||
msgid "Channel Mode"
|
||||
msgstr "Modalità canale"
|
||||
|
||||
msgid "Sampling Frequency"
|
||||
msgstr "Frequenza campionamento"
|
||||
|
||||
msgid "AC-3 Stream"
|
||||
msgstr "Flusso AC-3"
|
||||
|
||||
msgid "Bit Stream Mode"
|
||||
msgstr "Modalità bitstream"
|
||||
|
||||
msgid "Audio Coding Mode"
|
||||
msgstr "Modalità codifica audio"
|
||||
|
||||
msgid "Center Mix Level"
|
||||
msgstr "Livello sonoro centrale"
|
||||
|
||||
msgid "Surround Mix Level"
|
||||
msgstr "Livello sonoro surround"
|
||||
|
||||
msgid "Dolby Surround Mode"
|
||||
msgstr "Modalità Dolby Surround"
|
||||
|
||||
msgid "Low Frequency Effects"
|
||||
msgstr "Effetti bassa frequenza"
|
||||
|
||||
msgid "Dialogue Normalization"
|
||||
msgstr "Normalizzazione dialoghi"
|
||||
|
||||
msgid "basic"
|
||||
msgstr "base"
|
||||
|
||||
msgid "transponder"
|
||||
msgstr "transponder"
|
||||
|
||||
msgid "stream"
|
||||
msgstr "flusso"
|
||||
|
||||
msgid "dBm"
|
||||
msgstr "dBm"
|
||||
|
||||
msgid "dBuV"
|
||||
msgstr "dBuV"
|
||||
|
||||
msgid "dBV"
|
||||
msgstr "dBV"
|
||||
|
||||
msgid "Classic"
|
||||
msgstr "Classico"
|
||||
|
||||
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 "Nascondi voce menu principale"
|
||||
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr "Definisci se la voce del menu principale è nascosta."
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "Modalità visualizz. predefinita"
|
||||
|
||||
msgid "Define the default display mode at startup."
|
||||
msgstr "Definisci la modalità di visualizz. predefinita all'avvio."
|
||||
|
||||
msgid "Define the used OSD skin."
|
||||
msgstr "Definisci lo stile interfaccia OSD utilizzato."
|
||||
|
||||
msgid "Define the used OSD theme."
|
||||
msgstr "Definisci il tema OSD utilizzato."
|
||||
|
||||
msgid "Position"
|
||||
msgstr "Posizione"
|
||||
|
||||
msgid "Define the position of OSD."
|
||||
msgstr "Definisci la posizione dell'OSD."
|
||||
|
||||
msgid "Downscale OSD size [%]"
|
||||
msgstr "Riduci dimensione OSD [%]"
|
||||
|
||||
msgid "Define the downscale ratio for OSD size."
|
||||
msgstr "Definisci il rapporto di riduzione della dimensione OSD."
|
||||
|
||||
msgid "Signal level unit"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the used signal level unit."
|
||||
msgstr ""
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "Limite rosso [%]"
|
||||
|
||||
msgid "Define a limit for red bar, which is used to indicate a bad signal."
|
||||
msgstr "Definisci un limite per la barra rossa, usata per indicare un cattivo segnale."
|
||||
|
||||
msgid "Green limit [%]"
|
||||
msgstr "Limite verde [%]"
|
||||
|
||||
msgid "Define a limit for green bar, which is used to indicate a good signal."
|
||||
msgstr "Definisci un limite per la barra verde, usata per indicare un buon segnale."
|
||||
|
||||
msgid "OSD update interval [0.1s]"
|
||||
msgstr "Intervallo agg. OSD [0.1s]"
|
||||
|
||||
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
|
||||
msgstr "Definisci un intervallo per gli agg. OSD. Più piccolo è l'intervallo maggiore sarà l'uso di CPU."
|
||||
|
||||
msgid "Analyze stream"
|
||||
msgstr "Analizza flusso"
|
||||
|
||||
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
|
||||
msgstr "Definisci se il flusso DVB è analizzato e i bitrate calcolati."
|
||||
|
||||
msgid "Calculation interval [0.1s]"
|
||||
msgstr "Intervallo di calcolo [0.1s]"
|
||||
|
||||
msgid "Define an interval for calculation. The bigger interval generates more stable values."
|
||||
msgstr "Definisci un intervallo di calcolo. L'intervallo più grande genera valori più stabili."
|
||||
|
||||
msgid "Use SVDRP service"
|
||||
msgstr "Utilizza servizio SVDRP"
|
||||
|
||||
msgid "Define whether the SVDRP service is used in client/server setups."
|
||||
msgstr "Definisci se il servizio SVDRP viene usato nelle opzioni client/server."
|
||||
|
||||
msgid "SVDRP service port"
|
||||
msgstr "Porta servizio SVDRP"
|
||||
|
||||
msgid "Define the port number of SVDRP service."
|
||||
msgstr "Definisci il numero di porta del servizio SVDRP."
|
||||
|
||||
msgid "SVDRP service IP"
|
||||
msgstr "IP servizio SVDRP"
|
||||
|
||||
msgid "Define the IP address of SVDRP service."
|
||||
msgstr "Definisci l'indirizzo IP del servizio SVDRP."
|
||||
|
||||
msgid "Help"
|
||||
msgstr "Aiuto"
|
||||
|
||||
msgid "Fixed"
|
||||
msgstr "Fisso"
|
||||
|
||||
msgid "Analog"
|
||||
msgstr "Analogico"
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr "MPEG-2"
|
||||
|
||||
msgid "H.264"
|
||||
msgstr "H.264"
|
||||
|
||||
msgid "H.265"
|
||||
msgstr "H.265"
|
||||
|
||||
msgid "MPEG-1 Layer I"
|
||||
msgstr "MPEG-1 Layer I"
|
||||
|
||||
msgid "MPEG-1 Layer II"
|
||||
msgstr "MPEG-1 Layer II"
|
||||
|
||||
msgid "MPEG-1 Layer III"
|
||||
msgstr "MPEG-1 Layer III"
|
||||
|
||||
msgid "MPEG-2 Layer I"
|
||||
msgstr "MPEG-2 Layer I"
|
||||
|
||||
msgid "MPEG-2 Layer II"
|
||||
msgstr "MPEG-2 Layer II"
|
||||
|
||||
msgid "MPEG-2 Layer III"
|
||||
msgstr "MPEG-2 Layer III"
|
||||
|
||||
msgid "HE-AAC"
|
||||
msgstr "HE-AAC"
|
||||
|
||||
msgid "LATM"
|
||||
msgstr "LATM"
|
||||
|
||||
msgid "stereo"
|
||||
msgstr "stereo"
|
||||
|
||||
msgid "joint Stereo"
|
||||
msgstr "joint Stereo"
|
||||
|
||||
msgid "dual"
|
||||
msgstr "dual"
|
||||
|
||||
msgid "mono"
|
||||
msgstr "mono"
|
||||
|
||||
msgid "interlaced"
|
||||
msgstr "interlacciato"
|
||||
|
||||
msgid "progressive"
|
||||
msgstr "progressivo"
|
||||
|
||||
msgid "reserved"
|
||||
msgstr "riservato"
|
||||
|
||||
msgid "extended"
|
||||
msgstr "esteso"
|
||||
|
||||
msgid "unknown"
|
||||
msgstr "sconosciuto"
|
||||
|
||||
msgid "component"
|
||||
msgstr "componente"
|
||||
|
||||
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 "Principale (P)"
|
||||
|
||||
msgid "Music and Effects (ME)"
|
||||
msgstr "Musica ed effetti (ME)"
|
||||
|
||||
msgid "Visually Impaired (VI)"
|
||||
msgstr "Non vedenti (NV)"
|
||||
|
||||
msgid "Hearing Impaired (HI)"
|
||||
msgstr "Non udenti (NU)"
|
||||
|
||||
msgid "Dialogue (D)"
|
||||
msgstr "Dialogui (D)"
|
||||
|
||||
msgid "Commentary (C)"
|
||||
msgstr "Commenti (C)"
|
||||
|
||||
msgid "Emergency (E)"
|
||||
msgstr "Emergenza (E)"
|
||||
|
||||
msgid "Voice Over (VO)"
|
||||
msgstr "Voce su (VS)"
|
||||
|
||||
msgid "Karaoke"
|
||||
msgstr "Karaoke"
|
||||
|
||||
msgid "Ch1"
|
||||
msgstr "Can. 1"
|
||||
|
||||
msgid "Ch2"
|
||||
msgstr "Can. 2"
|
||||
|
||||
msgid "C"
|
||||
msgstr "C"
|
||||
|
||||
msgid "L"
|
||||
msgstr "S"
|
||||
|
||||
msgid "R"
|
||||
msgstr "D"
|
||||
|
||||
msgid "S"
|
||||
msgstr "S"
|
||||
|
||||
msgid "SL"
|
||||
msgstr "SS"
|
||||
|
||||
msgid "SR"
|
||||
msgstr "SD"
|
||||
|
||||
msgid "dB"
|
||||
msgstr "dB"
|
||||
|
||||
msgid "not indicated"
|
||||
msgstr "non indicato"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "MHz"
|
||||
|
||||
msgid "free"
|
||||
msgstr "libero"
|
||||
|
||||
msgid "Mbit/s"
|
||||
msgstr "Mbit/s"
|
||||
|
||||
msgid "kbit/s"
|
||||
msgstr "kbit/s"
|
407
po/lt_LT.po
407
po/lt_LT.po
@ -1,407 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
||||
# This file is distributed under the same license as the femon package.
|
||||
# Valdemaras Pipiras
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
||||
"Last-Translator: Valdemaras Pipiras <varas@ambernet.lt>\n"
|
||||
"Language-Team: Lithuanian <vdr@linuxtv.org>\n"
|
||||
"Language: lt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "DVB Signal Information Monitor (OSD)"
|
||||
msgstr "DVB signalo stebėjimas (OSD)"
|
||||
|
||||
msgid "Signal Information"
|
||||
msgstr "Signalo informacija"
|
||||
|
||||
msgid "Femon not available"
|
||||
msgstr "Femon įskiepas nepasiekiamas"
|
||||
|
||||
msgid "Video"
|
||||
msgstr "Video"
|
||||
|
||||
msgid "AC-3"
|
||||
msgstr "AC-3"
|
||||
|
||||
msgid "Audio"
|
||||
msgstr "Audio"
|
||||
|
||||
msgid "Transponder Information"
|
||||
msgstr "Siųstuvo informacija"
|
||||
|
||||
msgid "Apid"
|
||||
msgstr "Apid"
|
||||
|
||||
msgid "Dpid"
|
||||
msgstr "Dpid"
|
||||
|
||||
msgid "Spid"
|
||||
msgstr "Spid"
|
||||
|
||||
msgid "Nid"
|
||||
msgstr "Nid"
|
||||
|
||||
msgid "Tid"
|
||||
msgstr "Tid"
|
||||
|
||||
msgid "Rid"
|
||||
msgstr "Rid"
|
||||
|
||||
msgid "Coderate"
|
||||
msgstr "Kodavimo dažnis"
|
||||
|
||||
msgid "Protocol"
|
||||
msgstr "Protokolas"
|
||||
|
||||
msgid "Bitrate"
|
||||
msgstr "Kokybė"
|
||||
|
||||
msgid "Stream Information"
|
||||
msgstr "Srauto informacija"
|
||||
|
||||
msgid "Video Stream"
|
||||
msgstr "Video srautas"
|
||||
|
||||
msgid "Codec"
|
||||
msgstr "Kodekas"
|
||||
|
||||
msgid "Aspect Ratio"
|
||||
msgstr "Proporcijos"
|
||||
|
||||
msgid "Frame Rate"
|
||||
msgstr "Kadrų dažnis"
|
||||
|
||||
msgid "Video Format"
|
||||
msgstr "Video formatas"
|
||||
|
||||
msgid "Resolution"
|
||||
msgstr "Rezoliucija"
|
||||
|
||||
msgid "Audio Stream"
|
||||
msgstr "Audio srautas"
|
||||
|
||||
msgid "Channel Mode"
|
||||
msgstr "Kanalo būsena"
|
||||
|
||||
msgid "Sampling Frequency"
|
||||
msgstr "Parodomasis dažnis"
|
||||
|
||||
msgid "AC-3 Stream"
|
||||
msgstr "AC-3 srautas"
|
||||
|
||||
msgid "Bit Stream Mode"
|
||||
msgstr "Srauto būsena"
|
||||
|
||||
msgid "Audio Coding Mode"
|
||||
msgstr "Audio kodavimas"
|
||||
|
||||
msgid "Center Mix Level"
|
||||
msgstr "Centrinis mikserio lygis"
|
||||
|
||||
msgid "Surround Mix Level"
|
||||
msgstr "Surround Mix lygis"
|
||||
|
||||
msgid "Dolby Surround Mode"
|
||||
msgstr "Dolby Surround būklė"
|
||||
|
||||
msgid "Low Frequency Effects"
|
||||
msgstr "Žemo dažnio efektai"
|
||||
|
||||
msgid "Dialogue Normalization"
|
||||
msgstr "Dialogo normalizacija"
|
||||
|
||||
msgid "basic"
|
||||
msgstr "Standartinis"
|
||||
|
||||
msgid "transponder"
|
||||
msgstr "Siųstuvas"
|
||||
|
||||
msgid "stream"
|
||||
msgstr "Srautas"
|
||||
|
||||
msgid "dBm"
|
||||
msgstr "dBm"
|
||||
|
||||
msgid "dBuV"
|
||||
msgstr "dBuV"
|
||||
|
||||
msgid "dBV"
|
||||
msgstr "dBV"
|
||||
|
||||
msgid "Classic"
|
||||
msgstr "Klasikinis"
|
||||
|
||||
msgid "Elchi"
|
||||
msgstr "Elchi"
|
||||
|
||||
msgid "ST:TNG"
|
||||
msgstr "ST:TNG"
|
||||
|
||||
msgid "DeepBlue"
|
||||
msgstr "Tamsiai mėlyna"
|
||||
|
||||
msgid "Moronimo"
|
||||
msgstr "Moronimo"
|
||||
|
||||
msgid "Enigma"
|
||||
msgstr "Enigma"
|
||||
|
||||
msgid "EgalsTry"
|
||||
msgstr "EgalsTry"
|
||||
|
||||
msgid "Duotone"
|
||||
msgstr "Duotone"
|
||||
|
||||
msgid "SilverGreen"
|
||||
msgstr "Sidabro žalia"
|
||||
|
||||
msgid "PearlHD"
|
||||
msgstr "PearlHD"
|
||||
|
||||
msgid "Hide main menu entry"
|
||||
msgstr "Paslėpti pagrindinio meniu įrašus"
|
||||
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr "Nustatyti pagrindinio meniu įrašų paslėpimą."
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "Numatytasis rodymo būdas"
|
||||
|
||||
msgid "Define the default display mode at startup."
|
||||
msgstr "Nustatyti numatytąjį rodymo būdą paleidžiant."
|
||||
|
||||
msgid "Define the used OSD skin."
|
||||
msgstr "Nustatyti naudojamą ekrano apvalkalą."
|
||||
|
||||
msgid "Define the used OSD theme."
|
||||
msgstr "Nustatyti naudojamą ekrano temą."
|
||||
|
||||
msgid "Position"
|
||||
msgstr "Pozicija"
|
||||
|
||||
msgid "Define the position of OSD."
|
||||
msgstr "Nustatyti ekrano užsklandos poziciją."
|
||||
|
||||
msgid "Downscale OSD size [%]"
|
||||
msgstr "Sumažinti ekrano užsklandos (OSD) dydį [%]"
|
||||
|
||||
msgid "Define the downscale ratio for OSD size."
|
||||
msgstr "Nustatyti ekrano užsklandos (OSD) mažinimo santykį."
|
||||
|
||||
msgid "Signal level unit"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the used signal level unit."
|
||||
msgstr ""
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "Raudonoji ribą [%]"
|
||||
|
||||
msgid "Define a limit for red bar, which is used to indicate a bad signal."
|
||||
msgstr "Nustatyti raudonos juostos ribą, kuri naudojama blogo signalo indikacijai."
|
||||
|
||||
msgid "Green limit [%]"
|
||||
msgstr "Žalioji riba [%]"
|
||||
|
||||
msgid "Define a limit for green bar, which is used to indicate a good signal."
|
||||
msgstr "Nustatyti žalios juostos ribą, kuri naudojama gero signalo indikacijai."
|
||||
|
||||
msgid "OSD update interval [0.1s]"
|
||||
msgstr "Ekrano užsklandos atnaujinimo intervalas [0.1s]"
|
||||
|
||||
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
|
||||
msgstr "Nustatyti ekrano užsklandos atnaujinimo intervalą. Mažesnis intervalas labiau apkrauna centrinį procesorių (CPU)."
|
||||
|
||||
msgid "Analyze stream"
|
||||
msgstr "Analizuoti srautą"
|
||||
|
||||
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
|
||||
msgstr "Nurodyti ar DVB srautas turi būti analizuojamas bei jo kokybė išskaičiuojama."
|
||||
|
||||
msgid "Calculation interval [0.1s]"
|
||||
msgstr "Apskaitos intervalos [0.1s]"
|
||||
|
||||
msgid "Define an interval for calculation. The bigger interval generates more stable values."
|
||||
msgstr "Nustatyti apskaitos intervalą. Kuo didesnis intervalas, tuo tikslesni duomenys."
|
||||
|
||||
msgid "Use SVDRP service"
|
||||
msgstr "Naudoti SVDRP paslaugą"
|
||||
|
||||
msgid "Define whether the SVDRP service is used in client/server setups."
|
||||
msgstr "Nurodyti ar SVDRP paslauga naudojama kliento/serverio nustatymuose."
|
||||
|
||||
msgid "SVDRP service port"
|
||||
msgstr "SVDRP įrenginio portas"
|
||||
|
||||
msgid "Define the port number of SVDRP service."
|
||||
msgstr "Nustatyti SVDRP įrenginio prievadą."
|
||||
|
||||
msgid "SVDRP service IP"
|
||||
msgstr "SVDRP įrenginio IP"
|
||||
|
||||
msgid "Define the IP address of SVDRP service."
|
||||
msgstr "Nustatyti SVDRP įrenginio IP adresą."
|
||||
|
||||
msgid "Help"
|
||||
msgstr "Pagalba"
|
||||
|
||||
msgid "Fixed"
|
||||
msgstr "Sutvarkyta"
|
||||
|
||||
msgid "Analog"
|
||||
msgstr "Analoginis"
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr "MPEG-2"
|
||||
|
||||
msgid "H.264"
|
||||
msgstr "H.264"
|
||||
|
||||
msgid "H.265"
|
||||
msgstr "H.265"
|
||||
|
||||
msgid "MPEG-1 Layer I"
|
||||
msgstr "MPEG-1 Layer I"
|
||||
|
||||
msgid "MPEG-1 Layer II"
|
||||
msgstr "MPEG-1 Layer II"
|
||||
|
||||
msgid "MPEG-1 Layer III"
|
||||
msgstr "MPEG-1 Layer III"
|
||||
|
||||
msgid "MPEG-2 Layer I"
|
||||
msgstr "MPEG-2 Layer I"
|
||||
|
||||
msgid "MPEG-2 Layer II"
|
||||
msgstr "MPEG-2 Layer II"
|
||||
|
||||
msgid "MPEG-2 Layer III"
|
||||
msgstr "MPEG-2 Layer III"
|
||||
|
||||
msgid "HE-AAC"
|
||||
msgstr "HE-AAC"
|
||||
|
||||
msgid "LATM"
|
||||
msgstr "LATM"
|
||||
|
||||
msgid "stereo"
|
||||
msgstr "stereo"
|
||||
|
||||
msgid "joint Stereo"
|
||||
msgstr "jungtinis stereo"
|
||||
|
||||
msgid "dual"
|
||||
msgstr "dvigubas"
|
||||
|
||||
msgid "mono"
|
||||
msgstr "mono"
|
||||
|
||||
msgid "interlaced"
|
||||
msgstr "persipynęs (interlaced)"
|
||||
|
||||
msgid "progressive"
|
||||
msgstr "progresyvinis"
|
||||
|
||||
msgid "reserved"
|
||||
msgstr "rezervuota"
|
||||
|
||||
msgid "extended"
|
||||
msgstr "išplėstas"
|
||||
|
||||
msgid "unknown"
|
||||
msgstr "nežinomas"
|
||||
|
||||
msgid "component"
|
||||
msgstr "komponentas"
|
||||
|
||||
msgid "PAL"
|
||||
msgstr "PAL"
|
||||
|
||||
msgid "NTSC"
|
||||
msgstr "NTSC"
|
||||
|
||||
msgid "SECAM"
|
||||
msgstr "SECAM"
|
||||
|
||||
msgid "MAC"
|
||||
msgstr "MAC"
|
||||
|
||||
msgid "Hz"
|
||||
msgstr "Hz"
|
||||
|
||||
msgid "Complete Main (CM)"
|
||||
msgstr "Pilnai pagrindinis (CM)"
|
||||
|
||||
msgid "Music and Effects (ME)"
|
||||
msgstr "Muzika ir efektai (ME)"
|
||||
|
||||
msgid "Visually Impaired (VI)"
|
||||
msgstr "Skirta silpnaregiams (VI)"
|
||||
|
||||
msgid "Hearing Impaired (HI)"
|
||||
msgstr "Skirta žmoniems su klausos negalia (HI)"
|
||||
|
||||
msgid "Dialogue (D)"
|
||||
msgstr "Dialogas (D)"
|
||||
|
||||
msgid "Commentary (C)"
|
||||
msgstr "Komentarai (C)"
|
||||
|
||||
msgid "Emergency (E)"
|
||||
msgstr "Avarinis (E)"
|
||||
|
||||
msgid "Voice Over (VO)"
|
||||
msgstr "Įgarsinta (VO)"
|
||||
|
||||
msgid "Karaoke"
|
||||
msgstr "Karaoke"
|
||||
|
||||
msgid "Ch1"
|
||||
msgstr "Kan1"
|
||||
|
||||
msgid "Ch2"
|
||||
msgstr "Kan2"
|
||||
|
||||
msgid "C"
|
||||
msgstr "C"
|
||||
|
||||
msgid "L"
|
||||
msgstr "K"
|
||||
|
||||
msgid "R"
|
||||
msgstr "D"
|
||||
|
||||
msgid "S"
|
||||
msgstr "S"
|
||||
|
||||
msgid "SL"
|
||||
msgstr "SL"
|
||||
|
||||
msgid "SR"
|
||||
msgstr "SR"
|
||||
|
||||
msgid "dB"
|
||||
msgstr "dB"
|
||||
|
||||
msgid "not indicated"
|
||||
msgstr "nerasta"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "MHz"
|
||||
|
||||
msgid "free"
|
||||
msgstr "nekoduota"
|
||||
|
||||
msgid "Mbit/s"
|
||||
msgstr "Mbit/s"
|
||||
|
||||
msgid "kbit/s"
|
||||
msgstr "kbit/s"
|
408
po/pl_PL.po
408
po/pl_PL.po
@ -1,408 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
||||
# This file is distributed under the same license as the vdr-femon package.
|
||||
# Tomasz Maciej Nowak, 2017.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
||||
"Last-Translator: Tomasz Maciej Nowak <tomek_n@o2.pl>\n"
|
||||
"Language-Team: Polish <vdr@linuxtv.org>\n"
|
||||
"Language: pl_PL\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: Poedit 1.8.11\n"
|
||||
|
||||
msgid "DVB Signal Information Monitor (OSD)"
|
||||
msgstr "Monitor sygnału DVB (OSD)"
|
||||
|
||||
msgid "Signal Information"
|
||||
msgstr "Informacja o sygnale"
|
||||
|
||||
msgid "Femon not available"
|
||||
msgstr "Femon niedostępny"
|
||||
|
||||
msgid "Video"
|
||||
msgstr "Obraz"
|
||||
|
||||
msgid "AC-3"
|
||||
msgstr "AC-3"
|
||||
|
||||
msgid "Audio"
|
||||
msgstr "Dźwięk"
|
||||
|
||||
msgid "Transponder Information"
|
||||
msgstr "Informacje o transponderze"
|
||||
|
||||
msgid "Apid"
|
||||
msgstr "Apid"
|
||||
|
||||
msgid "Dpid"
|
||||
msgstr "Dpid"
|
||||
|
||||
msgid "Spid"
|
||||
msgstr "Spid"
|
||||
|
||||
msgid "Nid"
|
||||
msgstr "Nid"
|
||||
|
||||
msgid "Tid"
|
||||
msgstr "Tid"
|
||||
|
||||
msgid "Rid"
|
||||
msgstr "Rid"
|
||||
|
||||
msgid "Coderate"
|
||||
msgstr "Sprawność kodowania"
|
||||
|
||||
msgid "Protocol"
|
||||
msgstr "Protokół"
|
||||
|
||||
msgid "Bitrate"
|
||||
msgstr "Przepływność"
|
||||
|
||||
msgid "Stream Information"
|
||||
msgstr "Informacje o strumieniu"
|
||||
|
||||
msgid "Video Stream"
|
||||
msgstr "Strumień obrazu"
|
||||
|
||||
msgid "Codec"
|
||||
msgstr "Kodek"
|
||||
|
||||
msgid "Aspect Ratio"
|
||||
msgstr "Proporcje obrazu"
|
||||
|
||||
msgid "Frame Rate"
|
||||
msgstr "Tempo wyświetlania klatek"
|
||||
|
||||
msgid "Video Format"
|
||||
msgstr "Format obrazu"
|
||||
|
||||
msgid "Resolution"
|
||||
msgstr "Rozdzielczość"
|
||||
|
||||
msgid "Audio Stream"
|
||||
msgstr "Strumień dźwięku"
|
||||
|
||||
msgid "Channel Mode"
|
||||
msgstr "Tryb kanału"
|
||||
|
||||
msgid "Sampling Frequency"
|
||||
msgstr "Częstotliwość próbkowania"
|
||||
|
||||
msgid "AC-3 Stream"
|
||||
msgstr "Strumień AC-3"
|
||||
|
||||
msgid "Bit Stream Mode"
|
||||
msgstr "Tryb strumienia bitów"
|
||||
|
||||
msgid "Audio Coding Mode"
|
||||
msgstr "Tryb kodowania dźwięku"
|
||||
|
||||
msgid "Center Mix Level"
|
||||
msgstr "Poziom Center Mix"
|
||||
|
||||
msgid "Surround Mix Level"
|
||||
msgstr "Poziom Surround Mix"
|
||||
|
||||
msgid "Dolby Surround Mode"
|
||||
msgstr "Tryb Dolby Surround"
|
||||
|
||||
msgid "Low Frequency Effects"
|
||||
msgstr "Efekty niskich frekwencji"
|
||||
|
||||
msgid "Dialogue Normalization"
|
||||
msgstr "Normalizacja dialogów"
|
||||
|
||||
msgid "basic"
|
||||
msgstr "podstawowy"
|
||||
|
||||
msgid "transponder"
|
||||
msgstr "transponder"
|
||||
|
||||
msgid "stream"
|
||||
msgstr "strumień"
|
||||
|
||||
msgid "dBm"
|
||||
msgstr "dBm"
|
||||
|
||||
msgid "dBuV"
|
||||
msgstr "dBuV"
|
||||
|
||||
msgid "dBV"
|
||||
msgstr "dBV"
|
||||
|
||||
msgid "Classic"
|
||||
msgstr "Klasyczna"
|
||||
|
||||
msgid "Elchi"
|
||||
msgstr "Elchi"
|
||||
|
||||
msgid "ST:TNG"
|
||||
msgstr "ST:TNG"
|
||||
|
||||
msgid "DeepBlue"
|
||||
msgstr "DeepBlue"
|
||||
|
||||
msgid "Moronimo"
|
||||
msgstr "Moronimo"
|
||||
|
||||
msgid "Enigma"
|
||||
msgstr "Enigma"
|
||||
|
||||
msgid "EgalsTry"
|
||||
msgstr "EgalsTry"
|
||||
|
||||
msgid "Duotone"
|
||||
msgstr "Duotone"
|
||||
|
||||
msgid "SilverGreen"
|
||||
msgstr "SilverGreen"
|
||||
|
||||
msgid "PearlHD"
|
||||
msgstr "PearlHD"
|
||||
|
||||
msgid "Hide main menu entry"
|
||||
msgstr "Ukryj pozycję w głównym menu"
|
||||
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr "Określa czy pozycja w głównym menu jest ukryta."
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "Domyślny tryb wyświetlania"
|
||||
|
||||
msgid "Define the default display mode at startup."
|
||||
msgstr "Określa domyślny tryb wyświetlania przy uruchamianiu."
|
||||
|
||||
msgid "Define the used OSD skin."
|
||||
msgstr "Określa używaną skórkę OSD."
|
||||
|
||||
msgid "Define the used OSD theme."
|
||||
msgstr "Określa używany motyw OSD."
|
||||
|
||||
msgid "Position"
|
||||
msgstr "Pozycja"
|
||||
|
||||
msgid "Define the position of OSD."
|
||||
msgstr "Określa pozycję OSD."
|
||||
|
||||
msgid "Downscale OSD size [%]"
|
||||
msgstr "Zmniejsz rozmiar OSD [%]"
|
||||
|
||||
msgid "Define the downscale ratio for OSD size."
|
||||
msgstr "Określa procent zmniejszenia OSD."
|
||||
|
||||
msgid "Signal level unit"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the used signal level unit."
|
||||
msgstr ""
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "Czerwony - zakres [%]"
|
||||
|
||||
msgid "Define a limit for red bar, which is used to indicate a bad signal."
|
||||
msgstr "Określa zakres czerwonego paska, pokazującego zły sygnał."
|
||||
|
||||
msgid "Green limit [%]"
|
||||
msgstr "Zielony - zakres [%]"
|
||||
|
||||
msgid "Define a limit for green bar, which is used to indicate a good signal."
|
||||
msgstr "Określa zakres zielonego paska, pokazującego dobry sygnał."
|
||||
|
||||
msgid "OSD update interval [0.1s]"
|
||||
msgstr "Interwał aktualizacji OSD [0,1s]"
|
||||
|
||||
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
|
||||
msgstr "Określa interwał aktualizacji danych w OSD. Mniejszy interwał generuje większe obciążenie CPU."
|
||||
|
||||
msgid "Analyze stream"
|
||||
msgstr "Analiza strumienia"
|
||||
|
||||
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
|
||||
msgstr "Określa czy strumień DVB jest analizowany a przepływność obliczana."
|
||||
|
||||
msgid "Calculation interval [0.1s]"
|
||||
msgstr "Interwał obliczeń [0,1s]"
|
||||
|
||||
msgid "Define an interval for calculation. The bigger interval generates more stable values."
|
||||
msgstr "Określa interwał obliczeń. Większy interwał generuje stabilniejsze wartości."
|
||||
|
||||
msgid "Use SVDRP service"
|
||||
msgstr "Używaj usługi SVDRP"
|
||||
|
||||
msgid "Define whether the SVDRP service is used in client/server setups."
|
||||
msgstr "Określa czy używać usługi SVDRP w kownfiguracjach serwer/klient."
|
||||
|
||||
msgid "SVDRP service port"
|
||||
msgstr "Port usługi SVDRP"
|
||||
|
||||
msgid "Define the port number of SVDRP service."
|
||||
msgstr "Określa numer portu usługi SVDRP."
|
||||
|
||||
msgid "SVDRP service IP"
|
||||
msgstr "IP usługi SVDRP"
|
||||
|
||||
msgid "Define the IP address of SVDRP service."
|
||||
msgstr "Określa adres IP usługi SVDRP."
|
||||
|
||||
msgid "Help"
|
||||
msgstr "Pomoc"
|
||||
|
||||
msgid "Fixed"
|
||||
msgstr "Stały"
|
||||
|
||||
msgid "Analog"
|
||||
msgstr "Analog"
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr "MPEG-2"
|
||||
|
||||
msgid "H.264"
|
||||
msgstr "H.264"
|
||||
|
||||
msgid "H.265"
|
||||
msgstr "H.265"
|
||||
|
||||
msgid "MPEG-1 Layer I"
|
||||
msgstr "MPEG-1 Layer I"
|
||||
|
||||
msgid "MPEG-1 Layer II"
|
||||
msgstr "MPEG-1 Layer II"
|
||||
|
||||
msgid "MPEG-1 Layer III"
|
||||
msgstr "MPEG-1 Layer III"
|
||||
|
||||
msgid "MPEG-2 Layer I"
|
||||
msgstr "MPEG-2 Layer I"
|
||||
|
||||
msgid "MPEG-2 Layer II"
|
||||
msgstr "MPEG-2 Layer II"
|
||||
|
||||
msgid "MPEG-2 Layer III"
|
||||
msgstr "MPEG-2 Layer III"
|
||||
|
||||
msgid "HE-AAC"
|
||||
msgstr "HE-AAC"
|
||||
|
||||
msgid "LATM"
|
||||
msgstr "LATM"
|
||||
|
||||
msgid "stereo"
|
||||
msgstr "stereo"
|
||||
|
||||
msgid "joint Stereo"
|
||||
msgstr "połączone stereo"
|
||||
|
||||
msgid "dual"
|
||||
msgstr "podwójne"
|
||||
|
||||
msgid "mono"
|
||||
msgstr "mono"
|
||||
|
||||
msgid "interlaced"
|
||||
msgstr "z przeplotem"
|
||||
|
||||
msgid "progressive"
|
||||
msgstr "progresywne"
|
||||
|
||||
msgid "reserved"
|
||||
msgstr "zamknięte"
|
||||
|
||||
msgid "extended"
|
||||
msgstr "rozszerzone"
|
||||
|
||||
msgid "unknown"
|
||||
msgstr "nieznane"
|
||||
|
||||
msgid "component"
|
||||
msgstr "komponent"
|
||||
|
||||
msgid "PAL"
|
||||
msgstr "PAL"
|
||||
|
||||
msgid "NTSC"
|
||||
msgstr "NTSC"
|
||||
|
||||
msgid "SECAM"
|
||||
msgstr "SECAM"
|
||||
|
||||
msgid "MAC"
|
||||
msgstr "MAC"
|
||||
|
||||
msgid "Hz"
|
||||
msgstr "Hz"
|
||||
|
||||
msgid "Complete Main (CM)"
|
||||
msgstr "Complete Main (CM)"
|
||||
|
||||
msgid "Music and Effects (ME)"
|
||||
msgstr "Muzyka i efekty (ME)"
|
||||
|
||||
msgid "Visually Impaired (VI)"
|
||||
msgstr "Upośledzone wzrokowo (VI)"
|
||||
|
||||
msgid "Hearing Impaired (HI)"
|
||||
msgstr "Upośledzone słuchowo (HI)"
|
||||
|
||||
msgid "Dialogue (D)"
|
||||
msgstr "Dialog (D)"
|
||||
|
||||
msgid "Commentary (C)"
|
||||
msgstr "Komentarz (C)"
|
||||
|
||||
msgid "Emergency (E)"
|
||||
msgstr "Nagły wypadek (E)"
|
||||
|
||||
msgid "Voice Over (VO)"
|
||||
msgstr "Naniesiony głos (VO)"
|
||||
|
||||
msgid "Karaoke"
|
||||
msgstr "Karaoke"
|
||||
|
||||
msgid "Ch1"
|
||||
msgstr "Kan1"
|
||||
|
||||
msgid "Ch2"
|
||||
msgstr "Kan2"
|
||||
|
||||
msgid "C"
|
||||
msgstr "C"
|
||||
|
||||
msgid "L"
|
||||
msgstr "L"
|
||||
|
||||
msgid "R"
|
||||
msgstr "R"
|
||||
|
||||
msgid "S"
|
||||
msgstr "S"
|
||||
|
||||
msgid "SL"
|
||||
msgstr "SL"
|
||||
|
||||
msgid "SR"
|
||||
msgstr "SR"
|
||||
|
||||
msgid "dB"
|
||||
msgstr "dB"
|
||||
|
||||
msgid "not indicated"
|
||||
msgstr "nie podano"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "MHz"
|
||||
|
||||
msgid "free"
|
||||
msgstr "wolne"
|
||||
|
||||
msgid "Mbit/s"
|
||||
msgstr "Mbit/s"
|
||||
|
||||
msgid "kbit/s"
|
||||
msgstr "kbit/s"
|
407
po/ru_RU.po
407
po/ru_RU.po
@ -1,407 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
||||
# This file is distributed under the same license as the femon package.
|
||||
# Vyacheslav Dikonov
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
||||
"Last-Translator: Vyacheslav Dikonov\n"
|
||||
"Language-Team: Russian <vdr@linuxtv.org>\n"
|
||||
"Language: ru\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=ISO-8859-5\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "DVB Signal Information Monitor (OSD)"
|
||||
msgstr "¼ÞÝØâÞà ÚÐçÕáâÒÐ áØÓÝÐÛÐ"
|
||||
|
||||
msgid "Signal Information"
|
||||
msgstr "ÁØÓÝÐÛ"
|
||||
|
||||
msgid "Femon not available"
|
||||
msgstr ""
|
||||
|
||||
msgid "Video"
|
||||
msgstr "²ØÔÕÞ"
|
||||
|
||||
msgid "AC-3"
|
||||
msgstr "AC-3"
|
||||
|
||||
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 "Coderate"
|
||||
|
||||
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 ""
|
||||
|
||||
msgid "Bit Stream Mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "Audio Coding Mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "Center Mix Level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Surround Mix Level"
|
||||
msgstr ""
|
||||
|
||||
msgid "Dolby Surround Mode"
|
||||
msgstr ""
|
||||
|
||||
msgid "Low Frequency Effects"
|
||||
msgstr ""
|
||||
|
||||
msgid "Dialogue Normalization"
|
||||
msgstr ""
|
||||
|
||||
msgid "basic"
|
||||
msgstr ""
|
||||
|
||||
msgid "transponder"
|
||||
msgstr ""
|
||||
|
||||
msgid "stream"
|
||||
msgstr ""
|
||||
|
||||
msgid "dBm"
|
||||
msgstr "dBm"
|
||||
|
||||
msgid "dBuV"
|
||||
msgstr "dBuV"
|
||||
|
||||
msgid "dBV"
|
||||
msgstr "dBV"
|
||||
|
||||
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 "Signal level unit"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the used signal level unit."
|
||||
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 ""
|
||||
|
||||
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 ""
|
||||
|
||||
msgid "Define whether the SVDRP service is used in client/server setups."
|
||||
msgstr ""
|
||||
|
||||
msgid "SVDRP service port"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the port number of SVDRP service."
|
||||
msgstr ""
|
||||
|
||||
msgid "SVDRP service IP"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the IP address of SVDRP service."
|
||||
msgstr ""
|
||||
|
||||
msgid "Help"
|
||||
msgstr ""
|
||||
|
||||
msgid "Fixed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Analog"
|
||||
msgstr ""
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr ""
|
||||
|
||||
msgid "H.264"
|
||||
msgstr ""
|
||||
|
||||
msgid "H.265"
|
||||
msgstr ""
|
||||
|
||||
msgid "MPEG-1 Layer I"
|
||||
msgstr ""
|
||||
|
||||
msgid "MPEG-1 Layer II"
|
||||
msgstr ""
|
||||
|
||||
msgid "MPEG-1 Layer III"
|
||||
msgstr ""
|
||||
|
||||
msgid "MPEG-2 Layer I"
|
||||
msgstr ""
|
||||
|
||||
msgid "MPEG-2 Layer II"
|
||||
msgstr ""
|
||||
|
||||
msgid "MPEG-2 Layer III"
|
||||
msgstr ""
|
||||
|
||||
msgid "HE-AAC"
|
||||
msgstr ""
|
||||
|
||||
msgid "LATM"
|
||||
msgstr ""
|
||||
|
||||
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 ""
|
||||
|
||||
msgid "MAC"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hz"
|
||||
msgstr "³æ"
|
||||
|
||||
msgid "Complete Main (CM)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Music and Effects (ME)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Visually Impaired (VI)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hearing Impaired (HI)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Dialogue (D)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Commentary (C)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Emergency (E)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Voice Over (VO)"
|
||||
msgstr ""
|
||||
|
||||
msgid "Karaoke"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ch1"
|
||||
msgstr ""
|
||||
|
||||
msgid "Ch2"
|
||||
msgstr ""
|
||||
|
||||
msgid "C"
|
||||
msgstr ""
|
||||
|
||||
msgid "L"
|
||||
msgstr ""
|
||||
|
||||
msgid "R"
|
||||
msgstr ""
|
||||
|
||||
msgid "S"
|
||||
msgstr ""
|
||||
|
||||
msgid "SL"
|
||||
msgstr ""
|
||||
|
||||
msgid "SR"
|
||||
msgstr ""
|
||||
|
||||
msgid "dB"
|
||||
msgstr "dB"
|
||||
|
||||
msgid "not indicated"
|
||||
msgstr ""
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "¼³æ"
|
||||
|
||||
msgid "free"
|
||||
msgstr ""
|
||||
|
||||
msgid "Mbit/s"
|
||||
msgstr "¼ÑØâ/á"
|
||||
|
||||
msgid "kbit/s"
|
||||
msgstr "ÚÑØâ/á"
|
407
po/sk_SK.po
407
po/sk_SK.po
@ -1,407 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
||||
# This file is distributed under the same license as the femon package.
|
||||
# Milan Hrala
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
||||
"Last-Translator: 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ácie o signále (OSD)"
|
||||
|
||||
msgid "Signal Information"
|
||||
msgstr "Informácie o signále"
|
||||
|
||||
msgid "Femon not available"
|
||||
msgstr "Femon nie je k dispozícii"
|
||||
|
||||
msgid "Video"
|
||||
msgstr "Video"
|
||||
|
||||
msgid "AC-3"
|
||||
msgstr "AC-3"
|
||||
|
||||
msgid "Audio"
|
||||
msgstr "Zvuk"
|
||||
|
||||
msgid "Transponder Information"
|
||||
msgstr "Informácie transpondé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» kódovania"
|
||||
|
||||
msgid "Protocol"
|
||||
msgstr "Protokol"
|
||||
|
||||
msgid "Bitrate"
|
||||
msgstr "Dátový tok"
|
||||
|
||||
msgid "Stream Information"
|
||||
msgstr "Informácie o dátovom toku"
|
||||
|
||||
msgid "Video Stream"
|
||||
msgstr "Video stopa"
|
||||
|
||||
msgid "Codec"
|
||||
msgstr "kodek"
|
||||
|
||||
msgid "Aspect Ratio"
|
||||
msgstr "Pomer strán"
|
||||
|
||||
msgid "Frame Rate"
|
||||
msgstr "Poèet snímkov"
|
||||
|
||||
msgid "Video Format"
|
||||
msgstr "Video formát"
|
||||
|
||||
msgid "Resolution"
|
||||
msgstr "Rozlí¹enie"
|
||||
|
||||
msgid "Audio Stream"
|
||||
msgstr "Zvuková stopa"
|
||||
|
||||
msgid "Channel Mode"
|
||||
msgstr "re¾im kanála"
|
||||
|
||||
msgid "Sampling Frequency"
|
||||
msgstr "Vzorkovacia frekvencia"
|
||||
|
||||
msgid "AC-3 Stream"
|
||||
msgstr "AC-3 dátový tok"
|
||||
|
||||
msgid "Bit Stream Mode"
|
||||
msgstr "re¾im bitového toku"
|
||||
|
||||
msgid "Audio Coding Mode"
|
||||
msgstr "Re¾ím kódovania zvuku"
|
||||
|
||||
msgid "Center Mix Level"
|
||||
msgstr "Úroveò Center mix"
|
||||
|
||||
msgid "Surround Mix Level"
|
||||
msgstr "Úroveò Surround mix"
|
||||
|
||||
msgid "Dolby Surround Mode"
|
||||
msgstr "Dolby Surround re¾ím"
|
||||
|
||||
msgid "Low Frequency Effects"
|
||||
msgstr "Basové efekty"
|
||||
|
||||
msgid "Dialogue Normalization"
|
||||
msgstr "©tandartný dialóg"
|
||||
|
||||
msgid "basic"
|
||||
msgstr "©tandardtný"
|
||||
|
||||
msgid "transponder"
|
||||
msgstr "Transpondér"
|
||||
|
||||
msgid "stream"
|
||||
msgstr "dátový tok"
|
||||
|
||||
msgid "dBm"
|
||||
msgstr "dBm"
|
||||
|
||||
msgid "dBuV"
|
||||
msgstr "dBuV"
|
||||
|
||||
msgid "dBV"
|
||||
msgstr "dBV"
|
||||
|
||||
msgid "Classic"
|
||||
msgstr "Klasický"
|
||||
|
||||
msgid "Elchi"
|
||||
msgstr "Elchi"
|
||||
|
||||
msgid "ST:TNG"
|
||||
msgstr "ST:TNG"
|
||||
|
||||
msgid "DeepBlue"
|
||||
msgstr "tmavo modrá"
|
||||
|
||||
msgid "Moronimo"
|
||||
msgstr "Moronimo"
|
||||
|
||||
msgid "Enigma"
|
||||
msgstr "Enigma"
|
||||
|
||||
msgid "EgalsTry"
|
||||
msgstr "EgalsTry"
|
||||
|
||||
msgid "Duotone"
|
||||
msgstr "Duotone"
|
||||
|
||||
msgid "SilverGreen"
|
||||
msgstr "strieborno zelená"
|
||||
|
||||
msgid "PearlHD"
|
||||
msgstr "PearlHD"
|
||||
|
||||
msgid "Hide main menu entry"
|
||||
msgstr "Schova» polo¾ku v hlavnom menu"
|
||||
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr "Urèite, èi v hlavnom menu bude polo¾ka skrytá."
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "©tandardný re¾im zobrazenia"
|
||||
|
||||
msgid "Define the default display mode at startup."
|
||||
msgstr "Zadajte predvolený re¾im zobrazenia pri spustení."
|
||||
|
||||
msgid "Define the used OSD skin."
|
||||
msgstr "Zadajte pou¾itý OSD vzhµad."
|
||||
|
||||
msgid "Define the used OSD theme."
|
||||
msgstr "Definujte pou¾itú OSD tému."
|
||||
|
||||
msgid "Position"
|
||||
msgstr "Pozícia"
|
||||
|
||||
msgid "Define the position of OSD."
|
||||
msgstr "Definujte pozíciu OSD."
|
||||
|
||||
msgid "Downscale OSD size [%]"
|
||||
msgstr "Zmen¹i» veµkos» OSD [%]"
|
||||
|
||||
msgid "Define the downscale ratio for OSD size."
|
||||
msgstr "Zadajte zmen¹enie pomeru pre OSD veµkosti."
|
||||
|
||||
msgid "Signal level unit"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the used signal level unit."
|
||||
msgstr ""
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "Èervený limit [%]"
|
||||
|
||||
msgid "Define a limit for red bar, which is used to indicate a bad signal."
|
||||
msgstr "Zadajte limit pre èervený pruh , ktorý sa pou¾íva na oznaèenie zlého signálu."
|
||||
|
||||
msgid "Green limit [%]"
|
||||
msgstr "Zelený limit [%]"
|
||||
|
||||
msgid "Define a limit for green bar, which is used to indicate a good signal."
|
||||
msgstr "Zadajte limit pre zeleného pruhu, ktorý sa pou¾ije na oznaèenie dobrého signálu."
|
||||
|
||||
msgid "OSD update interval [0.1s]"
|
||||
msgstr "OSD aktualizaèný interval [0.1s]"
|
||||
|
||||
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
|
||||
msgstr "Zadajte interval pre aktualizácie OSD. Men¹í interval vytvára vy¹¹ie za»a¾enie CPU."
|
||||
|
||||
msgid "Analyze stream"
|
||||
msgstr "Analýza dátového toku"
|
||||
|
||||
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
|
||||
msgstr "Zadajte èi sa DVB prúd analyzuje a dátový tok vypoèíta."
|
||||
|
||||
msgid "Calculation interval [0.1s]"
|
||||
msgstr "Výpoètový interval [0.1s]"
|
||||
|
||||
msgid "Define an interval for calculation. The bigger interval generates more stable values."
|
||||
msgstr "Zadajte interval pre výpoèet. Väè¹í interval vytvára stabilnej¹ie hodnoty."
|
||||
|
||||
msgid "Use SVDRP service"
|
||||
msgstr "Pou¾i» SVDRP slu¾bu"
|
||||
|
||||
msgid "Define whether the SVDRP service is used in client/server setups."
|
||||
msgstr "Zadajte èi sa pou¾ije slu¾ba SVDRP v klient / server nastaveniach."
|
||||
|
||||
msgid "SVDRP service port"
|
||||
msgstr "Port SVDRP slu¾by"
|
||||
|
||||
msgid "Define the port number of SVDRP service."
|
||||
msgstr "Zadajte èíslo portu slu¾by SVDRP."
|
||||
|
||||
msgid "SVDRP service IP"
|
||||
msgstr "IP SVDRP slu¾by"
|
||||
|
||||
msgid "Define the IP address of SVDRP service."
|
||||
msgstr "zadajte IP adresu slu¾by SVDRP."
|
||||
|
||||
msgid "Help"
|
||||
msgstr "Pomoc"
|
||||
|
||||
msgid "Fixed"
|
||||
msgstr "Pevné"
|
||||
|
||||
msgid "Analog"
|
||||
msgstr "Analóg"
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr "MPEG-2"
|
||||
|
||||
msgid "H.264"
|
||||
msgstr "H.264"
|
||||
|
||||
msgid "H.265"
|
||||
msgstr "H.265"
|
||||
|
||||
msgid "MPEG-1 Layer I"
|
||||
msgstr "MPEG-1 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é stereo"
|
||||
|
||||
msgid "dual"
|
||||
msgstr "dvojitý"
|
||||
|
||||
msgid "mono"
|
||||
msgstr "mono"
|
||||
|
||||
msgid "interlaced"
|
||||
msgstr "prekladaný"
|
||||
|
||||
msgid "progressive"
|
||||
msgstr "progresívny"
|
||||
|
||||
msgid "reserved"
|
||||
msgstr "obsadený"
|
||||
|
||||
msgid "extended"
|
||||
msgstr "roz¹írený"
|
||||
|
||||
msgid "unknown"
|
||||
msgstr "neznámy"
|
||||
|
||||
msgid "component"
|
||||
msgstr "súèas»"
|
||||
|
||||
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é (CM)"
|
||||
|
||||
msgid "Music and Effects (ME)"
|
||||
msgstr "Hudba a efekty (ME)"
|
||||
|
||||
msgid "Visually Impaired (VI)"
|
||||
msgstr "zrakovo postihnutí (VI)"
|
||||
|
||||
msgid "Hearing Impaired (HI)"
|
||||
msgstr "sluchovo postihnutí (HI)"
|
||||
|
||||
msgid "Dialogue (D)"
|
||||
msgstr "Dialóg (D)"
|
||||
|
||||
msgid "Commentary (C)"
|
||||
msgstr "Komentár (C)"
|
||||
|
||||
msgid "Emergency (E)"
|
||||
msgstr "Pohotovostný (E)"
|
||||
|
||||
msgid "Voice Over (VO)"
|
||||
msgstr "Viacvrstvový hlas (VO)"
|
||||
|
||||
msgid "Karaoke"
|
||||
msgstr "Karaoke"
|
||||
|
||||
msgid "Ch1"
|
||||
msgstr "kanál1"
|
||||
|
||||
msgid "Ch2"
|
||||
msgstr "kaná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é"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "MHz"
|
||||
|
||||
msgid "free"
|
||||
msgstr "voµný"
|
||||
|
||||
msgid "Mbit/s"
|
||||
msgstr "Mbit/s"
|
||||
|
||||
msgid "kbit/s"
|
||||
msgstr "kbit/s"
|
407
po/uk_UA.po
407
po/uk_UA.po
@ -1,407 +0,0 @@
|
||||
# Ukrainian translation.
|
||||
# Copyright (C) 2010 The Claws Mail Team
|
||||
# This file is distributed under the same license as the claws-mail package.
|
||||
# Yarema aka Knedlyk <yupadmin@gmail.com>, 2010.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
||||
"Last-Translator: 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 "Video"
|
||||
msgstr "Відео"
|
||||
|
||||
msgid "AC-3"
|
||||
msgstr "AC-3"
|
||||
|
||||
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 "basic"
|
||||
msgstr "основне"
|
||||
|
||||
msgid "transponder"
|
||||
msgstr "транспондер"
|
||||
|
||||
msgid "stream"
|
||||
msgstr "потік"
|
||||
|
||||
msgid "dBm"
|
||||
msgstr "dBm"
|
||||
|
||||
msgid "dBuV"
|
||||
msgstr "dBuV"
|
||||
|
||||
msgid "dBV"
|
||||
msgstr "dBV"
|
||||
|
||||
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 "Signal level unit"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the used signal level unit."
|
||||
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 "Fixed"
|
||||
msgstr "Фіксовано"
|
||||
|
||||
msgid "Analog"
|
||||
msgstr "Аналог."
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr "MPEG-2"
|
||||
|
||||
msgid "H.264"
|
||||
msgstr "H.264"
|
||||
|
||||
msgid "H.265"
|
||||
msgstr "H.265"
|
||||
|
||||
msgid "MPEG-1 Layer I"
|
||||
msgstr "MPEG-1 Layer I"
|
||||
|
||||
msgid "MPEG-1 Layer II"
|
||||
msgstr "MPEG-1 Layer II"
|
||||
|
||||
msgid "MPEG-1 Layer III"
|
||||
msgstr "MPEG-1 Layer III"
|
||||
|
||||
msgid "MPEG-2 Layer I"
|
||||
msgstr "MPEG-2 Layer I"
|
||||
|
||||
msgid "MPEG-2 Layer II"
|
||||
msgstr "MPEG-2 Layer II"
|
||||
|
||||
msgid "MPEG-2 Layer III"
|
||||
msgstr "MPEG-2 Layer III"
|
||||
|
||||
msgid "HE-AAC"
|
||||
msgstr "HE-AAC"
|
||||
|
||||
msgid "LATM"
|
||||
msgstr "LATM"
|
||||
|
||||
msgid "stereo"
|
||||
msgstr "стерео"
|
||||
|
||||
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 "кбіт/с"
|
407
po/zh_CN.po
407
po/zh_CN.po
@ -1,407 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
||||
# This file is distributed under the same license as the femon package.
|
||||
# Nan Feng VDR <nfgx@21cn.com>, 2009.2
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
||||
"Last-Translator: NanFeng <nfgx@21cn.com>\n"
|
||||
"Language-Team: Chinese (simplified) <vdr@linuxtv.org>\n"
|
||||
"Language: zh_CN\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "DVB Signal Information Monitor (OSD)"
|
||||
msgstr "卫星信号信息显示(OSD)"
|
||||
|
||||
msgid "Signal Information"
|
||||
msgstr "频道信息浏览"
|
||||
|
||||
msgid "Femon not available"
|
||||
msgstr "Femon插件无法使用"
|
||||
|
||||
msgid "Video"
|
||||
msgstr "视频"
|
||||
|
||||
msgid "AC-3"
|
||||
msgstr "AC-3"
|
||||
|
||||
msgid "Audio"
|
||||
msgstr "音频"
|
||||
|
||||
msgid "Transponder Information"
|
||||
msgstr "转发器信息"
|
||||
|
||||
msgid "Apid"
|
||||
msgstr "Apid"
|
||||
|
||||
msgid "Dpid"
|
||||
msgstr "Dpid"
|
||||
|
||||
msgid "Spid"
|
||||
msgstr "Spid"
|
||||
|
||||
msgid "Nid"
|
||||
msgstr "Nid"
|
||||
|
||||
msgid "Tid"
|
||||
msgstr "Tid"
|
||||
|
||||
msgid "Rid"
|
||||
msgstr "Rid"
|
||||
|
||||
msgid "Coderate"
|
||||
msgstr "码速率"
|
||||
|
||||
msgid "Protocol"
|
||||
msgstr ""
|
||||
|
||||
msgid "Bitrate"
|
||||
msgstr "比特率"
|
||||
|
||||
msgid "Stream Information"
|
||||
msgstr "流信息"
|
||||
|
||||
msgid "Video Stream"
|
||||
msgstr "视频流"
|
||||
|
||||
msgid "Codec"
|
||||
msgstr "解码模式"
|
||||
|
||||
msgid "Aspect Ratio"
|
||||
msgstr "纵横比"
|
||||
|
||||
msgid "Frame Rate"
|
||||
msgstr "帧速率"
|
||||
|
||||
msgid "Video Format"
|
||||
msgstr "视频制式"
|
||||
|
||||
msgid "Resolution"
|
||||
msgstr "分辨率"
|
||||
|
||||
msgid "Audio Stream"
|
||||
msgstr "音频流"
|
||||
|
||||
msgid "Channel Mode"
|
||||
msgstr "声道模式"
|
||||
|
||||
msgid "Sampling Frequency"
|
||||
msgstr "采样频率"
|
||||
|
||||
msgid "AC-3 Stream"
|
||||
msgstr "AC-3流"
|
||||
|
||||
msgid "Bit Stream Mode"
|
||||
msgstr "比特流模式"
|
||||
|
||||
msgid "Audio Coding Mode"
|
||||
msgstr "音频编码模式"
|
||||
|
||||
msgid "Center Mix Level"
|
||||
msgstr "中心混合级别"
|
||||
|
||||
msgid "Surround Mix Level"
|
||||
msgstr "环绕混合级别"
|
||||
|
||||
msgid "Dolby Surround Mode"
|
||||
msgstr "杜比环绕声模式"
|
||||
|
||||
msgid "Low Frequency Effects"
|
||||
msgstr "低频效果"
|
||||
|
||||
msgid "Dialogue Normalization"
|
||||
msgstr "对话正常化"
|
||||
|
||||
msgid "basic"
|
||||
msgstr "基本"
|
||||
|
||||
msgid "transponder"
|
||||
msgstr "转发器"
|
||||
|
||||
msgid "stream"
|
||||
msgstr "数据流"
|
||||
|
||||
msgid "dBm"
|
||||
msgstr "dBm"
|
||||
|
||||
msgid "dBuV"
|
||||
msgstr "dBuV"
|
||||
|
||||
msgid "dBV"
|
||||
msgstr "dBV"
|
||||
|
||||
msgid "Classic"
|
||||
msgstr "经典"
|
||||
|
||||
msgid "Elchi"
|
||||
msgstr "Elchi"
|
||||
|
||||
msgid "ST:TNG"
|
||||
msgstr "ST:TNG"
|
||||
|
||||
msgid "DeepBlue"
|
||||
msgstr "DeepBlue"
|
||||
|
||||
msgid "Moronimo"
|
||||
msgstr "Moronimo"
|
||||
|
||||
msgid "Enigma"
|
||||
msgstr "Enigma"
|
||||
|
||||
msgid "EgalsTry"
|
||||
msgstr "EgalsTry"
|
||||
|
||||
msgid "Duotone"
|
||||
msgstr "双色调"
|
||||
|
||||
msgid "SilverGreen"
|
||||
msgstr "银绿"
|
||||
|
||||
msgid "PearlHD"
|
||||
msgstr "PearlHD"
|
||||
|
||||
msgid "Hide main menu entry"
|
||||
msgstr "隐藏主菜单条目."
|
||||
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr "确定是否进入主菜单是隐藏的."
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "默认启动时显示模式."
|
||||
|
||||
msgid "Define the default display mode at startup."
|
||||
msgstr "定义默认启动时显示模式."
|
||||
|
||||
msgid "Define the used OSD skin."
|
||||
msgstr "确定使用的菜单皮肤."
|
||||
|
||||
msgid "Define the used OSD theme."
|
||||
msgstr "确定使用的菜单主题."
|
||||
|
||||
msgid "Position"
|
||||
msgstr "位置"
|
||||
|
||||
msgid "Define the position of OSD."
|
||||
msgstr "确定菜单的位置."
|
||||
|
||||
msgid "Downscale OSD size [%]"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the downscale ratio for OSD size."
|
||||
msgstr ""
|
||||
|
||||
msgid "Signal level unit"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the used signal level unit."
|
||||
msgstr ""
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "红限制[ % ]"
|
||||
|
||||
msgid "Define a limit for red bar, which is used to indicate a bad signal."
|
||||
msgstr "定义一个限制红键,这是用来表示一个坏的信号."
|
||||
|
||||
msgid "Green limit [%]"
|
||||
msgstr "绿限制[ % ]"
|
||||
|
||||
msgid "Define a limit for green bar, which is used to indicate a good signal."
|
||||
msgstr "定义一个限制的绿色键,这是用来表示一个良好的信号."
|
||||
|
||||
msgid "OSD update interval [0.1s]"
|
||||
msgstr "菜单更新间隔时间 [0.1s]"
|
||||
|
||||
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
|
||||
msgstr "确定一个OSD的更新时间间隔.较小的间隔产生较高的CPU负载."
|
||||
|
||||
msgid "Analyze stream"
|
||||
msgstr "分析流"
|
||||
|
||||
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
|
||||
msgstr "确定是否DVB流分析和比特率计算."
|
||||
|
||||
msgid "Calculation interval [0.1s]"
|
||||
msgstr "计算时间间隔 [0.1s]"
|
||||
|
||||
msgid "Define an interval for calculation. The bigger interval generates more stable values."
|
||||
msgstr "定义一个时间间隔来计算.更大的时间价格产生将更稳定."
|
||||
|
||||
msgid "Use SVDRP service"
|
||||
msgstr "使用SVDRP服务"
|
||||
|
||||
msgid "Define whether the SVDRP service is used in client/server setups."
|
||||
msgstr "定义是否SVDRP服务是用来在客户机/服务器的设置."
|
||||
|
||||
msgid "SVDRP service port"
|
||||
msgstr "SVDRP服务端口"
|
||||
|
||||
msgid "Define the port number of SVDRP service."
|
||||
msgstr "定义SVDRP服务的端口号."
|
||||
|
||||
msgid "SVDRP service IP"
|
||||
msgstr "SVDRP服务的IP地址"
|
||||
|
||||
msgid "Define the IP address of SVDRP service."
|
||||
msgstr "定义SVDRP服务的IP地址."
|
||||
|
||||
msgid "Help"
|
||||
msgstr "帮助"
|
||||
|
||||
msgid "Fixed"
|
||||
msgstr "固定"
|
||||
|
||||
msgid "Analog"
|
||||
msgstr "模拟"
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr "MPEG-2"
|
||||
|
||||
msgid "H.264"
|
||||
msgstr "H.264"
|
||||
|
||||
msgid "H.265"
|
||||
msgstr "H.265"
|
||||
|
||||
msgid "MPEG-1 Layer I"
|
||||
msgstr "MPEG-1 Layer I"
|
||||
|
||||
msgid "MPEG-1 Layer II"
|
||||
msgstr "MPEG-1 Layer II"
|
||||
|
||||
msgid "MPEG-1 Layer III"
|
||||
msgstr "MPEG-1 Layer III"
|
||||
|
||||
msgid "MPEG-2 Layer I"
|
||||
msgstr "MPEG-2 Layer I"
|
||||
|
||||
msgid "MPEG-2 Layer II"
|
||||
msgstr "MPEG-2 Layer II"
|
||||
|
||||
msgid "MPEG-2 Layer III"
|
||||
msgstr "MPEG-2 Layer III"
|
||||
|
||||
msgid "HE-AAC"
|
||||
msgstr "HE-AAC"
|
||||
|
||||
msgid "LATM"
|
||||
msgstr "LATM"
|
||||
|
||||
msgid "stereo"
|
||||
msgstr "立体声"
|
||||
|
||||
msgid "joint Stereo"
|
||||
msgstr "联合立体声"
|
||||
|
||||
msgid "dual"
|
||||
msgstr "双重"
|
||||
|
||||
msgid "mono"
|
||||
msgstr "单声道"
|
||||
|
||||
msgid "interlaced"
|
||||
msgstr "隔行扫描"
|
||||
|
||||
msgid "progressive"
|
||||
msgstr "进步"
|
||||
|
||||
msgid "reserved"
|
||||
msgstr "保留"
|
||||
|
||||
msgid "extended"
|
||||
msgstr "扩展"
|
||||
|
||||
msgid "unknown"
|
||||
msgstr "未知"
|
||||
|
||||
msgid "component"
|
||||
msgstr "组件"
|
||||
|
||||
msgid "PAL"
|
||||
msgstr "PAL"
|
||||
|
||||
msgid "NTSC"
|
||||
msgstr "NTSC"
|
||||
|
||||
msgid "SECAM"
|
||||
msgstr "SECAM"
|
||||
|
||||
msgid "MAC"
|
||||
msgstr "MAC"
|
||||
|
||||
msgid "Hz"
|
||||
msgstr "赫兹"
|
||||
|
||||
msgid "Complete Main (CM)"
|
||||
msgstr "完成主要 (CM)"
|
||||
|
||||
msgid "Music and Effects (ME)"
|
||||
msgstr "音乐和效果 (ME)"
|
||||
|
||||
msgid "Visually Impaired (VI)"
|
||||
msgstr "视障 (VI)"
|
||||
|
||||
msgid "Hearing Impaired (HI)"
|
||||
msgstr "听障 (HI)"
|
||||
|
||||
msgid "Dialogue (D)"
|
||||
msgstr "对话 (D)"
|
||||
|
||||
msgid "Commentary (C)"
|
||||
msgstr "评论 (C)"
|
||||
|
||||
msgid "Emergency (E)"
|
||||
msgstr "紧急 (E)"
|
||||
|
||||
msgid "Voice Over (VO)"
|
||||
msgstr "旁白 (VO)"
|
||||
|
||||
msgid "Karaoke"
|
||||
msgstr "卡拉OK"
|
||||
|
||||
msgid "Ch1"
|
||||
msgstr "Ch1"
|
||||
|
||||
msgid "Ch2"
|
||||
msgstr "Ch2"
|
||||
|
||||
msgid "C"
|
||||
msgstr "C"
|
||||
|
||||
msgid "L"
|
||||
msgstr "L"
|
||||
|
||||
msgid "R"
|
||||
msgstr "R"
|
||||
|
||||
msgid "S"
|
||||
msgstr "S"
|
||||
|
||||
msgid "SL"
|
||||
msgstr "SL"
|
||||
|
||||
msgid "SR"
|
||||
msgstr "SR"
|
||||
|
||||
msgid "dB"
|
||||
msgstr "dB"
|
||||
|
||||
msgid "not indicated"
|
||||
msgstr "没有说明"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "兆赫兹"
|
||||
|
||||
msgid "free"
|
||||
msgstr "免费"
|
||||
|
||||
msgid "Mbit/s"
|
||||
msgstr "兆位/秒"
|
||||
|
||||
msgid "kbit/s"
|
||||
msgstr "千字节/秒"
|
407
po/zh_TW.po
407
po/zh_TW.po
@ -1,407 +0,0 @@
|
||||
# VDR plugin language source file.
|
||||
# Copyright (C) 2007-2019 Rolf Ahrenberg
|
||||
# This file is distributed under the same license as the femon package.
|
||||
# Nan Feng VDR <nfgx@21cn.com>, 2009.2
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: vdr-femon 2.4.0\n"
|
||||
"Report-Msgid-Bugs-To: <see README>\n"
|
||||
"POT-Creation-Date: 2018-04-15 04:15+0300\n"
|
||||
"PO-Revision-Date: 2018-04-15 04:15+0300\n"
|
||||
"Last-Translator: NanFeng <nfgx@21cn.com>\n"
|
||||
"Language-Team: Chinese (traditional) <vdr@linuxtv.org>\n"
|
||||
"Language: zh_TW\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
msgid "DVB Signal Information Monitor (OSD)"
|
||||
msgstr "衛星信號信息顯示(OSD)"
|
||||
|
||||
msgid "Signal Information"
|
||||
msgstr "頻道信息瀏覽"
|
||||
|
||||
msgid "Femon not available"
|
||||
msgstr "Femon插件無法使用"
|
||||
|
||||
msgid "Video"
|
||||
msgstr "視頻"
|
||||
|
||||
msgid "AC-3"
|
||||
msgstr "AC-3"
|
||||
|
||||
msgid "Audio"
|
||||
msgstr "音頻"
|
||||
|
||||
msgid "Transponder Information"
|
||||
msgstr "轉發器信息"
|
||||
|
||||
msgid "Apid"
|
||||
msgstr "Apid"
|
||||
|
||||
msgid "Dpid"
|
||||
msgstr "Dpid"
|
||||
|
||||
msgid "Spid"
|
||||
msgstr "Spid"
|
||||
|
||||
msgid "Nid"
|
||||
msgstr "Nid"
|
||||
|
||||
msgid "Tid"
|
||||
msgstr "Tid"
|
||||
|
||||
msgid "Rid"
|
||||
msgstr "Rid"
|
||||
|
||||
msgid "Coderate"
|
||||
msgstr "碼速率"
|
||||
|
||||
msgid "Protocol"
|
||||
msgstr ""
|
||||
|
||||
msgid "Bitrate"
|
||||
msgstr "比特率"
|
||||
|
||||
msgid "Stream Information"
|
||||
msgstr "流信息"
|
||||
|
||||
msgid "Video Stream"
|
||||
msgstr "視頻流"
|
||||
|
||||
msgid "Codec"
|
||||
msgstr "解碼模式"
|
||||
|
||||
msgid "Aspect Ratio"
|
||||
msgstr "縱橫比"
|
||||
|
||||
msgid "Frame Rate"
|
||||
msgstr "幀速率"
|
||||
|
||||
msgid "Video Format"
|
||||
msgstr "視頻制式"
|
||||
|
||||
msgid "Resolution"
|
||||
msgstr "分辨率"
|
||||
|
||||
msgid "Audio Stream"
|
||||
msgstr "音頻流"
|
||||
|
||||
msgid "Channel Mode"
|
||||
msgstr "聲道模式"
|
||||
|
||||
msgid "Sampling Frequency"
|
||||
msgstr "採樣頻率"
|
||||
|
||||
msgid "AC-3 Stream"
|
||||
msgstr "AC-3流"
|
||||
|
||||
msgid "Bit Stream Mode"
|
||||
msgstr "比特流模式"
|
||||
|
||||
msgid "Audio Coding Mode"
|
||||
msgstr "音頻編碼模式"
|
||||
|
||||
msgid "Center Mix Level"
|
||||
msgstr "中心混合級別"
|
||||
|
||||
msgid "Surround Mix Level"
|
||||
msgstr "環繞混合級別"
|
||||
|
||||
msgid "Dolby Surround Mode"
|
||||
msgstr "杜比環繞聲模式"
|
||||
|
||||
msgid "Low Frequency Effects"
|
||||
msgstr "低頻效果"
|
||||
|
||||
msgid "Dialogue Normalization"
|
||||
msgstr "對話正常化"
|
||||
|
||||
msgid "basic"
|
||||
msgstr "基本"
|
||||
|
||||
msgid "transponder"
|
||||
msgstr "轉發器"
|
||||
|
||||
msgid "stream"
|
||||
msgstr "數據流"
|
||||
|
||||
msgid "dBm"
|
||||
msgstr "dBm"
|
||||
|
||||
msgid "dBuV"
|
||||
msgstr "dBuV"
|
||||
|
||||
msgid "dBV"
|
||||
msgstr "dBV"
|
||||
|
||||
msgid "Classic"
|
||||
msgstr "經典"
|
||||
|
||||
msgid "Elchi"
|
||||
msgstr "Elchi"
|
||||
|
||||
msgid "ST:TNG"
|
||||
msgstr "ST:TNG"
|
||||
|
||||
msgid "DeepBlue"
|
||||
msgstr "DeepBlue"
|
||||
|
||||
msgid "Moronimo"
|
||||
msgstr "Moronimo"
|
||||
|
||||
msgid "Enigma"
|
||||
msgstr "Enigma"
|
||||
|
||||
msgid "EgalsTry"
|
||||
msgstr "EgalsTry"
|
||||
|
||||
msgid "Duotone"
|
||||
msgstr "雙色調"
|
||||
|
||||
msgid "SilverGreen"
|
||||
msgstr "銀綠"
|
||||
|
||||
msgid "PearlHD"
|
||||
msgstr "PearlHD"
|
||||
|
||||
msgid "Hide main menu entry"
|
||||
msgstr "隱藏主菜單條目."
|
||||
|
||||
msgid "Define whether the main menu entry is hidden."
|
||||
msgstr "確定是否進入主菜單是隱藏的."
|
||||
|
||||
msgid "Default display mode"
|
||||
msgstr "默認啟動時顯示模式."
|
||||
|
||||
msgid "Define the default display mode at startup."
|
||||
msgstr "定義默認啟動時顯示模式."
|
||||
|
||||
msgid "Define the used OSD skin."
|
||||
msgstr "確定使用的菜單皮膚."
|
||||
|
||||
msgid "Define the used OSD theme."
|
||||
msgstr "確定使用的菜單主題."
|
||||
|
||||
msgid "Position"
|
||||
msgstr "位置"
|
||||
|
||||
msgid "Define the position of OSD."
|
||||
msgstr "確定菜單的位置."
|
||||
|
||||
msgid "Downscale OSD size [%]"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the downscale ratio for OSD size."
|
||||
msgstr ""
|
||||
|
||||
msgid "Signal level unit"
|
||||
msgstr ""
|
||||
|
||||
msgid "Define the used signal level unit."
|
||||
msgstr ""
|
||||
|
||||
msgid "Red limit [%]"
|
||||
msgstr "紅限制[ % ]"
|
||||
|
||||
msgid "Define a limit for red bar, which is used to indicate a bad signal."
|
||||
msgstr "定義一個限制紅鍵,這是用來表示一個壞的信號."
|
||||
|
||||
msgid "Green limit [%]"
|
||||
msgstr "綠限制[ % ]"
|
||||
|
||||
msgid "Define a limit for green bar, which is used to indicate a good signal."
|
||||
msgstr "定義一個限制的綠色鍵,這是用來表示一個良好的信號."
|
||||
|
||||
msgid "OSD update interval [0.1s]"
|
||||
msgstr "菜單更新間隔時間[0.1s]"
|
||||
|
||||
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
|
||||
msgstr "確定一個OSD的更新時間間隔.較小的間隔產生較高的CPU負載."
|
||||
|
||||
msgid "Analyze stream"
|
||||
msgstr "分析流"
|
||||
|
||||
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
|
||||
msgstr "確定是否DVB流分析和比特率計算."
|
||||
|
||||
msgid "Calculation interval [0.1s]"
|
||||
msgstr "計算時間間隔[0.1s]"
|
||||
|
||||
msgid "Define an interval for calculation. The bigger interval generates more stable values."
|
||||
msgstr "定義一個時間間隔來計算.更大的時間價格產生將更穩定."
|
||||
|
||||
msgid "Use SVDRP service"
|
||||
msgstr "使用SVDRP服務"
|
||||
|
||||
msgid "Define whether the SVDRP service is used in client/server setups."
|
||||
msgstr "定義是否SVDRP服務是用來在客戶機/服務器的設置."
|
||||
|
||||
msgid "SVDRP service port"
|
||||
msgstr "SVDRP服務端口"
|
||||
|
||||
msgid "Define the port number of SVDRP service."
|
||||
msgstr "定義SVDRP服務的端口號."
|
||||
|
||||
msgid "SVDRP service IP"
|
||||
msgstr "SVDRP服務的IP地址"
|
||||
|
||||
msgid "Define the IP address of SVDRP service."
|
||||
msgstr "定義SVDRP服務的IP地址."
|
||||
|
||||
msgid "Help"
|
||||
msgstr "幫助"
|
||||
|
||||
msgid "Fixed"
|
||||
msgstr "固定"
|
||||
|
||||
msgid "Analog"
|
||||
msgstr "模擬"
|
||||
|
||||
msgid "MPEG-2"
|
||||
msgstr "MPEG-2"
|
||||
|
||||
msgid "H.264"
|
||||
msgstr "H.264"
|
||||
|
||||
msgid "H.265"
|
||||
msgstr "H.265"
|
||||
|
||||
msgid "MPEG-1 Layer I"
|
||||
msgstr "MPEG-1 Layer I"
|
||||
|
||||
msgid "MPEG-1 Layer II"
|
||||
msgstr "MPEG-1 Layer II"
|
||||
|
||||
msgid "MPEG-1 Layer III"
|
||||
msgstr "MPEG-1 Layer III"
|
||||
|
||||
msgid "MPEG-2 Layer I"
|
||||
msgstr "MPEG-2 Layer I"
|
||||
|
||||
msgid "MPEG-2 Layer II"
|
||||
msgstr "MPEG-2 Layer II"
|
||||
|
||||
msgid "MPEG-2 Layer III"
|
||||
msgstr "MPEG-2 Layer III"
|
||||
|
||||
msgid "HE-AAC"
|
||||
msgstr "HE-AAC"
|
||||
|
||||
msgid "LATM"
|
||||
msgstr "LATM"
|
||||
|
||||
msgid "stereo"
|
||||
msgstr "立體聲"
|
||||
|
||||
msgid "joint Stereo"
|
||||
msgstr "聯合立體聲"
|
||||
|
||||
msgid "dual"
|
||||
msgstr "雙重"
|
||||
|
||||
msgid "mono"
|
||||
msgstr "單聲道"
|
||||
|
||||
msgid "interlaced"
|
||||
msgstr "隔行掃描"
|
||||
|
||||
msgid "progressive"
|
||||
msgstr "進步"
|
||||
|
||||
msgid "reserved"
|
||||
msgstr "保留"
|
||||
|
||||
msgid "extended"
|
||||
msgstr "擴展"
|
||||
|
||||
msgid "unknown"
|
||||
msgstr "未知"
|
||||
|
||||
msgid "component"
|
||||
msgstr "組件"
|
||||
|
||||
msgid "PAL"
|
||||
msgstr "PAL"
|
||||
|
||||
msgid "NTSC"
|
||||
msgstr "NTSC"
|
||||
|
||||
msgid "SECAM"
|
||||
msgstr "SECAM"
|
||||
|
||||
msgid "MAC"
|
||||
msgstr "MAC"
|
||||
|
||||
msgid "Hz"
|
||||
msgstr "赫茲"
|
||||
|
||||
msgid "Complete Main (CM)"
|
||||
msgstr "完成主要(CM)"
|
||||
|
||||
msgid "Music and Effects (ME)"
|
||||
msgstr "音樂和效果(ME)"
|
||||
|
||||
msgid "Visually Impaired (VI)"
|
||||
msgstr "視障(VI)"
|
||||
|
||||
msgid "Hearing Impaired (HI)"
|
||||
msgstr "聽障(HI)"
|
||||
|
||||
msgid "Dialogue (D)"
|
||||
msgstr "對話(D)"
|
||||
|
||||
msgid "Commentary (C)"
|
||||
msgstr "評論(C)"
|
||||
|
||||
msgid "Emergency (E)"
|
||||
msgstr "緊急(E)"
|
||||
|
||||
msgid "Voice Over (VO)"
|
||||
msgstr "旁白(VO)"
|
||||
|
||||
msgid "Karaoke"
|
||||
msgstr "卡拉OK"
|
||||
|
||||
msgid "Ch1"
|
||||
msgstr "Ch1"
|
||||
|
||||
msgid "Ch2"
|
||||
msgstr "Ch2"
|
||||
|
||||
msgid "C"
|
||||
msgstr "C"
|
||||
|
||||
msgid "L"
|
||||
msgstr "L"
|
||||
|
||||
msgid "R"
|
||||
msgstr "R"
|
||||
|
||||
msgid "S"
|
||||
msgstr "S"
|
||||
|
||||
msgid "SL"
|
||||
msgstr "SL"
|
||||
|
||||
msgid "SR"
|
||||
msgstr "SR"
|
||||
|
||||
msgid "dB"
|
||||
msgstr "dB"
|
||||
|
||||
msgid "not indicated"
|
||||
msgstr "沒有說明"
|
||||
|
||||
msgid "MHz"
|
||||
msgstr "兆赫茲"
|
||||
|
||||
msgid "free"
|
||||
msgstr "免費"
|
||||
|
||||
msgid "Mbit/s"
|
||||
msgstr "兆位/秒"
|
||||
|
||||
msgid "kbit/s"
|
||||
msgstr "千字節/秒"
|
259
receiver.c
259
receiver.c
@ -1,259 +0,0 @@
|
||||
/*
|
||||
* receiver.c: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "log.h"
|
||||
#include "tools.h"
|
||||
#include "receiver.h"
|
||||
|
||||
cFemonReceiver::cFemonReceiver(const cChannel *channelP, int aTrackP, int dTrackP)
|
||||
: cReceiver(channelP),
|
||||
cThread("femon receiver"),
|
||||
mutexM(),
|
||||
sleepM(),
|
||||
activeM(false),
|
||||
detectH264M(this),
|
||||
detectH265M(this),
|
||||
detectMpegM(this, this),
|
||||
detectAacM(this),
|
||||
detectLatmM(this),
|
||||
detectAc3M(this),
|
||||
videoBufferM(KILOBYTE(512), TS_SIZE, false, "Femon video"),
|
||||
videoTypeM(channelP ? channelP->Vtype(): 0),
|
||||
videoPidM(channelP ? channelP->Vpid() : 0),
|
||||
videoPacketCountM(0),
|
||||
videoBitRateM(0.0),
|
||||
videoValidM(false),
|
||||
audioBufferM(KILOBYTE(256), TS_SIZE, false, "Femon audio"),
|
||||
audioPidM(channelP ? channelP->Apid(aTrackP) : 0),
|
||||
audioPacketCountM(0),
|
||||
audioBitRateM(0.0),
|
||||
audioValidM(false),
|
||||
ac3BufferM(KILOBYTE(256), TS_SIZE, false, "Femon AC3"),
|
||||
ac3PidM(channelP ? channelP->Dpid(dTrackP) : 0),
|
||||
ac3PacketCountM(0),
|
||||
ac3BitRateM(0),
|
||||
ac3ValidM(false)
|
||||
{
|
||||
debug1("%s (, %d, %d)", __PRETTY_FUNCTION__, aTrackP, dTrackP);
|
||||
|
||||
SetPids(NULL);
|
||||
AddPid(videoPidM);
|
||||
AddPid(audioPidM);
|
||||
AddPid(ac3PidM);
|
||||
|
||||
videoBufferM.SetTimeouts(0, 100);
|
||||
audioBufferM.SetTimeouts(0, 100);
|
||||
ac3BufferM.SetTimeouts(0, 100);
|
||||
|
||||
videoInfoM.codec = VIDEO_CODEC_INVALID;
|
||||
videoInfoM.format = VIDEO_FORMAT_INVALID;
|
||||
videoInfoM.scan = VIDEO_SCAN_INVALID;
|
||||
videoInfoM.aspectRatio = VIDEO_ASPECT_RATIO_INVALID;
|
||||
videoInfoM.width = 0;
|
||||
videoInfoM.height = 0;
|
||||
videoInfoM.frameRate = 0;
|
||||
videoInfoM.bitrate = AUDIO_BITRATE_INVALID;
|
||||
audioInfoM.codec = AUDIO_CODEC_UNKNOWN;
|
||||
audioInfoM.bitrate = AUDIO_BITRATE_INVALID;
|
||||
audioInfoM.samplingFrequency = AUDIO_SAMPLING_FREQUENCY_INVALID;
|
||||
audioInfoM.channelMode = AUDIO_CHANNEL_MODE_INVALID;
|
||||
ac3InfoM.bitrate = AUDIO_BITRATE_INVALID;
|
||||
ac3InfoM.samplingFrequency = AUDIO_SAMPLING_FREQUENCY_INVALID;
|
||||
ac3InfoM.bitstreamMode = AUDIO_BITSTREAM_MODE_INVALID;
|
||||
ac3InfoM.audioCodingMode = AUDIO_CODING_MODE_INVALID;
|
||||
ac3InfoM.dolbySurroundMode = AUDIO_DOLBY_SURROUND_MODE_INVALID;
|
||||
ac3InfoM.centerMixLevel = AUDIO_CENTER_MIX_LEVEL_INVALID;
|
||||
ac3InfoM.surroundMixLevel = AUDIO_SURROUND_MIX_LEVEL_INVALID;
|
||||
ac3InfoM.dialogLevel = 0;
|
||||
ac3InfoM.lfe = false;
|
||||
}
|
||||
|
||||
cFemonReceiver::~cFemonReceiver(void)
|
||||
{
|
||||
debug1("%s", __PRETTY_FUNCTION__);
|
||||
Deactivate();
|
||||
}
|
||||
|
||||
void cFemonReceiver::Deactivate(void)
|
||||
{
|
||||
debug1("%s", __PRETTY_FUNCTION__);
|
||||
Detach();
|
||||
if (activeM) {
|
||||
activeM = false;
|
||||
sleepM.Signal();
|
||||
if (Running())
|
||||
Cancel(3);
|
||||
}
|
||||
}
|
||||
|
||||
void cFemonReceiver::Activate(bool onP)
|
||||
{
|
||||
debug1("%s (%d)", __PRETTY_FUNCTION__, onP);
|
||||
if (onP)
|
||||
Start();
|
||||
else
|
||||
Deactivate();
|
||||
}
|
||||
|
||||
void cFemonReceiver::Receive(const uchar *dataP, int lengthP)
|
||||
{
|
||||
// TS packet length: TS_SIZE
|
||||
if (Running() && (*dataP == TS_SYNC_BYTE) && (lengthP == TS_SIZE)) {
|
||||
int len, pid = TsPid(dataP);
|
||||
if (pid == videoPidM) {
|
||||
++videoPacketCountM;
|
||||
len = videoBufferM.Put(dataP, lengthP);
|
||||
if (len != lengthP) {
|
||||
videoBufferM.ReportOverflow(lengthP - len);
|
||||
videoBufferM.Clear();
|
||||
}
|
||||
}
|
||||
else if (pid == audioPidM) {
|
||||
++audioPacketCountM;
|
||||
len = audioBufferM.Put(dataP, lengthP);
|
||||
if (len != lengthP) {
|
||||
audioBufferM.ReportOverflow(lengthP - len);
|
||||
audioBufferM.Clear();
|
||||
}
|
||||
}
|
||||
else if (pid == ac3PidM) {
|
||||
++ac3PacketCountM;
|
||||
len = ac3BufferM.Put(dataP, lengthP);
|
||||
if (len != lengthP) {
|
||||
ac3BufferM.ReportOverflow(lengthP - len);
|
||||
ac3BufferM.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void cFemonReceiver::Action(void)
|
||||
{
|
||||
debug1("%s", __PRETTY_FUNCTION__);
|
||||
cTimeMs calcPeriod(0);
|
||||
activeM = true;
|
||||
|
||||
while (Running() && activeM) {
|
||||
uint8_t *Data;
|
||||
double timeout;
|
||||
int len, Length;
|
||||
bool processed = false;
|
||||
|
||||
// process available video data
|
||||
while ((Data = videoBufferM.Get(Length))) {
|
||||
if (!activeM || (Length < TS_SIZE))
|
||||
break;
|
||||
Length = TS_SIZE;
|
||||
if (*Data != TS_SYNC_BYTE) {
|
||||
for (int i = 1; i < Length; ++i) {
|
||||
if (Data[i] == TS_SYNC_BYTE) {
|
||||
Length = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
videoBufferM.Del(Length);
|
||||
continue;
|
||||
}
|
||||
processed = true;
|
||||
if (TsPayloadStart(Data)) {
|
||||
while (const uint8_t *p = videoAssemblerM.GetPes(len)) {
|
||||
if (videoTypeM == 0x1B) {
|
||||
if (detectH264M.processVideo(p, len)) {
|
||||
videoValidM = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (videoTypeM == 0x24) {
|
||||
if (detectH265M.processVideo(p, len)) {
|
||||
videoValidM = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (detectMpegM.processVideo(p, len)) {
|
||||
videoValidM = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
videoAssemblerM.Reset();
|
||||
}
|
||||
videoAssemblerM.PutTs(Data, Length);
|
||||
videoBufferM.Del(Length);
|
||||
}
|
||||
|
||||
// process available audio data
|
||||
while ((Data = audioBufferM.Get(Length))) {
|
||||
if (!activeM || (Length < TS_SIZE))
|
||||
break;
|
||||
Length = TS_SIZE;
|
||||
if (*Data != TS_SYNC_BYTE) {
|
||||
for (int i = 1; i < Length; ++i) {
|
||||
if (Data[i] == TS_SYNC_BYTE) {
|
||||
Length = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
audioBufferM.Del(Length);
|
||||
continue;
|
||||
}
|
||||
processed = true;
|
||||
if (const uint8_t *p = audioAssemblerM.GetPes(len)) {
|
||||
if (detectAacM.processAudio(p, len) || detectLatmM.processAudio(p, len) || detectMpegM.processAudio(p, len))
|
||||
audioValidM = true;
|
||||
audioAssemblerM.Reset();
|
||||
}
|
||||
audioAssemblerM.PutTs(Data, Length);
|
||||
audioBufferM.Del(Length);
|
||||
}
|
||||
|
||||
// process available dolby data
|
||||
while ((Data = ac3BufferM.Get(Length))) {
|
||||
if (!activeM || (Length < TS_SIZE))
|
||||
break;
|
||||
Length = TS_SIZE;
|
||||
if (*Data != TS_SYNC_BYTE) {
|
||||
for (int i = 1; i < Length; ++i) {
|
||||
if (Data[i] == TS_SYNC_BYTE) {
|
||||
Length = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
ac3BufferM.Del(Length);
|
||||
continue;
|
||||
}
|
||||
processed = true;
|
||||
if (const uint8_t *p = ac3AssemblerM.GetPes(len)) {
|
||||
if (detectAc3M.processAudio(p, len))
|
||||
ac3ValidM = true;
|
||||
ac3AssemblerM.Reset();
|
||||
}
|
||||
ac3AssemblerM.PutTs(Data, Length);
|
||||
ac3BufferM.Del(Length);
|
||||
}
|
||||
|
||||
// calculate bitrates
|
||||
timeout = double(calcPeriod.Elapsed());
|
||||
if (activeM && (timeout >= (100.0 * FemonConfig.GetCalcInterval()))) {
|
||||
// TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit
|
||||
// PES headers should be compensated!
|
||||
videoBitRateM = (1000.0 * 8.0 * 184.0 * videoPacketCountM) / timeout;
|
||||
videoPacketCountM = 0;
|
||||
audioBitRateM = (1000.0 * 8.0 * 184.0 * audioPacketCountM) / timeout;
|
||||
audioPacketCountM = 0;
|
||||
ac3BitRateM = (1000.0 * 8.0 * 184.0 * ac3PacketCountM) / timeout;
|
||||
ac3PacketCountM = 0;
|
||||
calcPeriod.Set(0);
|
||||
}
|
||||
|
||||
if (!processed)
|
||||
sleepM.Wait(10); // to avoid busy loop and reduce cpu load
|
||||
}
|
||||
}
|
180
receiver.h
180
receiver.h
@ -1,180 +0,0 @@
|
||||
/*
|
||||
* receiver.h: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __FEMON_RECEIVER_H
|
||||
#define __FEMON_RECEIVER_H
|
||||
|
||||
#include <vdr/thread.h>
|
||||
#include <vdr/receiver.h>
|
||||
|
||||
#include "aac.h"
|
||||
#include "ac3.h"
|
||||
#include "audio.h"
|
||||
#include "h264.h"
|
||||
#include "h265.h"
|
||||
#include "latm.h"
|
||||
#include "mpeg.h"
|
||||
#include "tools.h"
|
||||
#include "video.h"
|
||||
|
||||
class cFemonReceiver : public cReceiver, public cThread, public cFemonVideoIf, public cFemonAudioIf, public cFemonAC3If {
|
||||
private:
|
||||
cMutex mutexM;
|
||||
cCondWait sleepM;
|
||||
bool activeM;
|
||||
|
||||
cFemonH264 detectH264M;
|
||||
cFemonH265 detectH265M;
|
||||
cFemonMPEG detectMpegM;
|
||||
cFemonAAC detectAacM;
|
||||
cFemonLATM detectLatmM;
|
||||
cFemonAC3 detectAc3M;
|
||||
|
||||
cRingBufferLinear videoBufferM;
|
||||
cTsToPes videoAssemblerM;
|
||||
int videoTypeM;
|
||||
int videoPidM;
|
||||
int videoPacketCountM;
|
||||
double videoBitRateM;
|
||||
bool videoValidM;
|
||||
video_info_t videoInfoM;
|
||||
|
||||
cRingBufferLinear audioBufferM;
|
||||
cTsToPes audioAssemblerM;
|
||||
int audioPidM;
|
||||
int audioPacketCountM;
|
||||
double audioBitRateM;
|
||||
bool audioValidM;
|
||||
audio_info_t audioInfoM;
|
||||
|
||||
cRingBufferLinear ac3BufferM;
|
||||
cTsToPes ac3AssemblerM;
|
||||
int ac3PidM;
|
||||
int ac3PacketCountM;
|
||||
double ac3BitRateM;
|
||||
bool ac3ValidM;
|
||||
ac3_info_t ac3InfoM;
|
||||
|
||||
protected:
|
||||
virtual void Activate(bool onP);
|
||||
virtual void Receive(const uchar *dataP, int lengthP);
|
||||
virtual void Action(void);
|
||||
|
||||
public:
|
||||
virtual void SetVideoCodec(eVideoCodec codecP) { cMutexLock MutexLock(&mutexM);
|
||||
videoInfoM.codec = codecP; }
|
||||
virtual void SetVideoFormat(eVideoFormat formatP) { cMutexLock MutexLock(&mutexM);
|
||||
videoInfoM.format = formatP; }
|
||||
virtual void SetVideoScan(eVideoScan scanP) { cMutexLock MutexLock(&mutexM);
|
||||
videoInfoM.scan = scanP; }
|
||||
virtual void SetVideoAspectRatio(eVideoAspectRatio aspectRatioP) { cMutexLock MutexLock(&mutexM);
|
||||
videoInfoM.aspectRatio = aspectRatioP; }
|
||||
virtual void SetVideoSize(int widthP, int heightP) { cMutexLock MutexLock(&mutexM);
|
||||
videoInfoM.width = widthP;
|
||||
videoInfoM.height = heightP; }
|
||||
virtual void SetVideoFramerate(double frameRateP) { cMutexLock MutexLock(&mutexM);
|
||||
videoInfoM.frameRate = frameRateP; }
|
||||
virtual void SetVideoBitrate(double bitRateP) { cMutexLock MutexLock(&mutexM);
|
||||
videoInfoM.bitrate = bitRateP; }
|
||||
|
||||
virtual void SetAudioCodec(eAudioCodec codecP) { cMutexLock MutexLock(&mutexM);
|
||||
audioInfoM.codec = codecP; }
|
||||
virtual void SetAudioBitrate(double bitRateP) { cMutexLock MutexLock(&mutexM);
|
||||
audioInfoM.bitrate = bitRateP; }
|
||||
virtual void SetAudioSamplingFrequency(int samplingP) { cMutexLock MutexLock(&mutexM);
|
||||
audioInfoM.samplingFrequency = samplingP; }
|
||||
virtual void SetAudioChannel(eAudioChannelMode modeP) { cMutexLock MutexLock(&mutexM);
|
||||
audioInfoM.channelMode = modeP; }
|
||||
|
||||
virtual void SetAC3Bitrate(int bitRateP) { cMutexLock MutexLock(&mutexM);
|
||||
ac3InfoM.bitrate = bitRateP; }
|
||||
virtual void SetAC3SamplingFrequency(int samplingP) { cMutexLock MutexLock(&mutexM);
|
||||
ac3InfoM.samplingFrequency = samplingP; }
|
||||
virtual void SetAC3Bitstream(int modeP) { cMutexLock MutexLock(&mutexM);
|
||||
ac3InfoM.bitstreamMode = modeP; }
|
||||
virtual void SetAC3AudioCoding(int modeP) { cMutexLock MutexLock(&mutexM);
|
||||
ac3InfoM.audioCodingMode = modeP; }
|
||||
virtual void SetAC3DolbySurround(int modeP) { cMutexLock MutexLock(&mutexM);
|
||||
ac3InfoM.dolbySurroundMode = modeP; }
|
||||
virtual void SetAC3CenterMix(int levelP) { cMutexLock MutexLock(&mutexM);
|
||||
ac3InfoM.centerMixLevel = levelP; }
|
||||
virtual void SetAC3SurroundMix(int levelP) { cMutexLock MutexLock(&mutexM);
|
||||
ac3InfoM.surroundMixLevel = levelP; }
|
||||
virtual void SetAC3Dialog(int levelP) { cMutexLock MutexLock(&mutexM);
|
||||
ac3InfoM.dialogLevel = levelP; }
|
||||
virtual void SetAC3LFE(bool onoffP) { cMutexLock MutexLock(&mutexM);
|
||||
ac3InfoM.lfe = onoffP; }
|
||||
|
||||
public:
|
||||
cFemonReceiver(const cChannel* channelP, int aTrackp, int dTrackP);
|
||||
virtual ~cFemonReceiver();
|
||||
void Deactivate(void);
|
||||
|
||||
bool VideoValid(void) { cMutexLock MutexLock(&mutexM);
|
||||
return videoValidM; }; // boolean
|
||||
double VideoBitrate(void) { cMutexLock MutexLock(&mutexM);
|
||||
return videoBitRateM; }; // bit/s
|
||||
int VideoCodec(void) { cMutexLock MutexLock(&mutexM);
|
||||
return videoInfoM.codec; }; // eVideoCodec
|
||||
int VideoFormat(void) { cMutexLock MutexLock(&mutexM);
|
||||
return videoInfoM.format; }; // eVideoFormat
|
||||
int VideoScan(void) { cMutexLock MutexLock(&mutexM);
|
||||
return videoInfoM.scan; }; // eVideoScan
|
||||
int VideoAspectRatio(void) { cMutexLock MutexLock(&mutexM);
|
||||
return videoInfoM.aspectRatio; }; // eVideoAspectRatio
|
||||
int VideoHorizontalSize(void) { cMutexLock MutexLock(&mutexM);
|
||||
return videoInfoM.width; }; // pixels
|
||||
int VideoVerticalSize(void) { cMutexLock MutexLock(&mutexM);
|
||||
return videoInfoM.height; }; // pixels
|
||||
double VideoFrameRate(void) { cMutexLock MutexLock(&mutexM);
|
||||
return videoInfoM.frameRate; }; // Hz
|
||||
double VideoStreamBitrate(void) { cMutexLock MutexLock(&mutexM);
|
||||
return videoInfoM.bitrate; }; // bit/s
|
||||
|
||||
bool AudioValid(void) { cMutexLock MutexLock(&mutexM);
|
||||
return audioValidM; }; // boolean
|
||||
double AudioBitrate(void) { cMutexLock MutexLock(&mutexM);
|
||||
return audioBitRateM; }; // bit/s
|
||||
int AudioCodec(void) { cMutexLock MutexLock(&mutexM);
|
||||
return audioInfoM.codec; }; // eAudioCodec
|
||||
int AudioChannelMode(void) { cMutexLock MutexLock(&mutexM);
|
||||
return audioInfoM.channelMode; }; // eAudioChannelMode
|
||||
double AudioStreamBitrate(void) { cMutexLock MutexLock(&mutexM);
|
||||
return audioInfoM.bitrate; }; // bit/s or eAudioBitrate
|
||||
int AudioSamplingFreq(void) { cMutexLock MutexLock(&mutexM);
|
||||
return audioInfoM.samplingFrequency; }; // Hz or eAudioSamplingFrequency
|
||||
|
||||
bool AC3Valid(void) { cMutexLock MutexLock(&mutexM);
|
||||
return ac3ValidM; }; // boolean
|
||||
double AC3Bitrate(void) { cMutexLock MutexLock(&mutexM);
|
||||
return ac3BitRateM; }; // bit/s
|
||||
double AC3StreamBitrate(void) { cMutexLock MutexLock(&mutexM);
|
||||
return ac3InfoM.bitrate; }; // bit/s or eAudioBitrate
|
||||
int AC3SamplingFreq(void) { cMutexLock MutexLock(&mutexM);
|
||||
return ac3InfoM.samplingFrequency; }; // Hz or eAudioSamplingFrequency
|
||||
int AC3BitStreamMode(void) { cMutexLock MutexLock(&mutexM);
|
||||
return ac3InfoM.bitstreamMode; }; // 0..7 or eAudioBitstreamMode
|
||||
int AC3AudioCodingMode(void) { cMutexLock MutexLock(&mutexM);
|
||||
return ac3InfoM.audioCodingMode; }; // 0..7 or eAudioCodingMode
|
||||
bool AC3_2_0(void) { cMutexLock MutexLock(&mutexM);
|
||||
return (ac3InfoM.audioCodingMode == AUDIO_CODING_MODE_2_0); }; // boolean
|
||||
bool AC3_5_1(void) { cMutexLock MutexLock(&mutexM);
|
||||
return (ac3InfoM.audioCodingMode == AUDIO_CODING_MODE_3_2); }; // boolean
|
||||
int AC3DolbySurroundMode(void) { cMutexLock MutexLock(&mutexM);
|
||||
return ac3InfoM.dolbySurroundMode; }; // eAudioDolbySurroundMode
|
||||
int AC3CenterMixLevel(void) { cMutexLock MutexLock(&mutexM);
|
||||
return ac3InfoM.centerMixLevel; }; // eAudioCenterMixLevel
|
||||
int AC3SurroundMixLevel(void) { cMutexLock MutexLock(&mutexM);
|
||||
return ac3InfoM.surroundMixLevel; }; // eAudioSurroundMixLevel
|
||||
int AC3DialogLevel(void) { cMutexLock MutexLock(&mutexM);
|
||||
return ac3InfoM.dialogLevel; }; // -dB
|
||||
bool AC3Lfe(void) { cMutexLock MutexLock(&mutexM);
|
||||
return ac3InfoM.lfe; }; // boolean
|
||||
};
|
||||
|
||||
#endif //__FEMON_RECEIVER_H
|
||||
|
172
setup.c
172
setup.c
@ -1,172 +0,0 @@
|
||||
/*
|
||||
* setup.c: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <vdr/menu.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "log.h"
|
||||
#include "tools.h"
|
||||
#include "setup.h"
|
||||
|
||||
cMenuFemonSetup::cMenuFemonSetup()
|
||||
: hideMenuM(FemonConfig.GetHideMenu()),
|
||||
displayModeM(FemonConfig.GetDisplayMode()),
|
||||
skinM(FemonConfig.GetSkin()),
|
||||
themeM(FemonConfig.GetTheme()),
|
||||
positionM(FemonConfig.GetPosition()),
|
||||
downscaleM(FemonConfig.GetDownscale()),
|
||||
signalUnitM(FemonConfig.GetSignalUnit()),
|
||||
redLimitM(FemonConfig.GetRedLimit()),
|
||||
greenLimitM(FemonConfig.GetGreenLimit()),
|
||||
updateIntervalM(FemonConfig.GetUpdateInterval()),
|
||||
analyzeStreamM(FemonConfig.GetAnalyzeStream()),
|
||||
calcIntervalM(FemonConfig.GetCalcInterval()),
|
||||
useSvdrpM(FemonConfig.GetUseSvdrp()),
|
||||
svdrpPortM(FemonConfig.GetSvdrpPort())
|
||||
{
|
||||
debug1("%s", __PRETTY_FUNCTION__);
|
||||
strn0cpy(svdrpIpM, FemonConfig.GetSvdrpIp(), sizeof(svdrpIpM));
|
||||
|
||||
dispModesM[eFemonModeBasic] = tr("basic");
|
||||
dispModesM[eFemonModeTransponder] = tr("transponder");
|
||||
dispModesM[eFemonModeStream] = tr("stream");
|
||||
dispModesM[eFemonModeAC3] = tr("AC-3");
|
||||
|
||||
signalUnitsM[eFemonSignalUnitdBm] = tr("dBm");
|
||||
signalUnitsM[eFemonSignalUnitdBuV] = tr("dBuV");
|
||||
signalUnitsM[eFemonSignalUnitdBV] = tr("dBV");
|
||||
|
||||
skinsM[eFemonSkinClassic] = tr("Classic");
|
||||
skinsM[eFemonSkinElchi] = tr("Elchi");
|
||||
|
||||
themesM[eFemonThemeClassic] = tr("Classic");
|
||||
themesM[eFemonThemeElchi] = tr("Elchi");
|
||||
themesM[eFemonThemeSTTNG] = tr("ST:TNG");
|
||||
themesM[eFemonThemeDeepBlue] = tr("DeepBlue");
|
||||
themesM[eFemonThemeMoronimo] = tr("Moronimo");
|
||||
themesM[eFemonThemeEnigma] = tr("Enigma");
|
||||
themesM[eFemonThemeEgalsTry] = tr("EgalsTry");
|
||||
themesM[eFemonThemeDuotone] = tr("Duotone");
|
||||
themesM[eFemonThemeSilverGreen] = tr("SilverGreen");
|
||||
themesM[eFemonThemePearlHD] = tr("PearlHD");
|
||||
|
||||
SetMenuCategory(mcSetupPlugins);
|
||||
Setup();
|
||||
}
|
||||
|
||||
void cMenuFemonSetup::Setup(void)
|
||||
{
|
||||
int current = Current();
|
||||
|
||||
Clear();
|
||||
helpM.Clear();
|
||||
|
||||
Add(new cMenuEditBoolItem(tr("Hide main menu entry"), &hideMenuM));
|
||||
helpM.Append(tr("Define whether the main menu entry is hidden."));
|
||||
|
||||
Add(new cMenuEditStraItem(tr("Default display mode"), &displayModeM, eFemonModeMaxNumber, dispModesM));
|
||||
helpM.Append(tr("Define the default display mode at startup."));
|
||||
|
||||
Add(new cMenuEditStraItem(trVDR("Setup.OSD$Skin"), &skinM, eFemonSkinMaxNumber, skinsM));
|
||||
helpM.Append(tr("Define the used OSD skin."));
|
||||
|
||||
Add(new cMenuEditStraItem(trVDR("Setup.OSD$Theme"), &themeM, eFemonThemeMaxNumber, themesM));
|
||||
helpM.Append(tr("Define the used OSD theme."));
|
||||
|
||||
Add(new cMenuEditBoolItem(tr("Position"), &positionM, trVDR("bottom"), trVDR("top")));
|
||||
helpM.Append(tr("Define the position of OSD."));
|
||||
|
||||
Add(new cMenuEditIntItem(tr("Downscale OSD size [%]"), &downscaleM, 0, 20));
|
||||
helpM.Append(tr("Define the downscale ratio for OSD size."));
|
||||
|
||||
Add(new cMenuEditStraItem(tr("Signal level unit"), &signalUnitM, eFemonSignalUnitMaxNumber, signalUnitsM));
|
||||
helpM.Append(tr("Define the used signal level unit."));
|
||||
|
||||
Add(new cMenuEditIntItem(tr("Red limit [%]"), &redLimitM, 1, 50));
|
||||
helpM.Append(tr("Define a limit for red bar, which is used to indicate a bad signal."));
|
||||
|
||||
Add(new cMenuEditIntItem(tr("Green limit [%]"), &greenLimitM, 51, 100));
|
||||
helpM.Append(tr("Define a limit for green bar, which is used to indicate a good signal."));
|
||||
|
||||
Add(new cMenuEditIntItem(tr("OSD update interval [0.1s]"), &updateIntervalM, 1, 100));
|
||||
helpM.Append(tr("Define an interval for OSD updates. The smaller interval generates higher CPU load."));
|
||||
|
||||
Add(new cMenuEditBoolItem(tr("Analyze stream"), &analyzeStreamM));
|
||||
helpM.Append(tr("Define whether the DVB stream is analyzed and bitrates calculated."));
|
||||
|
||||
if (analyzeStreamM) {
|
||||
Add(new cMenuEditIntItem(tr("Calculation interval [0.1s]"), &calcIntervalM, 1, 100));
|
||||
helpM.Append(tr("Define an interval for calculation. The bigger interval generates more stable values."));
|
||||
}
|
||||
|
||||
Add(new cMenuEditBoolItem(tr("Use SVDRP service"), &useSvdrpM));
|
||||
helpM.Append(tr("Define whether the SVDRP service is used in client/server setups."));
|
||||
|
||||
if (useSvdrpM) {
|
||||
Add(new cMenuEditIntItem(tr("SVDRP service port"), &svdrpPortM, 1, 65535));
|
||||
helpM.Append(tr("Define the port number of SVDRP service."));
|
||||
|
||||
Add(new cMenuEditStrItem(tr("SVDRP service IP"), svdrpIpM, sizeof(svdrpIpM), ".1234567890"));
|
||||
helpM.Append(tr("Define the IP address of SVDRP service."));
|
||||
}
|
||||
|
||||
SetCurrent(Get(current));
|
||||
Display();
|
||||
}
|
||||
|
||||
void cMenuFemonSetup::Store(void)
|
||||
{
|
||||
debug1("%s", __PRETTY_FUNCTION__);
|
||||
// Store values into setup.conf
|
||||
SetupStore("HideMenu", hideMenuM);
|
||||
SetupStore("DisplayMode", displayModeM);
|
||||
SetupStore("Skin", skinM);
|
||||
SetupStore("Theme", themeM);
|
||||
SetupStore("Position", positionM);
|
||||
SetupStore("Downscale", downscaleM);
|
||||
SetupStore("SignalUnit", signalUnitM);
|
||||
SetupStore("RedLimit", redLimitM);
|
||||
SetupStore("GreenLimit", greenLimitM);
|
||||
SetupStore("UpdateInterval", updateIntervalM);
|
||||
SetupStore("AnalStream", analyzeStreamM);
|
||||
SetupStore("CalcInterval", calcIntervalM);
|
||||
SetupStore("UseSvdrp", useSvdrpM);
|
||||
SetupStore("ServerPort", svdrpPortM);
|
||||
SetupStore("ServerIp", svdrpIpM);
|
||||
// Update global config
|
||||
FemonConfig.SetHideMenu(hideMenuM);
|
||||
FemonConfig.SetDisplayMode(displayModeM);
|
||||
FemonConfig.SetSkin(skinM);
|
||||
FemonConfig.SetTheme(themeM);
|
||||
FemonConfig.SetPosition(positionM);
|
||||
FemonConfig.SetDownscale(downscaleM);
|
||||
FemonConfig.SetSignalUnit(signalUnitM);
|
||||
FemonConfig.SetRedLimit(redLimitM);
|
||||
FemonConfig.SetGreenLimit(greenLimitM);
|
||||
FemonConfig.SetUpdateInterval(updateIntervalM);
|
||||
FemonConfig.SetAnalyzeStream(analyzeStreamM);
|
||||
FemonConfig.SetCalcInterval(calcIntervalM);
|
||||
FemonConfig.SetUseSvdrp(useSvdrpM);
|
||||
FemonConfig.SetSvdrpPort(svdrpPortM);
|
||||
FemonConfig.SetSvdrpIp(svdrpIpM);
|
||||
}
|
||||
|
||||
eOSState cMenuFemonSetup::ProcessKey(eKeys keyP)
|
||||
{
|
||||
int oldUseSvdrp = useSvdrpM;
|
||||
int oldAnalyzeStream = analyzeStreamM;
|
||||
|
||||
eOSState state = cMenuSetupPage::ProcessKey(keyP);
|
||||
|
||||
if (keyP != kNone && (analyzeStreamM != oldAnalyzeStream || useSvdrpM != oldUseSvdrp))
|
||||
Setup();
|
||||
|
||||
if ((keyP == kInfo) && (state == osUnknown) && (Current() < helpM.Size()))
|
||||
return AddSubMenu(new cMenuText(cString::sprintf("%s - %s '%s'", tr("Help"), trVDR("Plugin"), PLUGIN_NAME_I18N), helpM[Current()]));
|
||||
|
||||
return state;
|
||||
}
|
43
setup.h
43
setup.h
@ -1,43 +0,0 @@
|
||||
/*
|
||||
* setup.h: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __FEMON_SETUP_H
|
||||
#define __FEMON_SETUP_H
|
||||
|
||||
class cMenuFemonSetup : public cMenuSetupPage {
|
||||
private:
|
||||
const char *dispModesM[eFemonModeMaxNumber];
|
||||
const char *signalUnitsM[eFemonSignalUnitMaxNumber];
|
||||
const char *skinsM[eFemonSkinMaxNumber];
|
||||
const char *themesM[eFemonThemeMaxNumber];
|
||||
cVector<const char*> helpM;
|
||||
int hideMenuM;
|
||||
int displayModeM;
|
||||
int skinM;
|
||||
int themeM;
|
||||
int positionM;
|
||||
int downscaleM;
|
||||
int signalUnitM;
|
||||
int redLimitM;
|
||||
int greenLimitM;
|
||||
int updateIntervalM;
|
||||
int analyzeStreamM;
|
||||
int calcIntervalM;
|
||||
int useSvdrpM;
|
||||
int svdrpPortM;
|
||||
char svdrpIpM[MaxSvdrpIp + 1]; // must end with additional null
|
||||
void Setup(void);
|
||||
|
||||
protected:
|
||||
virtual eOSState ProcessKey(eKeys Key);
|
||||
virtual void Store(void);
|
||||
|
||||
public:
|
||||
cMenuFemonSetup();
|
||||
};
|
||||
|
||||
#endif // __FEMON_SETUP_H
|
@ -11,11 +11,11 @@
|
||||
|
||||
class cLine: public cListObject {
|
||||
private:
|
||||
char *lineM;
|
||||
char *Line;
|
||||
public:
|
||||
const char *Text() { return lineM; }
|
||||
cLine(const char *strP) { lineM = strP ? strdup(strP) : NULL; };
|
||||
virtual ~cLine() { if (lineM) free(lineM); };
|
||||
const char *Text() { return Line; }
|
||||
cLine(const char *s) { Line = s ? strdup(s) : NULL; };
|
||||
virtual ~cLine() { if (Line) free(Line); };
|
||||
};
|
||||
|
||||
struct SvdrpConnection_v1_0 {
|
||||
|
224
symbol.c
224
symbol.c
@ -1,224 +0,0 @@
|
||||
/*
|
||||
* symbol.c: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <vdr/device.h>
|
||||
|
||||
#include "log.h"
|
||||
#include "tools.h"
|
||||
#include "symbol.h"
|
||||
|
||||
#include "symbols/stereo.xpm"
|
||||
#include "symbols/monoleft.xpm"
|
||||
#include "symbols/monoright.xpm"
|
||||
#include "symbols/dolbydigital.xpm"
|
||||
#include "symbols/dolbydigital20.xpm"
|
||||
#include "symbols/dolbydigital51.xpm"
|
||||
#include "symbols/mpeg2.xpm"
|
||||
#include "symbols/h264.xpm"
|
||||
#include "symbols/h265.xpm"
|
||||
#include "symbols/ntsc.xpm"
|
||||
#include "symbols/pal.xpm"
|
||||
#include "symbols/encrypted.xpm"
|
||||
#include "symbols/svdrp.xpm"
|
||||
#include "symbols/lock.xpm"
|
||||
#include "symbols/signal.xpm"
|
||||
#include "symbols/carrier.xpm"
|
||||
#include "symbols/viterbi.xpm"
|
||||
#include "symbols/sync.xpm"
|
||||
#include "symbols/ar11.xpm"
|
||||
#include "symbols/ar169.xpm"
|
||||
#include "symbols/ar2211.xpm"
|
||||
#include "symbols/ar43.xpm"
|
||||
#include "symbols/device.xpm"
|
||||
#include "symbols/zero.xpm"
|
||||
#include "symbols/one.xpm"
|
||||
#include "symbols/two.xpm"
|
||||
#include "symbols/three.xpm"
|
||||
#include "symbols/four.xpm"
|
||||
#include "symbols/five.xpm"
|
||||
#include "symbols/six.xpm"
|
||||
#include "symbols/seven.xpm"
|
||||
#include "symbols/eight.xpm"
|
||||
#include "symbols/format2160.xpm"
|
||||
#include "symbols/format2160i.xpm"
|
||||
#include "symbols/format2160p.xpm"
|
||||
#include "symbols/format1080.xpm"
|
||||
#include "symbols/format1080i.xpm"
|
||||
#include "symbols/format1080p.xpm"
|
||||
#include "symbols/format720.xpm"
|
||||
#include "symbols/format720i.xpm"
|
||||
#include "symbols/format720p.xpm"
|
||||
#include "symbols/format576.xpm"
|
||||
#include "symbols/format576i.xpm"
|
||||
#include "symbols/format576p.xpm"
|
||||
#include "symbols/format480.xpm"
|
||||
#include "symbols/format480i.xpm"
|
||||
#include "symbols/format480p.xpm"
|
||||
|
||||
static cBitmap 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 bmH265(h265_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 bmFormat2160(format2160_xpm);
|
||||
static cBitmap bmFormat2160i(format2160i_xpm);
|
||||
static cBitmap bmFormat2160p(format2160p_xpm);
|
||||
static cBitmap bmFormat1080(format1080_xpm);
|
||||
static cBitmap bmFormat1080i(format1080i_xpm);
|
||||
static cBitmap bmFormat1080p(format1080p_xpm);
|
||||
static cBitmap bmFormat720(format720_xpm);
|
||||
static cBitmap bmFormat720i(format720i_xpm);
|
||||
static cBitmap bmFormat720p(format720p_xpm);
|
||||
static cBitmap bmFormat576(format576_xpm);
|
||||
static cBitmap bmFormat576i(format576i_xpm);
|
||||
static cBitmap bmFormat576p(format576p_xpm);
|
||||
static cBitmap bmFormat480(format480_xpm);
|
||||
static cBitmap bmFormat480i(format480i_xpm);
|
||||
static cBitmap bmFormat480p(format480p_xpm);
|
||||
|
||||
cFemonSymbolCache femonSymbols;
|
||||
|
||||
cFemonSymbolCache::cFemonSymbolCache()
|
||||
: xFactorM(1.0),
|
||||
yFactorM(1.0),
|
||||
antiAliasM(false)
|
||||
{
|
||||
Populate();
|
||||
}
|
||||
|
||||
cFemonSymbolCache::~cFemonSymbolCache()
|
||||
{
|
||||
Flush();
|
||||
}
|
||||
|
||||
void cFemonSymbolCache::Refresh()
|
||||
{
|
||||
int width, height;
|
||||
double aspect, xfactor, yfactor;
|
||||
cDevice::PrimaryDevice()->GetOsdSize(width, height, aspect);
|
||||
debug1("%s width=%d height=%d", __PRETTY_FUNCTION__, width, height);
|
||||
xfactor = (double)width / DEFAULT_WIDTH;
|
||||
yfactor = (double)height / DEFAULT_HEIGHT;
|
||||
if (!DoubleEqual(xfactor, xFactorM) || !DoubleEqual(yfactor, yFactorM)) {
|
||||
xFactorM = xfactor;
|
||||
yFactorM = yfactor;
|
||||
Populate();
|
||||
}
|
||||
}
|
||||
|
||||
bool cFemonSymbolCache::Populate(void)
|
||||
{
|
||||
debug1("%s xFactor=%.02f yFactor=%.02f", __PRETTY_FUNCTION__, xFactorM, yFactorM);
|
||||
if (!DoubleEqual(0.0, xFactorM) || !DoubleEqual(0.0, yFactorM)) {
|
||||
Flush();
|
||||
|
||||
// pushing order must follow the enumeration - keep original proportions except for frontend status ones
|
||||
cacheM.Append(bmOnePixel.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_ONEPIXEL
|
||||
cacheM.Append(bmStereo.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_STEREO
|
||||
cacheM.Append(bmMonoLeft.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_MONO_LEFT
|
||||
cacheM.Append(bmMonoRight.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_MONO_RIGHT
|
||||
cacheM.Append(bmDolbyDigital.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_DD
|
||||
cacheM.Append(bmDolbyDigital20.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_DD20
|
||||
cacheM.Append(bmDolbyDigital51.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_DD51
|
||||
cacheM.Append(bmMpeg2.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_MPEG2
|
||||
cacheM.Append(bmH264.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_H264
|
||||
cacheM.Append(bmH265.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_H265
|
||||
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(bmFormat2160.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_2160
|
||||
cacheM.Append(bmFormat2160i.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_2160i
|
||||
cacheM.Append(bmFormat2160p.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_2160p
|
||||
cacheM.Append(bmFormat1080.Scaled(yFactorM, yFactorM, antiAliasM)); // SYMBOL_FORMAT_1080
|
||||
cacheM.Append(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)
|
||||
{
|
||||
debug1("%s", __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 = &bmOnePixel;
|
||||
|
||||
if (symbolP < cacheM.Size())
|
||||
bitmapM = cacheM[symbolP];
|
||||
else
|
||||
error("%s (%d) Invalid symbol", __PRETTY_FUNCTION__, symbolP);
|
||||
|
||||
return *bitmapM;
|
||||
}
|
91
symbol.h
91
symbol.h
@ -1,91 +0,0 @@
|
||||
/*
|
||||
* symbol.h: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __FEMON_SYMBOL_H
|
||||
#define __FEMON_SYMBOL_H
|
||||
|
||||
#include <vdr/tools.h>
|
||||
#include <vdr/osd.h>
|
||||
|
||||
enum eSymbols {
|
||||
SYMBOL_ONEPIXEL,
|
||||
SYMBOL_STEREO,
|
||||
SYMBOL_MONO_LEFT,
|
||||
SYMBOL_MONO_RIGHT,
|
||||
SYMBOL_DD,
|
||||
SYMBOL_DD20,
|
||||
SYMBOL_DD51,
|
||||
SYMBOL_MPEG2,
|
||||
SYMBOL_H264,
|
||||
SYMBOL_H265,
|
||||
SYMBOL_PAL,
|
||||
SYMBOL_NTSC,
|
||||
SYMBOL_ENCRYPTED,
|
||||
SYMBOL_SVDRP,
|
||||
SYMBOL_LOCK,
|
||||
SYMBOL_SIGNAL,
|
||||
SYMBOL_CARRIER,
|
||||
SYMBOL_VITERBI,
|
||||
SYMBOL_SYNC,
|
||||
SYMBOL_AR_1_1,
|
||||
SYMBOL_AR_16_9,
|
||||
SYMBOL_AR_2_21_1,
|
||||
SYMBOL_AR_4_3,
|
||||
SYMBOL_DEVICE,
|
||||
SYMBOL_ZERO,
|
||||
SYMBOL_ONE,
|
||||
SYMBOL_TWO,
|
||||
SYMBOL_THREE,
|
||||
SYMBOL_FOUR,
|
||||
SYMBOL_FIVE,
|
||||
SYMBOL_SIX,
|
||||
SYMBOL_SEVEN,
|
||||
SYMBOL_EIGHT,
|
||||
SYMBOL_FORMAT_2160,
|
||||
SYMBOL_FORMAT_2160i,
|
||||
SYMBOL_FORMAT_2160p,
|
||||
SYMBOL_FORMAT_1080,
|
||||
SYMBOL_FORMAT_1080i,
|
||||
SYMBOL_FORMAT_1080p,
|
||||
SYMBOL_FORMAT_720,
|
||||
SYMBOL_FORMAT_720i,
|
||||
SYMBOL_FORMAT_720p,
|
||||
SYMBOL_FORMAT_576,
|
||||
SYMBOL_FORMAT_576i,
|
||||
SYMBOL_FORMAT_576p,
|
||||
SYMBOL_FORMAT_480,
|
||||
SYMBOL_FORMAT_480i,
|
||||
SYMBOL_FORMAT_480p,
|
||||
SYMBOL_MAX_COUNT
|
||||
};
|
||||
|
||||
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 // __FEMON_SYMBOL_H
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const eight_xpm[] = {
|
||||
"15 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++",
|
||||
"..............+",
|
||||
".....++++.....+",
|
||||
"....++++++....+",
|
||||
"....++..++....+",
|
||||
"...++....++...+",
|
||||
"...++....++...+",
|
||||
"....++..++....+",
|
||||
".....++++.....+",
|
||||
".....++++.....+",
|
||||
"....++..++....+",
|
||||
"...++....++...+",
|
||||
"...++....++...+",
|
||||
"....++..++....+",
|
||||
"....++++++....+",
|
||||
".....++++.....+",
|
||||
"..............+",
|
||||
"+++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const encrypted_xpm[] = {
|
||||
"23 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++++++++++",
|
||||
"+.....................+",
|
||||
"+.....................+",
|
||||
"+.....................+",
|
||||
"+..............+++....+",
|
||||
"+.............+++++...+",
|
||||
"+............+++.+++..+",
|
||||
"+............++...++..+",
|
||||
"+..++++++++++++...++..+",
|
||||
"+..++++++++++++...++..+",
|
||||
"+...++.++....++...++..+",
|
||||
"+...++.++....+++.+++..+",
|
||||
"+...++.++.....+++++...+",
|
||||
"+..............+++....+",
|
||||
"+.....................+",
|
||||
"+.....................+",
|
||||
"+.....................+",
|
||||
"+++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const format1080_xpm[] = {
|
||||
"40 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++++++++++++++++++++++++++++",
|
||||
"+......................................+",
|
||||
"+......++...++++.....++++.....++++.....+",
|
||||
"+...+++++..++++++...++++++...++++++....+",
|
||||
"+...+++++..++..++...++..++...++..++....+",
|
||||
"+......++.++....++.++....++.++....++...+",
|
||||
"+......++.++....++.++....++.++....++...+",
|
||||
"+......++.++....++..++..++..++....++...+",
|
||||
"+......++.++....++...++++...++....++...+",
|
||||
"+......++.++....++...++++...++....++...+",
|
||||
"+......++.++....++..++..++..++....++...+",
|
||||
"+......++.++....++.++....++.++....++...+",
|
||||
"+......++.++....++.++....++.++....++...+",
|
||||
"+......++..++..++...++..++...++..++....+",
|
||||
"+......++..++++++...++++++...++++++....+",
|
||||
"+......++...++++.....++++.....++++.....+",
|
||||
"+......................................+",
|
||||
"++++++++++++++++++++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const format1080i_xpm[] = {
|
||||
"42 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++++++++++++++++++++++++++++++",
|
||||
"+........................................+",
|
||||
"+......++...++++.....++++.....++++.......+",
|
||||
"+...+++++..++++++...++++++...++++++......+",
|
||||
"+...+++++..++..++...++..++...++..++......+",
|
||||
"+......++.++....++.++....++.++....++.....+",
|
||||
"+......++.++....++.++....++.++....++.++..+",
|
||||
"+......++.++....++..++..++..++....++.++..+",
|
||||
"+......++.++....++...++++...++....++.....+",
|
||||
"+......++.++....++...++++...++....++.++..+",
|
||||
"+......++.++....++..++..++..++....++.++..+",
|
||||
"+......++.++....++.++....++.++....++.++..+",
|
||||
"+......++.++....++.++....++.++....++.++..+",
|
||||
"+......++..++..++...++..++...++..++..++..+",
|
||||
"+......++..++++++...++++++...++++++..++..+",
|
||||
"+......++...++++.....++++.....++++...++..+",
|
||||
"+........................................+",
|
||||
"++++++++++++++++++++++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const format1080p_xpm[] = {
|
||||
"47 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"+.............................................+",
|
||||
"+......++...++++.....++++.....++++............+",
|
||||
"+...+++++..++++++...++++++...++++++...........+",
|
||||
"+...+++++..++..++...++..++...++..++...........+",
|
||||
"+......++.++....++.++....++.++....++..........+",
|
||||
"+......++.++....++.++....++.++....++..........+",
|
||||
"+......++.++....++..++..++..++....++.++++.....+",
|
||||
"+......++.++....++...++++...++....++.+++++....+",
|
||||
"+......++.++....++...++++...++....++.++..++...+",
|
||||
"+......++.++....++..++..++..++....++.++..++...+",
|
||||
"+......++.++....++.++....++.++....++.+++++....+",
|
||||
"+......++.++....++.++....++.++....++.++++.....+",
|
||||
"+......++..++..++...++..++...++..++..++.......+",
|
||||
"+......++..++++++...++++++...++++++..++.......+",
|
||||
"+......++...++++.....++++.....++++...++.......+",
|
||||
"+.............................................+",
|
||||
"+++++++++++++++++++++++++++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const format2160_xpm[] = {
|
||||
"40 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++++++++++++++++++++++++++++",
|
||||
"+......................................+",
|
||||
"+.....++++......++..++++++....++++.....+",
|
||||
"+...+++++++..+++++.++++++++..++++++....+",
|
||||
"+...++....++.+++++.+++...++..++..++....+",
|
||||
"+.........++....++.++.......++....++...+",
|
||||
"+.........++....++.++.......++....++...+",
|
||||
"+.........++....++.++.+++...++....++...+",
|
||||
"+.......+++.....++.+++++++..++....++...+",
|
||||
"+......+++......++.+++..+++.++....++...+",
|
||||
"+.....+++.......++.++....++.++....++...+",
|
||||
"+.....+++.......++.++....++.++....++...+",
|
||||
"+....+++........++.++....++.++....++...+",
|
||||
"+....++.........++.+++..+++..++..++....+",
|
||||
"+....++++++++...++..+++++++..++++++....+",
|
||||
"+....++++++++...++...+++++....++++.....+",
|
||||
"+......................................+",
|
||||
"++++++++++++++++++++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const format2160i_xpm[] = {
|
||||
"43 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++++++++++++++++++++++++++++++",
|
||||
"+.........................................+",
|
||||
"+.....++++......++..++++++....++++........+",
|
||||
"+...+++++++..+++++.++++++++..++++++.......+",
|
||||
"+...++....++.+++++.+++...++..++..++.......+",
|
||||
"+.........++....++.++.......++....++......+",
|
||||
"+.........++....++.++.......++....++.++...+",
|
||||
"+.........++....++.++.+++...++....++.++...+",
|
||||
"+.......+++.....++.+++++++..++....++......+",
|
||||
"+......+++......++.+++..+++.++....++.++...+",
|
||||
"+.....+++.......++.++....++.++....++.++...+",
|
||||
"+.....+++.......++.++....++.++....++.++...+",
|
||||
"+....+++........++.++....++.++....++.++...+",
|
||||
"+....++.........++.+++..+++..++..++..++...+",
|
||||
"+....++++++++...++..+++++++..++++++..++...+",
|
||||
"+....++++++++...++...+++++....++++...++...+",
|
||||
"+.........................................+",
|
||||
"+++++++++++++++++++++++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const format2160p_xpm[] = {
|
||||
"47 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"+.............................................+",
|
||||
"+.....++++......++..++++++....++++............+",
|
||||
"+...+++++++..+++++.++++++++..++++++...........+",
|
||||
"+...++....++.+++++.+++...++..++..++...........+",
|
||||
"+.........++....++.++.......++....++..........+",
|
||||
"+.........++....++.++.......++....++..........+",
|
||||
"+.........++....++.++.+++...++....++.++++.....+",
|
||||
"+.......+++.....++.+++++++..++....++.+++++....+",
|
||||
"+......+++......++.+++..+++.++....++.++..++...+",
|
||||
"+.....+++.......++.++....++.++....++.++..++...+",
|
||||
"+.....+++.......++.++....++.++....++.+++++....+",
|
||||
"+....+++........++.++....++.++....++.++++.....+",
|
||||
"+....++.........++.+++..+++..++..++..++.......+",
|
||||
"+....++++++++...++..+++++++..++++++..++.......+",
|
||||
"+....++++++++...++...+++++....++++...++.......+",
|
||||
"+.............................................+",
|
||||
"+++++++++++++++++++++++++++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const format480_xpm[] = {
|
||||
"35 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++++++++++++++++++++++",
|
||||
"+.................................+",
|
||||
"+.........++....++++.....++++.....+",
|
||||
"+........+++...++++++...++++++....+",
|
||||
"+.......++++...++..++...++..++....+",
|
||||
"+......++.++..++....++.++....++...+",
|
||||
"+.....++..++..++....++.++....++...+",
|
||||
"+.....++..++...++..++..++....++...+",
|
||||
"+....++...++....++++...++....++...+",
|
||||
"+...++....++....++++...++....++...+",
|
||||
"+...+++++++++..++..++..++....++...+",
|
||||
"+...+++++++++.++....++.++....++...+",
|
||||
"+.........++..++....++.++....++...+",
|
||||
"+.........++...++..++...++..++....+",
|
||||
"+.........++...++++++...++++++....+",
|
||||
"+.........++....++++.....++++.....+",
|
||||
"+.................................+",
|
||||
"+++++++++++++++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const format480i_xpm[] = {
|
||||
"38 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++++++++++++++++++++++++++",
|
||||
"+....................................+",
|
||||
"+.........++....++++.....++++........+",
|
||||
"+........+++...++++++...++++++.......+",
|
||||
"+.......++++...++..++...++..++.......+",
|
||||
"+......++.++..++....++.++....++......+",
|
||||
"+.....++..++..++....++.++....++.++...+",
|
||||
"+.....++..++...++..++..++....++.++...+",
|
||||
"+....++...++....++++...++....++......+",
|
||||
"+...++....++....++++...++....++.++...+",
|
||||
"+...+++++++++..++..++..++....++.++...+",
|
||||
"+...+++++++++.++....++.++....++.++...+",
|
||||
"+.........++..++....++.++....++.++...+",
|
||||
"+.........++...++..++...++..++..++...+",
|
||||
"+.........++...++++++...++++++..++...+",
|
||||
"+.........++....++++.....++++...++...+",
|
||||
"+....................................+",
|
||||
"++++++++++++++++++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const format480p_xpm[] = {
|
||||
"42 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++++++++++++++++++++++++++++++",
|
||||
"+........................................+",
|
||||
"+.........++....++++.....++++............+",
|
||||
"+........+++...++++++...++++++...........+",
|
||||
"+.......++++...++..++...++..++...........+",
|
||||
"+......++.++..++....++.++....++..........+",
|
||||
"+.....++..++..++....++.++....++..........+",
|
||||
"+.....++..++...++..++..++....++.++++.....+",
|
||||
"+....++...++....++++...++....++.+++++....+",
|
||||
"+...++....++....++++...++....++.++..++...+",
|
||||
"+...+++++++++..++..++..++....++.++..++...+",
|
||||
"+...+++++++++.++....++.++....++.+++++....+",
|
||||
"+.........++..++....++.++....++.++++.....+",
|
||||
"+.........++...++..++...++..++..++.......+",
|
||||
"+.........++...++++++...++++++..++.......+",
|
||||
"+.........++....++++.....++++...++.......+",
|
||||
"+........................................+",
|
||||
"++++++++++++++++++++++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const format576_xpm[] = {
|
||||
"33 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++++++++++++++++++++",
|
||||
"+...............................+",
|
||||
"+...+++++++.++++++++..++++++....+",
|
||||
"+...+++++++.++++++++.++++++++...+",
|
||||
"+...++......++....++.+++...++...+",
|
||||
"+...++............++.++.........+",
|
||||
"+...++...........+++.++.........+",
|
||||
"+...++++++.......++..++.+++.....+",
|
||||
"+...+++++++......++..+++++++....+",
|
||||
"+...++...+++....+++..+++..+++...+",
|
||||
"+.........++....++...++....++...+",
|
||||
"+.........++....++...++....++...+",
|
||||
"+...++....++...+++...++....++...+",
|
||||
"+...++...+++...++....+++..+++...+",
|
||||
"+...+++++++....++....+++++++....+",
|
||||
"+....+++++.....++.....+++++.....+",
|
||||
"+...............................+",
|
||||
"+++++++++++++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const format576i_xpm[] = {
|
||||
"36 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++++++++++++++++++++++++",
|
||||
"+..................................+",
|
||||
"+...+++++++.++++++++..++++++.......+",
|
||||
"+...+++++++.++++++++.++++++++......+",
|
||||
"+...++......++....++.+++...++......+",
|
||||
"+...++............++.++............+",
|
||||
"+...++...........+++.++.......++...+",
|
||||
"+...++++++.......++..++.+++...++...+",
|
||||
"+...+++++++......++..+++++++.......+",
|
||||
"+...++...+++....+++..+++..+++.++...+",
|
||||
"+.........++....++...++....++.++...+",
|
||||
"+.........++....++...++....++.++...+",
|
||||
"+...++....++...+++...++....++.++...+",
|
||||
"+...++...+++...++....+++..+++.++...+",
|
||||
"+...+++++++....++....+++++++..++...+",
|
||||
"+....+++++.....++.....+++++...++...+",
|
||||
"+..................................+",
|
||||
"++++++++++++++++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const format576p_xpm[] = {
|
||||
"40 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++++++++++++++++++++++++++++",
|
||||
"+......................................+",
|
||||
"+...+++++++.++++++++..++++++...........+",
|
||||
"+...+++++++.++++++++.++++++++..........+",
|
||||
"+...++......++....++.+++...++..........+",
|
||||
"+...++............++.++................+",
|
||||
"+...++...........+++.++................+",
|
||||
"+...++++++.......++..++.+++...++++.....+",
|
||||
"+...+++++++......++..+++++++..+++++....+",
|
||||
"+...++...+++....+++..+++..+++.++..++...+",
|
||||
"+.........++....++...++....++.++..++...+",
|
||||
"+.........++....++...++....++.+++++....+",
|
||||
"+...++....++...+++...++....++.++++.....+",
|
||||
"+...++...+++...++....+++..+++.++.......+",
|
||||
"+...+++++++....++....+++++++..++.......+",
|
||||
"+....+++++.....++.....+++++...++.......+",
|
||||
"+......................................+",
|
||||
"++++++++++++++++++++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const format720_xpm[] = {
|
||||
"34 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++++++++++++++++++++++",
|
||||
"+................................+",
|
||||
"+...++++++++...++++.....++++.....+",
|
||||
"+...++++++++.+++++++...++++++....+",
|
||||
"+...++....++.++....++..++..++....+",
|
||||
"+.........++.......++.++....++...+",
|
||||
"+.........++.......++.++....++...+",
|
||||
"+.........++.......++.++....++...+",
|
||||
"+........++......+++..++....++...+",
|
||||
"+.......+++.....+++...++....++...+",
|
||||
"+.......++.....+++....++....++...+",
|
||||
"+.......++....+++.....++....++...+",
|
||||
"+......+++...+++......++....++...+",
|
||||
"+......++....++........++..++....+",
|
||||
"+......++....++++++++..++++++....+",
|
||||
"+......++....++++++++...++++.....+",
|
||||
"+................................+",
|
||||
"++++++++++++++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const format720i_xpm[] = {
|
||||
"37 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++++++++++++++++++++++++",
|
||||
"+...................................+",
|
||||
"+...++++++++...++++.....++++........+",
|
||||
"+...++++++++.+++++++...++++++.......+",
|
||||
"+...++....++.++....++..++..++.......+",
|
||||
"+.........++.......++.++....++......+",
|
||||
"+.........++.......++.++....++.++...+",
|
||||
"+.........++.......++.++....++.++...+",
|
||||
"+........++......+++..++....++......+",
|
||||
"+.......+++.....+++...++....++.++...+",
|
||||
"+.......++.....+++....++....++.++...+",
|
||||
"+.......++....+++.....++....++.++...+",
|
||||
"+......+++...+++......++....++.++...+",
|
||||
"+......++....++........++..++..++...+",
|
||||
"+......++....++++++++..++++++..++...+",
|
||||
"+......++....++++++++...++++...++...+",
|
||||
"+...................................+",
|
||||
"+++++++++++++++++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const format720p_xpm[] = {
|
||||
"41 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++++++++++++++++++++++++++++",
|
||||
"+.......................................+",
|
||||
"+...++++++++...++++.....++++............+",
|
||||
"+...++++++++.+++++++...++++++...........+",
|
||||
"+...++....++.++....++..++..++...........+",
|
||||
"+.........++.......++.++....++..........+",
|
||||
"+.........++.......++.++....++..........+",
|
||||
"+.........++.......++.++....++.++++.....+",
|
||||
"+........++......+++..++....++.+++++....+",
|
||||
"+.......+++.....+++...++....++.++..++...+",
|
||||
"+.......++.....+++....++....++.++..++...+",
|
||||
"+.......++....+++.....++....++.+++++....+",
|
||||
"+......+++...+++......++....++.++++.....+",
|
||||
"+......++....++........++..++..++.......+",
|
||||
"+......++....++++++++..++++++..++.......+",
|
||||
"+......++....++++++++...++++...++.......+",
|
||||
"+.......................................+",
|
||||
"+++++++++++++++++++++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const h264_xpm[] = {
|
||||
"40 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++++++++++++++++++++++++++++",
|
||||
"+......................................+",
|
||||
"+..++...++.....+++++...+++++.......++..+",
|
||||
"+..++...++....+++++++.+++++++.....+++..+",
|
||||
"+..++...++....++...++.++...++....++++..+",
|
||||
"+..++...++.........++.++........+++....+",
|
||||
"+..++...++.........++.++.......+++.....+",
|
||||
"+..++...++........+++.++......+++......+",
|
||||
"+..+++++++.......+++..++++++..++...++..+",
|
||||
"+..+++++++......+++...+++++++.+++++++..+",
|
||||
"+..++...++.....+++....++...++.+++++++..+",
|
||||
"+..++...++....+++.....++...++......++..+",
|
||||
"+..++...++....++......++...++......++..+",
|
||||
"+..++...++....++...++.++...++......++..+",
|
||||
"+..++...++.++.+++++++.+++++++......++..+",
|
||||
"+..++...++.++.+++++++..+++++.......++..+",
|
||||
"+......................................+",
|
||||
"++++++++++++++++++++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const h265_xpm[] = {
|
||||
"40 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++++++++++++++++++++++++++++",
|
||||
"+......................................+",
|
||||
"+..++...++.....+++++...+++++..+++++++..+",
|
||||
"+..++...++....+++++++.+++++++.+++++++..+",
|
||||
"+..++...++....++...++.++...++.++.......+",
|
||||
"+..++...++.........++.++......++.......+",
|
||||
"+..++...++.........++.++......++.......+",
|
||||
"+..++...++........+++.++......++.......+",
|
||||
"+..+++++++.......+++..++++++..++++++...+",
|
||||
"+..+++++++......+++...+++++++.+++++++..+",
|
||||
"+..++...++.....+++....++...++.....+++..+",
|
||||
"+..++...++....+++.....++...++......++..+",
|
||||
"+..++...++....++......++...++......++..+",
|
||||
"+..++...++....++...++.++...++.++...++..+",
|
||||
"+..++...++.++.+++++++.+++++++.++...++..+",
|
||||
"+..++...++.++.+++++++..+++++...+++++...+",
|
||||
"+......................................+",
|
||||
"++++++++++++++++++++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const mpeg2_xpm[] = {
|
||||
"44 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++",
|
||||
"+..........................................+",
|
||||
"+..++....++.+++++...+++++..+++++...+++++...+",
|
||||
"+..++....++.++++++..+++++.+++++++.+++++++..+",
|
||||
"+..+++..+++.++..+++.++....+++..++.++...++..+",
|
||||
"+..+++..+++.++...++.++....++...........++..+",
|
||||
"+..++++++++.++...++.++....++...........++..+",
|
||||
"+..++++++++.++..+++.++....++..........+++..+",
|
||||
"+..++.++.++.++++++..++++..++.++++....+++...+",
|
||||
"+..++.++.++.+++++...++++..++.++++...+++....+",
|
||||
"+..++....++.++......++....++...++..+++.....+",
|
||||
"+..++....++.++......++....++...++.+++......+",
|
||||
"+..++....++.++......++....++...++.++.......+",
|
||||
"+..++....++.++......++....+++..++.++...++..+",
|
||||
"+..++....++.++......+++++.+++++++.+++++++..+",
|
||||
"+..++....++.++......+++++..+++++..+++++++..+",
|
||||
"+..........................................+",
|
||||
"++++++++++++++++++++++++++++++++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const seven_xpm[] = {
|
||||
"15 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++",
|
||||
"..............+",
|
||||
"...++++++++...+",
|
||||
"...++++++++...+",
|
||||
"...++....++...+",
|
||||
".........++...+",
|
||||
"........+++...+",
|
||||
"........++....+",
|
||||
"........++....+",
|
||||
".......+++....+",
|
||||
".......++.....+",
|
||||
".......++.....+",
|
||||
"......+++.....+",
|
||||
"......++......+",
|
||||
"......++......+",
|
||||
"......++......+",
|
||||
"..............+",
|
||||
"+++++++++++++++"};
|
@ -1,23 +0,0 @@
|
||||
/* XPM */
|
||||
static const char *const six_xpm[] = {
|
||||
"15 18 2 1",
|
||||
". c #FFFFFF",
|
||||
"+ c #000000",
|
||||
"+++++++++++++++",
|
||||
"..............+",
|
||||
"....++++++....+",
|
||||
"...++++++++...+",
|
||||
"...+++...++...+",
|
||||
"...++.........+",
|
||||
"...++.........+",
|
||||
"...++.+++.....+",
|
||||
"...+++++++....+",
|
||||
"...+++..+++...+",
|
||||
"...++....++...+",
|
||||
"...++....++...+",
|
||||
"...++....++...+",
|
||||
"...+++..+++...+",
|
||||
"...+++++++....+",
|
||||
"....+++++.....+",
|
||||
"..............+",
|
||||
"+++++++++++++++"};
|
590
tools.c
590
tools.c
@ -1,590 +0,0 @@
|
||||
/*
|
||||
* tools.c: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __STDC_FORMAT_MACROS
|
||||
#define __STDC_FORMAT_MACROS
|
||||
#endif
|
||||
|
||||
#include <ctype.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "osd.h"
|
||||
#include "receiver.h"
|
||||
#include "tools.h"
|
||||
|
||||
static cString getCA(int valueP)
|
||||
{
|
||||
// http://www.dvb.org/index.php?id=174
|
||||
// http://en.wikipedia.org/wiki/Conditional_access_system
|
||||
switch (valueP) {
|
||||
case 0x0000: return cString::sprintf("%s (%X)", trVDR("Free To Air"), valueP); // Reserved
|
||||
case 0x0001 ... 0x009F:
|
||||
case 0x00A2 ... 0x00FF: return cString::sprintf("%s (%X)", tr("Fixed"), valueP); // Standardized systems
|
||||
case 0x00A0 ... 0x00A1: return cString::sprintf("%s (%X)", tr("Analog"), valueP); // Analog signals
|
||||
case 0x0100 ... 0x01FF: return cString::sprintf("SECA Mediaguard (%X)", valueP); // Canal Plus
|
||||
case 0x0464: return cString::sprintf("EuroDec (%X)", valueP); // EuroDec
|
||||
case 0x0500 ... 0x05FF: return cString::sprintf("Viaccess (%X)", valueP); // France Telecom
|
||||
case 0x0600 ... 0x06FF: return cString::sprintf("Irdeto (%X)", valueP); // Irdeto
|
||||
case 0x0700 ... 0x07FF: return cString::sprintf("DigiCipher 2 (%X)", valueP); // Jerrold/GI/Motorola 4DTV
|
||||
case 0x0900 ... 0x09FF: return cString::sprintf("NDS Videoguard (%X)", valueP); // NDS
|
||||
case 0x0B00 ... 0x0BFF: return cString::sprintf("Conax (%X)", valueP); // Norwegian Telekom
|
||||
case 0x0D00 ... 0x0DFF: return cString::sprintf("CryptoWorks (%X)", valueP); // Philips CryptoTec
|
||||
case 0x0E00 ... 0x0EFF: return cString::sprintf("PowerVu (%X)", valueP); // Scientific Atlanta
|
||||
case 0x1000: return cString::sprintf("RAS (%X)", valueP); // Tandberg Television
|
||||
case 0x1200 ... 0x12FF: return cString::sprintf("NagraVision (%X)", valueP); // BellVu Express
|
||||
case 0x1700 ... 0x17FF: return cString::sprintf("VCAS (%X)", valueP); // Verimatrix Inc. former BetaTechnik
|
||||
case 0x1800 ... 0x18FF: return cString::sprintf("NagraVision (%X)", valueP); // Kudelski SA
|
||||
case 0x22F0: return cString::sprintf("Codicrypt (%X)", valueP); // Scopus Network Technologies
|
||||
case 0x2600: return cString::sprintf("BISS (%X)", valueP); // European Broadcasting Union
|
||||
case 0x2719: return cString::sprintf("VanyaCas (%X)", valueP); // S-Curious Research & Technology Pvt. Ltd.
|
||||
case 0x4347: return cString::sprintf("CryptOn (%X)", valueP); // CryptOn
|
||||
case 0x4800: return cString::sprintf("Accessgate (%X)", valueP); // Telemann
|
||||
case 0x4900: return cString::sprintf("China Crypt (%X)", valueP); // CryptoWorks
|
||||
case 0x4A02: return cString::sprintf("Tongfang (%X)", valueP); // Tsinghua Tongfang Company
|
||||
case 0x4A10: return cString::sprintf("EasyCas (%X)", valueP); // EasyCas
|
||||
case 0x4A20: return cString::sprintf("AlphaCrypt (%X)", valueP); // AlphaCrypt
|
||||
case 0x4A60: return cString::sprintf("SkyCrypt (%X)", valueP); // @Sky
|
||||
case 0x4A61: return cString::sprintf("Neotioncrypt (%X)", valueP); // Neotion
|
||||
case 0x4A62: return cString::sprintf("SkyCrypt (%X)", valueP); // @Sky
|
||||
case 0x4A63: return cString::sprintf("Neotion SHL (%X)", valueP); // Neotion
|
||||
case 0x4A64 ... 0x4A6F: return cString::sprintf("SkyCrypt (%X)", valueP); // @Sky
|
||||
case 0x4A70: return cString::sprintf("DreamCrypt (%X)", valueP); // Dream Multimedia
|
||||
case 0x4A80: return cString::sprintf("ThalesCrypt (%X)", valueP); // Thales Broadcast & Multimedia
|
||||
case 0x4AA1: return cString::sprintf("KeyFly (%X)", valueP); // SIDSA
|
||||
case 0x4ABF: return cString::sprintf("CTI-CAS (%X)", valueP); // Beijing Compunicate Technology Inc.
|
||||
case 0x4AC1: return cString::sprintf("Latens (%X)", valueP); // Latens Systems
|
||||
case 0x4AD0 ... 0x4AD1: return cString::sprintf("X-Crypt (%X)", valueP); // XCrypt Inc.
|
||||
case 0x4AD4: return cString::sprintf("OmniCrypt (%X)", valueP); // Widevine Technologies, Inc.
|
||||
case 0x4AE0 ... 0x4AE1: return cString::sprintf("Z-Crypt (%X)", valueP); // Digi Raum Electronics Co. Ltd.
|
||||
case 0x4AE4: return cString::sprintf("CoreCrypt (%X)", valueP); // CoreTrust
|
||||
case 0x4AE5: return cString::sprintf("PRO-Crypt (%X)", valueP); // IK SATPROF
|
||||
case 0x4AEA: return cString::sprintf("Cryptoguard (%X)", valueP); // Gryptoguard AB
|
||||
case 0x4AEB: return cString::sprintf("Abel Quintic (%X)", valueP); // Abel DRM Systems
|
||||
case 0x4AF0: return cString::sprintf("ABV (%X)", valueP); // Alliance Broadcast Vision
|
||||
case 0x5500: return cString::sprintf("Z-Crypt (%X)", valueP); // Digi Raum Electronics Co. Ltd.
|
||||
case 0x5501: return cString::sprintf("Griffin (%X)", valueP); // Nucleus Systems Ltd.
|
||||
case 0x5581: return cString::sprintf("Bulcrypt (%X)", valueP); // Bulcrypt
|
||||
case 0x7BE1: return cString::sprintf("DRE-Crypt (%X)", valueP); // DRE-Crypt
|
||||
case 0xA101: return cString::sprintf("RosCrypt-M (%X)", valueP); // NIIR
|
||||
case 0xEAD0: return cString::sprintf("VanyaCas (%X)", valueP); // S-Curious Research & Technology Pvt. Ltd.
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("%X", valueP);
|
||||
}
|
||||
|
||||
static const char *getUserString(int valueP, const tDvbParameterMap *mapP)
|
||||
{
|
||||
const tDvbParameterMap *map = mapP;
|
||||
while (map && map->userValue != -1) {
|
||||
if (map->driverValue == valueP)
|
||||
return map->userString ? trVDR(map->userString) : "---";
|
||||
map++;
|
||||
}
|
||||
return "---";
|
||||
}
|
||||
|
||||
cString getFrontendInfo(cDevice *deviceP)
|
||||
{
|
||||
const cChannel *channel;
|
||||
int status, valid = DTV_STAT_VALID_NONE;
|
||||
cString info = "";
|
||||
double signal = 0, cnr = 0, ber = 0, per = 0;
|
||||
|
||||
if (!deviceP)
|
||||
return info;
|
||||
|
||||
info = cString::sprintf("CARD:%d\nSTRG:%d\nQUAL:%d\nTYPE:%s\nNAME:%s", deviceP->CardIndex(), deviceP->SignalStrength(), deviceP->SignalQuality(), *deviceP->DeviceType(), *deviceP->DeviceName());
|
||||
if (deviceP && deviceP->SignalStats(valid, &signal, &cnr, NULL, &ber, &per, &status)) {
|
||||
if (valid & DTV_STAT_VALID_STATUS)
|
||||
info = cString::sprintf("%s\nSTAT:%04X", *info, status);
|
||||
if (valid & DTV_STAT_VALID_STRENGTH)
|
||||
info = cString::sprintf("%s\nSGNL:%s", *info, *dtoa(signal, "%.2f"));
|
||||
if (valid & DTV_STAT_VALID_CNR)
|
||||
info = cString::sprintf("%s\nCNRA:%s", *info, *dtoa(cnr, "%.2f"));
|
||||
if (valid & DTV_STAT_VALID_BERPOST)
|
||||
info = cString::sprintf("%s\nBERA:%s", *info, *dtoa(ber, "%.0f"));
|
||||
if (valid & DTV_STAT_VALID_PER)
|
||||
info = cString::sprintf("%s\nPERA:%s", *info, *dtoa(per, "%.0f"));
|
||||
}
|
||||
|
||||
if (cFemonOsd::Instance())
|
||||
info = cString::sprintf("%s\nVIBR:%s\nAUBR:%s\nDDBR:%s", *info, *dtoa(cFemonOsd::Instance()->GetVideoBitrate(), "%.0f"), *dtoa(cFemonOsd::Instance()->GetAudioBitrate(), "%.0f"), *dtoa(cFemonOsd::Instance()->GetDolbyBitrate(), "%.0f"));
|
||||
|
||||
LOCK_CHANNELS_READ;
|
||||
channel = Channels->GetByNumber(cDevice::CurrentChannel());
|
||||
if (channel)
|
||||
info = cString::sprintf("%s\nCHAN:%s", *info, *channel->ToText());
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
cString getFrontendName(cDevice *deviceP)
|
||||
{
|
||||
if (!deviceP)
|
||||
return NULL;
|
||||
|
||||
return (cString::sprintf("%s on deviceP #%d", *deviceP->DeviceName(), deviceP->CardIndex()));
|
||||
}
|
||||
|
||||
cString getFrontendStatus(cDevice *deviceP)
|
||||
{
|
||||
int status;
|
||||
int valid = DTV_STAT_VALID_NONE;
|
||||
|
||||
if (deviceP && deviceP->SignalStats(valid, NULL, NULL, NULL, NULL, NULL, &status)) {
|
||||
if (valid & DTV_STAT_VALID_STATUS)
|
||||
return (cString::sprintf("Status %s:%s:%s:%s:%s on deviceP #%d", (status & DTV_STAT_HAS_LOCK) ? "LOCKED" : "-", (status & DTV_STAT_HAS_SIGNAL) ? "SIGNAL" : "-", (status & DTV_STAT_HAS_CARRIER) ? "CARRIER" : "-", (status & DTV_STAT_HAS_VITERBI) ? "VITERBI" : "-", (status & DTV_STAT_HAS_SYNC) ? "SYNC" : "-", deviceP->CardIndex()));
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
double getSignal(cDevice *deviceP)
|
||||
{
|
||||
double strength;
|
||||
int valid = DTV_STAT_VALID_NONE;
|
||||
|
||||
if (deviceP && deviceP->SignalStats(valid, &strength, NULL, NULL, NULL, NULL, NULL)) {
|
||||
if (valid & DTV_STAT_VALID_STRENGTH)
|
||||
return strength;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
double getCNR(cDevice *deviceP)
|
||||
{
|
||||
double cnr;
|
||||
int valid = DTV_STAT_VALID_NONE;
|
||||
|
||||
if (deviceP && deviceP->SignalStats(valid, NULL, &cnr, NULL, NULL, NULL, NULL)) {
|
||||
if (valid & DTV_STAT_VALID_CNR)
|
||||
return cnr;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
double getBER(cDevice *deviceP)
|
||||
{
|
||||
double ber;
|
||||
int valid = DTV_STAT_VALID_NONE;
|
||||
|
||||
if (deviceP && deviceP->SignalStats(valid, NULL, NULL, NULL, &ber, NULL, NULL)) {
|
||||
if (valid & DTV_STAT_VALID_BERPOST)
|
||||
return ber;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
double getPER(cDevice *deviceP)
|
||||
{
|
||||
double per;
|
||||
int valid = DTV_STAT_VALID_NONE;
|
||||
|
||||
if (deviceP && deviceP->SignalStats(valid, NULL, NULL, NULL, NULL, &per, NULL)) {
|
||||
if (valid & DTV_STAT_VALID_PER)
|
||||
return per;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
cString getSignalStrength(double strengthP)
|
||||
{
|
||||
switch (FemonConfig.GetSignalUnit()) {
|
||||
case eFemonSignalUnitdBm: return cString::sprintf("%.2f %s", strengthP, tr("dBm"));
|
||||
case eFemonSignalUnitdBuV: return cString::sprintf("%.2f %s", strengthP + (120 - 11.25), tr("dBuV"));
|
||||
case eFemonSignalUnitdBV: return cString::sprintf("%.2f %s", strengthP - 11.25, tr("dBV"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getApids(const cChannel *channelP)
|
||||
{
|
||||
int value = 0;
|
||||
cString apids = cString::sprintf("%d", channelP->Apid(value));
|
||||
while (channelP->Apid(++value) && (value < MAXAPIDS))
|
||||
apids = cString::sprintf("%s, %d", *apids, channelP->Apid(value));
|
||||
return apids;
|
||||
}
|
||||
|
||||
cString getDpids(const cChannel *channelP)
|
||||
{
|
||||
int value = 0;
|
||||
cString dpids = cString::sprintf("%d", channelP->Dpid(value));
|
||||
while (channelP->Dpid(++value) && (value < MAXDPIDS))
|
||||
dpids = cString::sprintf("%s, %d", *dpids, channelP->Dpid(value));
|
||||
return dpids;
|
||||
}
|
||||
|
||||
cString getSpids(const cChannel *channelP)
|
||||
{
|
||||
int value = 0;
|
||||
cString spids = cString::sprintf("%d", channelP->Spid(value));
|
||||
while (channelP->Spid(++value) && (value < MAXSPIDS))
|
||||
spids = cString::sprintf("%s, %d", *spids, channelP->Spid(value));
|
||||
return spids;
|
||||
}
|
||||
|
||||
cString getCAids(const cChannel *channelP)
|
||||
{
|
||||
int value = 0;
|
||||
cString caids = cString::sprintf("%s", *getCA(channelP->Ca(value)));
|
||||
while (channelP->Ca(++value) && (value < MAXCAIDS))
|
||||
caids = cString::sprintf("%s, %s", *caids, *getCA(channelP->Ca(value)));
|
||||
return caids;
|
||||
}
|
||||
|
||||
cString getVideoStream(int value)
|
||||
{
|
||||
if (value != 0)
|
||||
return cString::sprintf("#%d", value);
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAudioStream(int valueP, const cChannel *channelP)
|
||||
{
|
||||
int pid = 0;
|
||||
if (IS_AUDIO_TRACK(valueP))
|
||||
pid = int(valueP - ttAudioFirst);
|
||||
if (channelP && channelP->Apid(pid)) {
|
||||
if (channelP->Alang(pid))
|
||||
return cString::sprintf("#%d (%s)", channelP->Apid(pid), channelP->Alang(pid));
|
||||
else
|
||||
return cString::sprintf("#%d", channelP->Apid(pid));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3Stream(int valueP, const cChannel *channelP)
|
||||
{
|
||||
int pid = 0;
|
||||
if (IS_DOLBY_TRACK(valueP))
|
||||
pid = int(valueP - ttDolbyFirst);
|
||||
if (channelP && channelP->Dpid(pid)) {
|
||||
if (channelP->Dlang(pid))
|
||||
return cString::sprintf("#%d (%s)", channelP->Dpid(pid), channelP->Dlang(pid));
|
||||
else
|
||||
return cString::sprintf("#%d", channelP->Dpid(pid));
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getVideoCodec(int valueP)
|
||||
{
|
||||
switch (valueP) {
|
||||
case VIDEO_CODEC_MPEG2: return cString::sprintf("%s", tr("MPEG-2"));
|
||||
case VIDEO_CODEC_H264: return cString::sprintf("%s", tr("H.264"));
|
||||
case VIDEO_CODEC_H265: return cString::sprintf("%s", tr("H.265"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAudioCodec(int valueP)
|
||||
{
|
||||
switch (valueP) {
|
||||
case AUDIO_CODEC_MPEG1_I: return cString::sprintf("%s", tr("MPEG-1 Layer I"));
|
||||
case AUDIO_CODEC_MPEG1_II: return cString::sprintf("%s", tr("MPEG-1 Layer II"));
|
||||
case AUDIO_CODEC_MPEG1_III: return cString::sprintf("%s", tr("MPEG-1 Layer III"));
|
||||
case AUDIO_CODEC_MPEG2_I: return cString::sprintf("%s", tr("MPEG-2 Layer I"));
|
||||
case AUDIO_CODEC_MPEG2_II: return cString::sprintf("%s", tr("MPEG-2 Layer II"));
|
||||
case AUDIO_CODEC_MPEG2_III: return cString::sprintf("%s", tr("MPEG-2 Layer III"));
|
||||
case AUDIO_CODEC_HEAAC: return cString::sprintf("%s", tr("HE-AAC"));
|
||||
case AUDIO_CODEC_LATM: return cString::sprintf("%s", tr("LATM"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAudioChannelMode(int valueP)
|
||||
{
|
||||
switch (valueP) {
|
||||
case AUDIO_CHANNEL_MODE_STEREO: return cString::sprintf("%s", tr("stereo"));
|
||||
case AUDIO_CHANNEL_MODE_JOINT_STEREO: return cString::sprintf("%s", tr("joint Stereo"));
|
||||
case AUDIO_CHANNEL_MODE_DUAL: return cString::sprintf("%s", tr("dual"));
|
||||
case AUDIO_CHANNEL_MODE_SINGLE: return cString::sprintf("%s", tr("mono"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getCoderate(int valueP)
|
||||
{
|
||||
return cString::sprintf("%s", getUserString(valueP, CoderateValues));
|
||||
}
|
||||
|
||||
cString getTransmission(int valueP)
|
||||
{
|
||||
return cString::sprintf("%s", getUserString(valueP, TransmissionValues));
|
||||
}
|
||||
|
||||
cString getBandwidth(int valueP)
|
||||
{
|
||||
return cString::sprintf("%s", getUserString(valueP, BandwidthValues));
|
||||
}
|
||||
|
||||
cString getInversion(int valueP)
|
||||
{
|
||||
return cString::sprintf("%s", getUserString(valueP, InversionValues));
|
||||
}
|
||||
|
||||
cString getHierarchy(int valueP)
|
||||
{
|
||||
return cString::sprintf("%s", getUserString(valueP, HierarchyValues));
|
||||
}
|
||||
|
||||
cString getGuard(int valueP)
|
||||
{
|
||||
return cString::sprintf("%s", getUserString(valueP, GuardValues));
|
||||
}
|
||||
|
||||
cString getModulation(int valueP)
|
||||
{
|
||||
return cString::sprintf("%s", getUserString(valueP, ModulationValues));
|
||||
}
|
||||
|
||||
cString getTerrestrialSystem(int valueP)
|
||||
{
|
||||
return cString::sprintf("%s", getUserString(valueP, SystemValuesTerr));
|
||||
}
|
||||
|
||||
cString getSatelliteSystem(int valueP)
|
||||
{
|
||||
return cString::sprintf("%s", getUserString(valueP, SystemValuesSat));
|
||||
}
|
||||
|
||||
cString getRollOff(int valueP)
|
||||
{
|
||||
return cString::sprintf("%s", getUserString(valueP, RollOffValues));
|
||||
}
|
||||
|
||||
cString getPilot(int valueP)
|
||||
{
|
||||
return cString::sprintf("%s", getUserString(valueP, PilotValues));
|
||||
}
|
||||
|
||||
cString getResolution(int widthP, int heightP, int scanP)
|
||||
{
|
||||
if ((widthP > 0) && (heightP > 0)) {
|
||||
switch (scanP) {
|
||||
case VIDEO_SCAN_INTERLACED: return cString::sprintf("%dx%d %s", widthP, heightP, tr("interlaced"));
|
||||
case VIDEO_SCAN_PROGRESSIVE: return cString::sprintf("%dx%d %s", widthP, heightP, tr("progressive"));
|
||||
default: return cString::sprintf("%dx%d", widthP, heightP);
|
||||
}
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAspectRatio(int valueP)
|
||||
{
|
||||
switch (valueP) {
|
||||
case VIDEO_ASPECT_RATIO_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
case VIDEO_ASPECT_RATIO_EXTENDED: return cString::sprintf("%s", tr("extended"));
|
||||
case VIDEO_ASPECT_RATIO_1_1: return cString::sprintf("1:1");
|
||||
case VIDEO_ASPECT_RATIO_4_3: return cString::sprintf("4:3");
|
||||
case VIDEO_ASPECT_RATIO_16_9: return cString::sprintf("16:9");
|
||||
case VIDEO_ASPECT_RATIO_2_21_1: return cString::sprintf("2.21:1");
|
||||
case VIDEO_ASPECT_RATIO_12_11: return cString::sprintf("12:11");
|
||||
case VIDEO_ASPECT_RATIO_10_11: return cString::sprintf("10:11");
|
||||
case VIDEO_ASPECT_RATIO_16_11: return cString::sprintf("16:11");
|
||||
case VIDEO_ASPECT_RATIO_40_33: return cString::sprintf("40:33");
|
||||
case VIDEO_ASPECT_RATIO_24_11: return cString::sprintf("24:11");
|
||||
case VIDEO_ASPECT_RATIO_20_11: return cString::sprintf("20:11");
|
||||
case VIDEO_ASPECT_RATIO_32_11: return cString::sprintf("32:11");
|
||||
case VIDEO_ASPECT_RATIO_80_33: return cString::sprintf("80:33");
|
||||
case VIDEO_ASPECT_RATIO_18_11: return cString::sprintf("18:11");
|
||||
case VIDEO_ASPECT_RATIO_15_11: return cString::sprintf("15:11");
|
||||
case VIDEO_ASPECT_RATIO_64_33: return cString::sprintf("64:33");
|
||||
case VIDEO_ASPECT_RATIO_160_99: return cString::sprintf("160:99");
|
||||
case VIDEO_ASPECT_RATIO_3_2: return cString::sprintf("3:2");
|
||||
case VIDEO_ASPECT_RATIO_2_1: return cString::sprintf("2:1");
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getVideoFormat(int valueP)
|
||||
{
|
||||
switch (valueP) {
|
||||
case VIDEO_FORMAT_UNKNOWN: return cString::sprintf("%s", tr("unknown"));
|
||||
case VIDEO_FORMAT_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
case VIDEO_FORMAT_COMPONENT: return cString::sprintf("%s", tr("component"));
|
||||
case VIDEO_FORMAT_PAL: return cString::sprintf("%s", tr("PAL"));
|
||||
case VIDEO_FORMAT_NTSC: return cString::sprintf("%s", tr("NTSC"));
|
||||
case VIDEO_FORMAT_SECAM: return cString::sprintf("%s", tr("SECAM"));
|
||||
case VIDEO_FORMAT_MAC: return cString::sprintf("%s", tr("MAC"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getFrameRate(double valueP)
|
||||
{
|
||||
if (valueP > 0)
|
||||
return cString::sprintf("%.2f %s", valueP, tr("Hz"));
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3BitStreamMode(int valueP, int codingP)
|
||||
{
|
||||
switch (valueP) {
|
||||
case AUDIO_BITSTREAM_MODE_CM: return cString::sprintf("%s", tr("Complete Main (CM)"));
|
||||
case AUDIO_BITSTREAM_MODE_ME: return cString::sprintf("%s", tr("Music and Effects (ME)"));
|
||||
case AUDIO_BITSTREAM_MODE_VI: return cString::sprintf("%s", tr("Visually Impaired (VI)"));
|
||||
case AUDIO_BITSTREAM_MODE_HI: return cString::sprintf("%s", tr("Hearing Impaired (HI)"));
|
||||
case AUDIO_BITSTREAM_MODE_D: return cString::sprintf("%s", tr("Dialogue (D)"));
|
||||
case AUDIO_BITSTREAM_MODE_C: return cString::sprintf("%s", tr("Commentary (C)"));
|
||||
case AUDIO_BITSTREAM_MODE_E: return cString::sprintf("%s", tr("Emergency (E)"));
|
||||
case AUDIO_BITSTREAM_MODE_VO_KAR: return cString::sprintf("%s", (codingP == 1) ? tr("Voice Over (VO)") : tr("Karaoke"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3AudioCodingMode(int valueP, int streamP)
|
||||
{
|
||||
if (streamP != 7) {
|
||||
switch (valueP) {
|
||||
case AUDIO_CODING_MODE_1_1: return cString::sprintf("1+1 - %s, %s", tr("Ch1"), tr("Ch2"));
|
||||
case AUDIO_CODING_MODE_1_0: return cString::sprintf("1/0 - %s", tr("C"));
|
||||
case AUDIO_CODING_MODE_2_0: return cString::sprintf("2/0 - %s, %s", tr("L"), tr("R"));
|
||||
case AUDIO_CODING_MODE_3_0: return cString::sprintf("3/0 - %s, %s, %s", tr("L"), tr("C"), tr("R"));
|
||||
case AUDIO_CODING_MODE_2_1: return cString::sprintf("2/1 - %s, %s, %s", tr("L"), tr("R"), tr("S"));
|
||||
case AUDIO_CODING_MODE_3_1: return cString::sprintf("3/1 - %s, %s, %s, %s", tr("L"), tr("C"), tr("R"), tr("S"));
|
||||
case AUDIO_CODING_MODE_2_2: return cString::sprintf("2/2 - %s, %s, %s, %s", tr("L"), tr("R"), tr("SL"), tr("SR"));
|
||||
case AUDIO_CODING_MODE_3_2: return cString::sprintf("3/2 - %s, %s, %s, %s, %s", tr("L"), tr("C"), tr("R"), tr("SL"), tr("SR"));
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3CenterMixLevel(int valueP)
|
||||
{
|
||||
switch (valueP) {
|
||||
case AUDIO_CENTER_MIX_LEVEL_MINUS_3dB: return cString::sprintf("-3.0 %s", tr("dB"));
|
||||
case AUDIO_CENTER_MIX_LEVEL_MINUS_4_5dB: return cString::sprintf("-4.5 %s", tr("dB"));
|
||||
case AUDIO_CENTER_MIX_LEVEL_MINUS_6dB: return cString::sprintf("-6.0 %s", tr("dB"));
|
||||
case AUDIO_CENTER_MIX_LEVEL_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3SurroundMixLevel(int valueP)
|
||||
{
|
||||
switch (valueP) {
|
||||
case AUDIO_SURROUND_MIX_LEVEL_MINUS_3dB: return cString::sprintf("-3 %s", tr("dB"));
|
||||
case AUDIO_SURROUND_MIX_LEVEL_MINUS_6dB: return cString::sprintf("-6 %s", tr("dB"));
|
||||
case AUDIO_SURROUND_MIX_LEVEL_0_dB: return cString::sprintf("0 %s", tr("dB"));
|
||||
case AUDIO_SURROUND_MIX_LEVEL_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3DolbySurroundMode(int valueP)
|
||||
{
|
||||
switch (valueP) {
|
||||
case AUDIO_DOLBY_SURROUND_MODE_NOT_INDICATED: return cString::sprintf("%s", tr("not indicated"));
|
||||
case AUDIO_DOLBY_SURROUND_MODE_NOT_DOLBYSURROUND: return cString::sprintf("%s", trVDR("no"));
|
||||
case AUDIO_DOLBY_SURROUND_MODE_DOLBYSURROUND: return cString::sprintf("%s", trVDR("yes"));
|
||||
case AUDIO_DOLBY_SURROUND_MODE_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getAC3DialogLevel(int valueP)
|
||||
{
|
||||
if (valueP > 0)
|
||||
return cString::sprintf("-%d %s", valueP, tr("dB"));
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getFrequencyMHz(int valueP)
|
||||
{
|
||||
double freq = valueP;
|
||||
while (freq > 20000.0) freq /= 1000.0;
|
||||
return cString::sprintf("%s %s", *dtoa(freq, "%lg"), tr("MHz"));
|
||||
}
|
||||
|
||||
cString getAudioSamplingFreq(int valueP)
|
||||
{
|
||||
switch (valueP) {
|
||||
case AUDIO_SAMPLING_FREQUENCY_INVALID: return cString::sprintf("---");
|
||||
case AUDIO_SAMPLING_FREQUENCY_RESERVED: return cString::sprintf("%s", tr("reserved"));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("%d %s", valueP, tr("Hz"));
|
||||
}
|
||||
|
||||
cString getAudioBitrate(double valueP, double streamP)
|
||||
{
|
||||
switch ((int)streamP) {
|
||||
case AUDIO_BITRATE_INVALID: return cString::sprintf("---");
|
||||
case AUDIO_BITRATE_RESERVED: return cString::sprintf("%s (%s)", tr("reserved"), *getBitrateKbits(valueP));
|
||||
case AUDIO_BITRATE_FREE: return cString::sprintf("%s (%s)", tr("free"), *getBitrateKbits(valueP));
|
||||
default: break;
|
||||
}
|
||||
return cString::sprintf("%s (%s)", *getBitrateKbits(streamP), *getBitrateKbits(valueP));
|
||||
}
|
||||
|
||||
cString getVideoBitrate(double valueP, double streamP)
|
||||
{
|
||||
return cString::sprintf("%s (%s)", *getBitrateMbits(streamP), *getBitrateMbits(valueP));
|
||||
}
|
||||
|
||||
cString getBitrateMbits(double valueP)
|
||||
{
|
||||
if (valueP > 0)
|
||||
return cString::sprintf("%.2f %s", valueP / 1000000.0, tr("Mbit/s"));
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
cString getBitrateKbits(double valueP)
|
||||
{
|
||||
if (valueP > 0)
|
||||
return cString::sprintf("%.0f %s", valueP / 1000.0, tr("kbit/s"));
|
||||
return cString::sprintf("---");
|
||||
}
|
||||
|
||||
// --- cFemonBitStream -------------------------------------------------------
|
||||
|
||||
uint32_t cFemonBitStream::GetUeGolomb()
|
||||
{
|
||||
int n = 0;
|
||||
|
||||
while (!GetBit() && (n < 32))
|
||||
n++;
|
||||
|
||||
return (n ? ((1 << n) - 1) + GetBits(n) : 0);
|
||||
}
|
||||
|
||||
int32_t cFemonBitStream::GetSeGolomb()
|
||||
{
|
||||
uint32_t r = GetUeGolomb() + 1;
|
||||
|
||||
return ((r & 1) ? -(r >> 1) : (r >> 1));
|
||||
}
|
||||
|
||||
void cFemonBitStream::SkipGolomb()
|
||||
{
|
||||
int n = 0;
|
||||
|
||||
while (!GetBit() && (n < 32))
|
||||
n++;
|
||||
|
||||
SkipBits(n);
|
||||
}
|
81
tools.h
81
tools.h
@ -1,81 +0,0 @@
|
||||
/*
|
||||
* tools.h: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __FEMON_COMMON_H
|
||||
#define __FEMON_COMMON_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <vdr/channels.h>
|
||||
#include <vdr/dvbdevice.h>
|
||||
#include <vdr/remux.h>
|
||||
#include <vdr/tools.h>
|
||||
|
||||
#define ELEMENTS(x) (sizeof(x) / sizeof(x[0]))
|
||||
|
||||
#define FRONTEND_DEVICE "/dev/dvb/adapter%d/frontend%d"
|
||||
|
||||
#define SATIP_DEVICE "SAT>IP"
|
||||
|
||||
cString getFrontendInfo(cDevice *deviceP);
|
||||
cString getFrontendName(cDevice *deviceP);
|
||||
cString getFrontendStatus(cDevice *deviceP);
|
||||
|
||||
double getCNR(cDevice *deviceP);
|
||||
double getSignal(cDevice *deviceP);
|
||||
double getBER(cDevice *deviceP);
|
||||
double getPER(cDevice *deviceP);
|
||||
|
||||
cString getSignalStrength(double strengthP);
|
||||
cString getApids(const cChannel *channelP);
|
||||
cString getDpids(const cChannel *channelP);
|
||||
cString getSpids(const cChannel *channelP);
|
||||
cString getCAids(const cChannel *channelP);
|
||||
cString getVideoStream(int valueP);
|
||||
cString getVideoCodec(int valueP);
|
||||
cString getAudioStream(int valueP, const cChannel *channelP);
|
||||
cString getAudioCodec(int valueP);
|
||||
cString getAudioChannelMode(int valueP);
|
||||
cString getCoderate(int valueP);
|
||||
cString getTransmission(int valueP);
|
||||
cString getBandwidth(int valueP);
|
||||
cString getInversion(int valueP);
|
||||
cString getHierarchy(int valueP);
|
||||
cString getGuard(int valueP);
|
||||
cString getModulation(int valueP);
|
||||
cString getTerrestrialSystem(int valueP);
|
||||
cString getSatelliteSystem(int valueP);
|
||||
cString getRollOff(int valueP);
|
||||
cString getPilot(int valueP);
|
||||
cString getResolution(int widthP, int heightP, int scanP);
|
||||
cString getAspectRatio(int valueP);
|
||||
cString getVideoFormat(int valueP);
|
||||
cString getFrameRate(double valueP);
|
||||
cString getAC3Stream(int valueP, const cChannel *channelP);
|
||||
cString getAC3BitStreamMode(int valueP, int codingP);
|
||||
cString getAC3AudioCodingMode(int valueP, int streamP);
|
||||
cString getAC3CenterMixLevel(int valueP);
|
||||
cString getAC3SurroundMixLevel(int valueP);
|
||||
cString getAC3DolbySurroundMode(int valueP);
|
||||
cString getAC3DialogLevel(int valueP);
|
||||
cString getFrequencyMHz(int valueP);
|
||||
cString getAudioSamplingFreq(int valueP);
|
||||
cString getAudioBitrate(double valueP, double streamP);
|
||||
cString getVideoBitrate(double valueP, double streamP);
|
||||
cString getBitrateMbits(double valueP);
|
||||
cString getBitrateKbits(double valueP);
|
||||
|
||||
class cFemonBitStream : public cBitStream {
|
||||
public:
|
||||
cFemonBitStream(const uint8_t *dataP, const int lengthP) : cBitStream(dataP, lengthP) {}
|
||||
uint32_t GetUeGolomb();
|
||||
int32_t GetSeGolomb();
|
||||
void SkipGolomb();
|
||||
void SkipUeGolomb() { SkipGolomb(); }
|
||||
void SkipSeGolomb() { SkipGolomb(); }
|
||||
};
|
||||
|
||||
#endif // __FEMON_COMMON_H
|
94
video.h
94
video.h
@ -1,94 +0,0 @@
|
||||
/*
|
||||
* video.h: Frontend Status Monitor plugin for the Video Disk Recorder
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __FEMON_VIDEO_H
|
||||
#define __FEMON_VIDEO_H
|
||||
|
||||
enum eVideoCodec {
|
||||
VIDEO_CODEC_INVALID = -1,
|
||||
VIDEO_CODEC_UNKNOWN,
|
||||
VIDEO_CODEC_MPEG2,
|
||||
VIDEO_CODEC_H264,
|
||||
VIDEO_CODEC_H265
|
||||
};
|
||||
|
||||
enum eVideoFormat {
|
||||
VIDEO_FORMAT_INVALID = -1,
|
||||
VIDEO_FORMAT_UNKNOWN,
|
||||
VIDEO_FORMAT_RESERVED,
|
||||
VIDEO_FORMAT_COMPONENT,
|
||||
VIDEO_FORMAT_PAL,
|
||||
VIDEO_FORMAT_NTSC,
|
||||
VIDEO_FORMAT_SECAM,
|
||||
VIDEO_FORMAT_MAC
|
||||
};
|
||||
|
||||
enum eVideoScan {
|
||||
VIDEO_SCAN_INVALID = -1,
|
||||
VIDEO_SCAN_UNKNOWN,
|
||||
VIDEO_SCAN_RESERVED,
|
||||
VIDEO_SCAN_INTERLACED,
|
||||
VIDEO_SCAN_PROGRESSIVE
|
||||
};
|
||||
|
||||
enum eVideoAspectRatio {
|
||||
VIDEO_ASPECT_RATIO_INVALID = -1,
|
||||
VIDEO_ASPECT_RATIO_RESERVED,
|
||||
VIDEO_ASPECT_RATIO_EXTENDED,
|
||||
VIDEO_ASPECT_RATIO_1_1,
|
||||
VIDEO_ASPECT_RATIO_4_3,
|
||||
VIDEO_ASPECT_RATIO_16_9,
|
||||
VIDEO_ASPECT_RATIO_2_21_1,
|
||||
VIDEO_ASPECT_RATIO_12_11,
|
||||
VIDEO_ASPECT_RATIO_10_11,
|
||||
VIDEO_ASPECT_RATIO_16_11,
|
||||
VIDEO_ASPECT_RATIO_40_33,
|
||||
VIDEO_ASPECT_RATIO_24_11,
|
||||
VIDEO_ASPECT_RATIO_20_11,
|
||||
VIDEO_ASPECT_RATIO_32_11,
|
||||
VIDEO_ASPECT_RATIO_80_33,
|
||||
VIDEO_ASPECT_RATIO_18_11,
|
||||
VIDEO_ASPECT_RATIO_15_11,
|
||||
VIDEO_ASPECT_RATIO_64_33,
|
||||
VIDEO_ASPECT_RATIO_160_99,
|
||||
VIDEO_ASPECT_RATIO_3_2,
|
||||
VIDEO_ASPECT_RATIO_2_1
|
||||
};
|
||||
|
||||
typedef struct video_info {
|
||||
eVideoCodec codec; // enum
|
||||
eVideoFormat format; // enum
|
||||
eVideoScan scan; // enum
|
||||
eVideoAspectRatio aspectRatio; // enum
|
||||
int width; // pixels
|
||||
int height; // pixels
|
||||
double frameRate; // Hz
|
||||
double bitrate; // bit/s
|
||||
} video_info_t;
|
||||
|
||||
class cFemonVideoIf {
|
||||
public:
|
||||
cFemonVideoIf() {}
|
||||
virtual ~cFemonVideoIf() {}
|
||||
|
||||
// eVideoCodec
|
||||
virtual void SetVideoCodec(eVideoCodec codecP) = 0;
|
||||
// eVideoFormat
|
||||
virtual void SetVideoFormat(eVideoFormat formatP) = 0;
|
||||
// eVideoScan
|
||||
virtual void SetVideoScan(eVideoScan scanP) = 0;
|
||||
// eVideoAspectRatio
|
||||
virtual void SetVideoAspectRatio(eVideoAspectRatio aspectRatioP) = 0;
|
||||
// pixels
|
||||
virtual void SetVideoSize(int widthP, int heightP) = 0;
|
||||
// Hz
|
||||
virtual void SetVideoFramerate(double frameRateP) = 0;
|
||||
// Mbit/s
|
||||
virtual void SetVideoBitrate(double bitRateP) = 0;
|
||||
};
|
||||
|
||||
#endif //__FEMON_VIDEO_H
|
Loading…
Reference in New Issue
Block a user