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

Compare commits

..

101 Commits

Author SHA1 Message Date
Rolf Ahrenberg
60386835dd Updated for vdr-1.7.12. 2010-02-01 13:48:28 +02:00
Rolf Ahrenberg
38f4d3d9b8 Added Lithuanian translation (Thanks to Valdemaras Pipiras). 2009-12-14 16:47:16 +02:00
Rolf Ahrenberg
078f0552fc Fixed a typo. 2009-11-25 16:03:41 +02:00
Rolf Ahrenberg
1fd7c90c3b Updated Estonian translation (Thanks to Arthur Konovalov).
Updated version number.
2009-11-23 15:11:37 +02:00
Rolf Ahrenberg
44fa48c59f Added debug() and error() macros. 2009-10-01 12:13:35 +03:00
Rolf Ahrenberg
554dac9674 Increased video buffer size, added buffer timeouts and fixed deleting AC3 buffer data. 2009-09-29 15:31:32 +03:00
Rolf Ahrenberg
8267abcc3b Revert "Changed cRingBufferLinear to cRingBufferFrame."
This reverts commit edb8b4090a.
2009-09-27 16:59:42 +03:00
Rolf Ahrenberg
ea4561a874 Silenced a compilation warning. 2009-09-26 12:15:26 +03:00
Rolf Ahrenberg
56b9b89204 Cleaned up translations and warnings. 2009-09-26 11:54:31 +03:00
Rolf Ahrenberg
3d994be0b7 Cosmetics. 2009-09-25 22:31:12 +03:00
Rolf Ahrenberg
b7d44e730e Added Chinese translation (Thanks to NanFeng). 2009-09-24 17:28:02 +03:00
Rolf Ahrenberg
edb8b4090a Changed cRingBufferLinear to cRingBufferFrame. 2009-09-22 20:37:15 +03:00
Rolf Ahrenberg
21d9c20beb Removed bitstream parsing from Receive() method.
Refactored the error logging from unimplemented ioctl functions.
2009-09-22 08:44:30 +03:00
Rolf Ahrenberg
080f390a75 Remove compilation warnings. 2009-09-16 12:05:15 +03:00
Rolf Ahrenberg
fefb7f0fde Removed error logging from unimplemented ioctl functions. 2009-09-16 09:37:51 +03:00
Rolf Ahrenberg
ba133f15f8 Changed H.264 parser to show display aspect ratio. 2009-09-15 10:57:53 +03:00
Rolf Ahrenberg
4e87693de6 Tweaked symbols. 2009-09-05 01:22:27 +03:00
Rolf Ahrenberg
8ea980a60f Fixed symbols. 2009-09-05 01:05:17 +03:00
Rolf Ahrenberg
5635c2dc52 Fixed debug print output. 2009-09-04 10:47:19 +03:00
Rolf Ahrenberg
7551788969 Changed bitrate to bit/s instead of Mbit/s. 2009-09-04 08:44:33 +03:00
Rolf Ahrenberg
6b6169d5f3 Disabled temporarily SEI in H.264 bitstream parser. 2009-09-03 18:24:51 +03:00
Rolf Ahrenberg
22644e6ae4 Header cleanup. 2009-09-03 18:20:31 +03:00
Rolf Ahrenberg
3fc73af3d5 Added non-strict limits for 1080/720/576/480 format symbols. 2009-09-03 18:15:04 +03:00
Rolf Ahrenberg
c07abc7ed5 Added 1080/720/576/480 symbols into status window. 2009-09-02 15:58:30 +03:00
Rolf Ahrenberg
e57b36a151 Fixed H.264 bitstream parser.
Added a mutex to receiver class.
2009-09-01 15:30:48 +03:00
Rolf Ahrenberg
453ca7a2a5 Fixed H.264 bitstream parsing. 2009-08-31 19:12:15 +03:00
Rolf Ahrenberg
daf823435b Changed to use VDR's core translations. 2009-08-29 21:01:20 +03:00
Rolf Ahrenberg
53b42a2d4a Fixed H.264 parser. 2009-08-28 20:54:34 +03:00
Rolf Ahrenberg
167da08ab3 Silenced compiler warnings. 2009-08-26 22:44:49 +03:00
Rolf Ahrenberg
61ff96556e Fixed bitstream parser for H.264. 2009-08-26 16:24:49 +03:00
Rolf Ahrenberg
a06ae6f6ff Added PES assembler. 2009-08-25 20:22:06 +03:00
Rolf Ahrenberg
2e6a236a56 Removed OSD offset and height options. 2009-07-08 23:14:19 +03:00
Rolf Ahrenberg
6086c135c7 Added missing MINFONTSIZE and MAXFONTSIZE defines. 2009-06-18 23:08:25 +03:00
Rolf Ahrenberg
db9735b80b Cleaned up compilation warnings. 2009-06-18 17:38:27 +03:00
Rolf Ahrenberg
84878bd1b9 Cleaned up compilation warnings. 2009-06-18 17:35:35 +03:00
Rolf Ahrenberg
afd72642e9 Fixed font handling to be thread-safe. 2009-06-18 12:16:11 +03:00
Rolf Ahrenberg
0a162a9a8c Cleaned up compilation warnings. 2009-03-24 12:51:51 +02:00
Rolf Ahrenberg
2e2aacd573 Fixed end of sequence NAL unit. 2009-02-11 14:51:55 +02:00
Rolf Ahrenberg
4e8fdaf99f Fixed closing of frontend file handles. 2009-01-06 23:10:02 +02:00
Rolf Ahrenberg
eb2da4721c Added whitespace cleanups. 2008-12-16 12:51:59 +02:00
Rolf Ahrenberg
5cf9b4af0b Updated for vdr-1.7.2.
Removed the "Show CA system" setup option.
2008-12-16 12:26:46 +02:00
Rolf Ahrenberg
83556bf2d3 Added whitespace cleanups.
Changed info window to use the channel source instead of the frontend type.
2008-12-13 22:25:26 +02:00
Rolf Ahrenberg
2340ade6c8 Updated HISTORY. 2008-11-30 15:18:12 +02:00
Rolf Ahrenberg
7db77978b5 Fixed partially H.264 SEI parsing. 2008-11-29 19:33:29 +02:00
Rolf Ahrenberg
ab8f5f3de8 Fixed a deadlock in cFemonReceiver. 2008-11-23 22:26:48 +02:00
Rolf Ahrenberg
427b3023ba Added some OSD tweaks. 2008-11-23 04:45:20 +02:00
Rolf Ahrenberg
8f283f27f5 Removed the FEMON_NTSC option. 2008-11-23 03:12:21 +02:00
Rolf Ahrenberg
c4fda38364 Replaced "Use single area (8bpp)" option with VDR's "Setup/OSD/Anti-alias". 2008-11-23 02:22:13 +02:00
Rolf Ahrenberg
219fc78226 Fixed a crash. 2008-11-23 02:01:27 +02:00
Rolf Ahrenberg
5333a9274d Added getAC3Stream() function. 2008-11-22 23:12:39 +02:00
Rolf Ahrenberg
a8c065639a Fixed a memory leak.
Added a check for the minimum OSD height.
2008-11-12 17:58:32 +02:00
Rolf Ahrenberg
fa41c95b1c Updated Italian translation (Thanks to Diego Pierotto). 2008-11-11 16:30:21 +02:00
Rolf Ahrenberg
6eb4329fff Added getVideoStream() and getAudioStream() functions. 2008-11-11 00:30:00 +02:00
Rolf Ahrenberg
99244a136e Added encryption icon. 2008-11-09 14:35:12 +02:00
Rolf Ahrenberg
8bf429b381 Added initial support for H.264 and HE-AAC.
Fixed detection of false positives in audio/video streams.
Refactored source code.
2008-11-09 13:43:27 +02:00
Rolf Ahrenberg
5fc74330d3 Updated HISTORY for the release. 2008-10-12 22:43:38 +03:00
Rolf Ahrenberg
f40d9b699b Optimized OSD thread termination. 2008-09-17 18:51:38 +03:00
Rolf Ahrenberg
1570cf80f8 Optimized receiver thread termination. 2008-09-10 17:37:28 +03:00
Rolf Ahrenberg
0b19b7b31d Added .gitignore. 2008-08-29 17:40:51 +03:00
Rolf Ahrenberg
f092a4127c Converted HISTORY and fi_FI.po to UTF-8. 2008-08-24 23:22:27 +03:00
Rolf Ahrenberg
93ccc78469 Updated Italian translation (Thanks to Diego Pierotto).
Fixed a crash if no channel available (Thanks to Winfried Köhler)
2008-06-20 04:20:00 +03:00
Rolf Ahrenberg
2e6cd471ba Updated for vdr-1.6.0.
Updated Italian translation (Thanks to Diego Pierotto).
Added ST:TNG theme (Thanks to Fabian Förg).
2008-03-27 04:20:00 +02:00
Rolf Ahrenberg
09acce8a0b 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-02-18 04:20:00 +02:00
Rolf Ahrenberg
71b2993345 Updated Italian translation (Thanks to Diego Pierotto).
Added '-Wno-parentheses' to the compiler options.
Mapped 'kInfo' as help key in setup menu.
2008-01-20 04:20:00 +02:00
Rolf Ahrenberg
d6e5a01ada Added Spids support.
Minor OSD layout changes.
2007-10-14 04:20:00 +03:00
Rolf Ahrenberg
c8c639be62 Updated for vdr-1.5.8. 2007-08-19 04:20:00 +03:00
Rolf Ahrenberg
bf02f334f6 Updated for vdr-1.5.7. 2007-08-14 04:20:00 +03:00
Rolf Ahrenberg
64e56af6dc Fixed a race condition in cFemonReceiver (Thanks to Reinhard Nissl). 2007-05-15 04:20:00 +03:00
Rolf Ahrenberg
830aa73e1a Fixed opening while replaying (Thanks to Antti Seppälä for reporting this one). 2007-05-01 04:20:00 +03:00
Rolf Ahrenberg
78048d8ea0 Updated for vdr-1.5.0. 2007-01-08 04:20:00 +02:00
Rolf Ahrenberg
42c6b69490 Added support for svdrpservice plugin (Thanks to Frank Schmirler).
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.
2006-09-17 04:20:00 +03:00
Rolf Ahrenberg
6ce0ca32bd Fixed device switching priority (Thanks to Andreas Brugger).
Fixed device switching back to the primary device.
2006-06-06 04:20:00 +03:00
Rolf Ahrenberg
74a2a1bbe7 Updated for vdr-1.4.0.
Modified APIVERSION code in Makefile.
Updated german translation (Thanks to Andreas Brachold).
2006-04-30 04:20:00 +03:00
Rolf Ahrenberg
bf85e32d0d Added STRIP option for Makefile (Thanks to Ville Skyttä).
Modified APIVERSION code in Makefile.
2006-04-23 04:20:00 +03:00
Rolf Ahrenberg
caf42f7ace Updated for vdr-1.3.47. 2006-04-20 04:20:00 +03:00
Rolf Ahrenberg
c2b1e5a187 Updated for vdr-1.3.44.
Minor Makefile changes.
Made all symbol data 'const'.
Added spanish translation (Thanks to Luis Palacios).
2006-03-08 04:20:00 +02:00
Rolf Ahrenberg
e90fe6065c Updated for vdr-1.3.42.
Added "SilverGreen" theme (Thanks to Rififi77 @ VDRPortal).
2006-02-06 04:20:00 +02:00
Rolf Ahrenberg
7ee255830a 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 EgalsTry theme (Thanks to Uwe Hanke).
2006-01-25 04:20:00 +02:00
Rolf Ahrenberg
7da8cb2110 Updated for vdr-1.3.36.
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).
2005-11-13 04:20:00 +02:00
Rolf Ahrenberg
e2fb9e994a Updated for vdr-1.3.34.
Added Enigma theme (Thanks to Rolf Hoverath).
Added EgalsTry theme (Thanks to Uwe Hanke).
Added option to disable rounded corners.
2005-10-04 04:20:00 +03:00
Rolf Ahrenberg
37957be99f Updated for vdr-1.3.31.
Added preliminary svdrp and service support.
2005-08-28 04:20:00 +03:00
Rolf Ahrenberg
713f9e652a Threads updated for vdr-1.3.29. 2005-08-15 04:20:00 +03:00
Rolf Ahrenberg
7c948cde72 Fixed AC3-info flickering (Thanks to Pasi Juppo for reporting this one).
Added "Analog" type CA system.
Plugin is now stripped by default.
2005-07-23 04:20:00 +03:00
Rolf Ahrenberg
8e57eec535 Renamed compiling switches ('DEBUG' to 'FEMON_DEBUG' and 'NTSC_SYSTEM' to 'FEMON_NTSC').
Enabled preliminary support for the device switching.
2005-05-20 04:20:00 +03:00
Rolf Ahrenberg
0f111eb660 Updated Estonian translations (Thanks to Arthur Konovalov).
Added the missing german translations (Thanks to #vdr-portal).
2005-04-04 04:20:00 +03:00
Rolf Ahrenberg
6670f85a20 Cleaned up finnish translations (Thanks to Ville Skyttä). 2005-04-02 04:20:00 +03:00
Rolf Ahrenberg
9814970182 Default make target is now all.
Fixed the access rights of symbols subdirectory (Thanks to Harri Kukkonen).
Added a new theme: Moronimo (Thanks to Morone).
2005-04-01 04:20:00 +03:00
Rolf Ahrenberg
5bda0fa833 Horizontal offset setup option should be functional now. 2005-02-26 04:20:00 +02:00
Rolf Ahrenberg
ca954757db Updated for vdr-1.3.21.
Minor modification for DEBUG mode.
Added preliminary support for themes and some GUI tweaks.
Added horizontal offset setup option.
2005-02-24 04:20:00 +02:00
Rolf Ahrenberg
825755281f Added Estonian translations (Thanks to Arthur Konovalov). 2005-01-24 04:20:00 +02:00
Rolf Ahrenberg
ab3f270eed Updated for vdr-1.3.19. 2005-01-23 04:20:00 +02:00
Rolf Ahrenberg
995b2567e5 Some minor cosmetic fixes. 2005-01-23 04:20:00 +02:00
Rolf Ahrenberg
6f9961f499 Updated for vdr-1.3.18.
Added DEBUG mode (make DEBUG=1 plugins).
OSD height is now user configurable.
Added audio channel selection into Yellow key.
2005-01-15 04:20:00 +02:00
Rolf Ahrenberg
c454189adf Updated for vdr-1.3.17.
Fixed receiver related crash (Thanks to Marco Schluessler).
2004-11-28 04:20:00 +02:00
Rolf Ahrenberg
5339f71b33 Yet Another Minor Release.
Integrated the CA system names patch: "Setup / Show CA System".
2004-09-11 04:20:00 +03:00
Rolf Ahrenberg
8e53fa8521 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).
Added patches directory: CA system names by Lauri Tischler.
2004-08-18 04:20:00 +03:00
Rolf Ahrenberg
9514ed5387 Added some new symbols and beautified the old ones.
Added audio track selection feature.
Added preliminary device switching feature (disabled at the moment).
2004-06-24 04:20:00 +03:00
Rolf Ahrenberg
a6039cdd66 Added "AC-3 Stream Information" display mode (Thanks to Lothar Englisch). 2004-06-11 04:20:00 +03:00
Rolf Ahrenberg
848a2ba78d Fixed the channel switch bug (reported by Stefan Lucke).
Nid/Tid/Rid are now included in translations.
Added video format and aspect ratio symbols into status window.
2004-06-06 04:20:00 +03:00
Rolf Ahrenberg
74ed4d8490 Added "Stream Information" display mode.
Toggle between different modes with 'OK' key:
 .-> basic -> transponder -> stream -.
 `-----------------------------------´
Added missing german translations (Thanks to Peter Marquardt).
2004-05-30 04:20:00 +03:00
Rolf Ahrenberg
8c7c110cf2 Updated for vdr-1.3.7 and removed compability with older versions. 2004-05-18 04:20:00 +03:00
77 changed files with 9132 additions and 3163 deletions

6
.gitignore vendored Normal file
View File

@@ -0,0 +1,6 @@
.dependencies
*.o
*.so
*~
po/*.pot
po/*.mo

18
COPYING
View File

@@ -2,7 +2,7 @@
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
@@ -55,7 +55,7 @@ patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
@@ -225,7 +225,7 @@ impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
@@ -278,7 +278,7 @@ PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
@@ -305,7 +305,7 @@ the "copyright" line and a pointer to where the full notice is found.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
@@ -336,5 +336,5 @@ necessary. Here is a sample; alter the names:
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.

295
HISTORY
View File

@@ -1,3 +1,4 @@
===================================
VDR Plugin 'femon' Revision History
===================================
@@ -28,7 +29,8 @@ 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
@@ -40,12 +42,13 @@ 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
@@ -76,7 +79,7 @@ VDR Plugin 'femon' Revision History
- Added "Stream Information" display mode.
Toggle between different modes with 'OK' key:
.-> basic -> transponder -> stream -.
`-----------------------------------<EFBFBD>
`-----------------------------------'
- Added missing german translations (Thanks to Peter Marquardt).
2004-06-06: Version 0.1.2
@@ -87,7 +90,8 @@ 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
@@ -99,10 +103,289 @@ 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
- Yet Another Minor Release.
- Integrated the CA system names patch: "Setup / Show CA System".
2004-11-28: Version 0.1.7
- Updated for vdr-1.3.17.
- Fixed receiver related crash (Thanks to Marco Schluessler).
2005-01-15: Version 0.7.7
- Updated for vdr-1.3.18.
- Added DEBUG mode (make DEBUG=1 plugins).
- OSD height is now user configurable.
- Added audio channel selection into Yellow key.
2005-01-23: Version 0.7.9
- Some minor cosmetic fixes.
2005-01-23: Version 0.8.0
- Updated for vdr-1.3.19.
2005-01-24: Version 0.8.1
- Added Estonian translations (Thanks to Arthur Konovalov).
2005-02-24: Version 0.8.5
- Updated for vdr-1.3.21.
- Minor modification for DEBUG mode.
- Added preliminary support for themes and some GUI tweaks.
- Added horizontal offset setup option.
2005-02-26: Version 0.8.6
- Horizontal offset setup option should be functional now.
2005-04-01: Version 0.8.7
- Default make target is now all.
- 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ä).
2005-04-04: Version 0.8.9
- Updated Estonian translations (Thanks to Arthur Konovalov).
- Added the missing german translations (Thanks to #vdr-portal).
2005-05-20: Version 0.9.0
- 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
- Fixed AC3-info flickering (Thanks to Pasi Juppo for reporting this one).
- Added "Analog" type CA system.
- Plugin is now stripped by default.
2005-08-15: Version 0.9.2
- Threads updated for vdr-1.3.29.
2005-08-28: Version 0.9.3
- Updated for vdr-1.3.31.
- Added preliminary svdrp and service support.
2005-10-04: Version 0.9.4
- Updated for vdr-1.3.34.
- Added Enigma theme (Thanks to Rolf Hoverath).
- Added EgalsTry theme (Thanks to Uwe Hanke).
- Added option to disable rounded corners.
2005-11-13: Version 0.9.5
- Updated for vdr-1.3.36.
- 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).
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 EgalsTry theme (Thanks to Uwe Hanke).
2006-02-06: Version 0.9.7
- Updated for vdr-1.3.42.
- Added "SilverGreen" theme (Thanks to Rififi77 @ VDRPortal).
2006-03-08: Version 0.9.8
- Updated for vdr-1.3.44.
- Minor Makefile changes.
- Made all symbol data 'const'.
- Added spanish translation (Thanks to Luis Palacios).
2006-04-20: Version 0.9.9
- Updated for vdr-1.3.47.
2006-04-23: Version 0.9.10
- 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).
2006-06-06: Version 1.0.1
- Fixed device switching priority (Thanks to Andreas Brugger).
- Fixed device switching back to the primary device.
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).
- Removed system log option - use SVDRP instead.
- Added --remove-destination to the 'cp' command in Makefile.
2007-01-08: Version 1.1.1
- Updated for vdr-1.5.0.
2007-05-01: Version 1.1.2
- Fixed opening while replaying (Thanks to Antti Seppälä for reporting
this one).
2007-05-15: Version 1.1.3
- Fixed a race condition in cFemonReceiver (Thanks to Reinhard Nissl).
2007-10-14: Version 1.1.4
- 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.
2007-08-19: Version 1.2.1
- Updated for vdr-1.5.8.
2007-10-14: Version 1.2.2
- 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).

View File

@@ -1,26 +1,32 @@
#
# Makefile for a Video Disk Recorder plugin
# Makefile for Frontend Status Monitor plugin
#
# $Id$
# Debugging on/off
#FEMON_DEBUG = 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.
# IMPORTANT: the presence of this macro is important for the Make.config
# file. So it must be defined, even if it is not used here!
#
PLUGIN = femon
### The version number of this plugin (taken from the main source file):
VERSION = $(shell grep 'static const char \*VERSION *=' $(PLUGIN).h | awk '{ print $$6 }' | sed -e 's/[";]//g')
VERSION = $(shell grep 'static const char VERSION\[\] *=' $(PLUGIN).c | awk '{ print $$6 }' | sed -e 's/[";]//g')
### The C++ compiler and options:
CXX ?= g++
CXXFLAGS ?= -O2 -Wall -Woverloaded-virtual
CXXFLAGS ?= -fPIC -g -O2 -Wall -Wextra -Wswitch-default -Wfloat-equal -Wundef -Wpointer-arith -Wconversion -Wcast-align -Wredundant-decls -Wno-unused-parameter -Woverloaded-virtual -Wno-parentheses
### The directory environment:
DVBDIR = ../../../../DVB
VDRDIR = ../../..
LIBDIR = ../../lib
TMPDIR = /tmp
@@ -29,9 +35,9 @@ TMPDIR = /tmp
-include $(VDRDIR)/Make.config
### The version number of VDR (taken from VDR's "config.h"):
### The version number of VDR's plugin API (taken from VDR's "config.h"):
VDRVERSION = $(shell grep 'define VDRVERSION ' $(VDRDIR)/config.h | awk '{ print $$3 }' | sed -e 's/"//g')
APIVERSION = $(shell sed -ne '/define APIVERSION/s/^.*"\(.*\)".*$$/\1/p' $(VDRDIR)/config.h)
### The name of the distribution archive:
@@ -40,39 +46,72 @@ PACKAGE = vdr-$(ARCHIVE)
### Includes and Defines (add further entries here):
INCLUDES += -I$(VDRDIR)/include -I$(DVBDIR)/include
INCLUDES += -I$(VDRDIR)/include
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
ifdef NTSC_SYSTEM
DEFINES += -DNTSC_SYSTEM
ifdef FEMON_DEBUG
DEFINES += -DDEBUG
endif
.PHONY: all all-redirect
all-redirect: all
### The object files (add further files here):
OBJS = femon.o femonosd.o femonreceiver.o femoncfg.o femoni18n.o
OBJS = femon.o femonosd.o femonreceiver.o femoncfg.o femontools.o femonmpeg.o femonac3.o femonaac.o femonh264.o femonsymbol.o
### The main target:
all: libvdr-$(PLUGIN).so i18n
### Implicit rules:
%.o: %.c
$(CXX) $(CXXFLAGS) -c $(DEFINES) $(INCLUDES) $<
# Dependencies:
### Dependencies:
MAKEDEP = g++ -MM -MG
MAKEDEP = $(CXX) -MM -MG
DEPFILE = .dependencies
$(DEPFILE): Makefile
@$(MAKEDEP) $(DEFINES) $(INCLUDES) $(OBJS:%.o=%.c) > $@
-include $(DEPFILE)
### Targets:
### Internationalization (I18N):
all: libvdr-$(PLUGIN).so
PODIR = po
LOCALEDIR = $(VDRDIR)/locale
I18Npo = $(wildcard $(PODIR)/*.po)
I18Nmsgs = $(addprefix $(LOCALEDIR)/, $(addsuffix /LC_MESSAGES/vdr-$(PLUGIN).mo, $(notdir $(foreach file, $(I18Npo), $(basename $(file))))))
I18Npot = $(PODIR)/$(PLUGIN).pot
%.mo: %.po
msgfmt -c -o $@ $<
$(I18Npot): $(wildcard *.c)
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='Rolf Ahrenberg' -o $@ $^
%.po: $(I18Npot)
msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
@touch $@
$(I18Nmsgs): $(LOCALEDIR)/%/LC_MESSAGES/vdr-$(PLUGIN).mo: $(PODIR)/%.mo
@mkdir -p $(dir $@)
cp $< $@
.PHONY: i18n
i18n: $(I18Nmsgs) $(I18Npot)
### Targets:
libvdr-$(PLUGIN).so: $(OBJS)
$(CXX) $(CXXFLAGS) -shared $(OBJS) -o $@
@cp $@ $(LIBDIR)/$@.$(VDRVERSION)
ifndef FEMON_DEBUG
@$(STRIP) $@
endif
@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
dist: clean
@-rm -rf $(TMPDIR)/$(ARCHIVE)
@@ -83,4 +122,4 @@ dist: clean
@echo Distribution package created as $(PACKAGE).tgz
clean:
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~
@-rm -f $(OBJS) $(DEPFILE) *.so *.tgz core* *~ $(PODIR)/*.mo $(PODIR)/*.pot

66
README
View File

@@ -1,16 +1,21 @@
This is a DVB Frontend Status Monitor plugin for the Video Disk Recorder (VDR).
Written by: R o l f . A h r e n b e r g @ s c i . f i
Written by: Rolf Ahrenberg
< R o l f . A h r e n b e r g @ s c i . f i >
Project's homepage: http://www.saunalahti.fi/~rahrenbe/vdr/femon/
Latest version available at: http://www.saunalahti.fi/~rahrenbe/vdr/femon/
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
See the file COPYING for license information.
Requirements:
VDR & DVB. BMW & Ph.D.. BEER. YARRR!
VDR and a DVB card.
Description:
@@ -21,16 +26,12 @@ 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). The other parts of plugin code are borrowed from the excellent
'OSD Picture-In-Picture' plugin by Sascha Volkenandt and Andreas Regel. The
bitrate calculation algorithm originates from the 'dvbstream' application by
Dave Chapman and the stream information routines from the 'libdvb' library by
Metzler Brothers.
information).
Terminology:
--------------------------------------------------------------
|## Channel Name ######################### [DD][AR][VF][A][D]|
|## Channel Name ################### [SVDRP][AR][VF][A/DD][D]|
|[=====Signal Strength in % ==============|=================]|
|[=====Signal-to-Noise Ratio in % ========|=================]|
| STR: #0000 (0%) BER: #00000000 Video: 0 Mbit/s |
@@ -51,11 +52,11 @@ CARRIER - Found a DVB signal
VITERBI - FEC (forward error correction) is stable
SYNC - Found sync bytes
DD - AC-3 stream (optional)
SVDRP - SVDRP connection active (optional)
AR - Aspect Ratio: 1:1/4:3/16:9/2.21:1 (optional)
VF - Video format: PAL/NTSC (optional)
A - Audio track: 1..2 (optional)
D - Device number: 0..3 (optional)
A/DD - Audio (0..N) / AC-3 track (optional)
D - Device number: 0..N (optional)
Controls:
@@ -63,9 +64,10 @@ ChanUp/ChanDn - Switch channel up/down
Up/Down - Switch channel up/down
0-9 - Select channel
Ok - Switch between display modes: basic, transponder, stream, AC-3
Right/Left - Switch to next/previous device that provides the current channel
Green - Select language (APID)
Green - Select next audio track
Yellow - Select audio channel: stereo, mono left, mono right
Back - Exit plugin
Left/Right - Switch to next/previous device that provides the current channel
Installation:
@@ -77,19 +79,41 @@ make
make plugins
./vdr -P femon
Client-server architecture:
The SVDRP service extension can be used in client-server configurations.
A streamdev based VDR-to-VDR streaming client can retrieve frontend
information from a server, if the SVDRP service has been activated and
properly configured in femon. The svdrpservice plugin is required on the
VDR client.
If the client fails to open a DVB card frontend corresponding to the
current receiving device, it will connect to the SVDRP server, look for
the femon plugin and tune the channel on the server to the one currently
viewed on the client. If one of these steps fails, the femon OSD won't
open on the client. An SVDRP icon in the femon title bar indicates that
the data source is SVDRP. The device number in the title bar is always
the local device number.
Notes:
- The plugin supports only those DVB cards with _one_ frontend (do any cards
with multiple frontends even exist?), because I haven't yet figured howto do
it without patching the VDR core.
- Sometimes (read always) ttxtsubs plugin messes up the OSD - user should disable
ttxtsubs, but closing and reopening the femon plugin might help temporarily as
well. Btw., this same thing happens with OSDTeletext plugin too :)
- 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
between the same brand/model frontends. Due to the lack of proper frontend
specifications those values cannot be calculated into any real units.
- Shrinked OSD is available for NTSC users: make NTSC_SYSTEM=1
- The device switching feature is still non-functional.
- 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.
- 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
people watching live TV. In some situations the server will refuse
switching to the requested channel. On a headless server you can avoid
this by installing the dummydevice plugin.
"Femon - A real womon who lives according to her natural feminine inclinations."

307
femon.c
View File

@@ -3,29 +3,60 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id$
*/
#include <vdr/menu.h>
#include <vdr/remote.h>
#include <vdr/menu.h>
#include "femoncfg.h"
#include "femoni18n.h"
#include "femonreceiver.h"
#include "femonosd.h"
#include "femon.h"
#include "femonservice.h"
#include "femontools.h"
#if VDRVERSNUM && VDRVERSNUM >= 10307
#error "You don't exist! Go away!"
#if defined(APIVERSNUM) && APIVERSNUM < 10712
#error "VDR-1.7.12 API version or greater is required!"
#endif
cPluginFemon::cPluginFemon(void)
static const char VERSION[] = "1.7.6";
static const char DESCRIPTION[] = trNOOP("DVB Signal Information Monitor (OSD)");
static const char MAINMENUENTRY[] = trNOOP("Signal Information");
class cPluginFemon : public cPlugin {
public:
cPluginFemon(void);
virtual ~cPluginFemon();
virtual const char *Version(void) { return VERSION; }
virtual const char *Description(void) { return tr(DESCRIPTION); }
virtual const char *CommandLineHelp(void);
virtual bool ProcessArgs(int argc, char *argv[]);
virtual bool Initialize(void);
virtual bool Start(void);
virtual void Stop(void);
virtual void Housekeeping(void);
virtual void MainThreadHook(void) {}
virtual cString Active(void) { return NULL; }
virtual const char *MainMenuEntry(void) { return (femonConfig.hidemenu ? NULL : tr(MAINMENUENTRY)); }
virtual cOsdObject *MainMenuAction(void);
virtual cMenuSetupPage *SetupMenu(void);
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 *Command, const char *Option, int &ReplyCode);
};
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!
debug("%s()\n", __PRETTY_FUNCTION__);
}
cPluginFemon::~cPluginFemon()
{
// Clean up after yourself!
debug("%s()\n", __PRETTY_FUNCTION__);
}
const char *cPluginFemon::CommandLineHelp(void)
@@ -49,10 +80,14 @@ bool cPluginFemon::Initialize(void)
bool cPluginFemon::Start(void)
{
// Start any background activities the plugin shall perform.
RegisterI18n(Phrases);
return true;
}
void cPluginFemon::Stop(void)
{
// Stop the background activities.
}
void cPluginFemon::Housekeeping(void)
{
// Perform any cleanup or other regular tasks.
@@ -61,35 +96,204 @@ void cPluginFemon::Housekeeping(void)
cOsdObject *cPluginFemon::MainMenuAction(void)
{
// Perform the action when selected from the main VDR menu.
return new cFemonOsd();
debug("%s()\n", __PRETTY_FUNCTION__);
if (cReplayControl::NowReplaying() || (Channels.Count() <= 0))
Skins.Message(mtInfo, tr("Femon not available"));
else
return cFemonOsd::Instance(true);
return NULL;
}
bool cPluginFemon::SetupParse(const char *Name, const char *Value)
{
// Parse your own setup parameters and store their values.
if (!strcasecmp(Name, "HideMenu")) femonConfig.hidemenu = atoi(Value);
else if (!strcasecmp(Name, "SyslogOutput")) femonConfig.syslogoutput = atoi(Value);
else if (!strcasecmp(Name, "DisplayMode")) femonConfig.displaymode = atoi(Value);
else if (!strcasecmp(Name, "Position")) femonConfig.position = atoi(Value);
else if (!strcasecmp(Name, "ShowCASystem")) femonConfig.showcasystem = atoi(Value);
else if (!strcasecmp(Name, "Skin")) femonConfig.skin = atoi(Value);
else if (!strcasecmp(Name, "Theme")) femonConfig.theme = 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 >= modeMaxNumber) femonConfig.displaymode = 0;
if (femonConfig.displaymode < 0 || femonConfig.displaymode >= eFemonModeMaxNumber) femonConfig.displaymode = 0;
return true;
}
bool cPluginFemon::Service(const char *Id, void *Data)
{
if (strcmp(Id,"FemonService-v1.0") == 0) {
if (Data) {
FemonService_v1_0 *data = (FemonService_v1_0*)Data;
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;
}
return false;
}
const char **cPluginFemon::SVDRPHelpPages(void)
{
static const char *HelpPages[] = {
"OPEN\n"
" Open femon plugin.",
"QUIT\n"
" Close femon plugin.",
"NEXT\n"
" Switch to next possible device.",
"PREV\n"
" Switch to previous possible device.",
"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 actual device and current video bitrate [Mbit/s].",
"AUBR\n"
" Print the actual device and current audio bitrate [kbit/s].",
"DDBR\n"
" Print the actual device and current dolby bitrate [kbit/s].",
NULL
};
return HelpPages;
}
cString cPluginFemon::SVDRPCommand(const char *Command, const char *Option, int &ReplyCode)
{
if (strcasecmp(Command, "OPEN") == 0) {
if (cReplayControl::NowReplaying()) {
ReplyCode = 550; // Requested action not taken
return cString("Cannot open femon plugin while replaying");
}
if (!cFemonOsd::Instance())
cRemote::CallPlugin("femon");
return cString("Opening femon plugin");
}
else if (strcasecmp(Command, "QUIT") == 0) {
if (cFemonOsd::Instance())
cRemote::Put(kBack);
return cString("Closing femon plugin");
}
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(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(Command, "INFO") == 0) {
return getFrontendInfo(cDevice::ActualDevice()->CardIndex());
}
else if (strcasecmp(Command, "NAME") == 0) {
return getFrontendName(cDevice::ActualDevice()->CardIndex());
}
else if (strcasecmp(Command, "STAT") == 0) {
return getFrontendStatus(cDevice::ActualDevice()->CardIndex());
}
else if (strcasecmp(Command, "SGNL") == 0) {
int value = getSignal(cDevice::ActualDevice()->CardIndex());
return cString::sprintf("%04X (%02d%%) on device #%d", value, value / 655, cDevice::ActualDevice()->CardIndex());
}
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(Command, "BERA") == 0) {
return cString::sprintf("%08X on device #%d", getBER(cDevice::ActualDevice()->CardIndex()), cDevice::ActualDevice()->CardIndex());
}
else if (strcasecmp(Command, "UNCB") == 0) {
return cString::sprintf("%08X on device #%d", getUNC(cDevice::ActualDevice()->CardIndex()), cDevice::ActualDevice()->CardIndex());
}
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(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(Command, "DDBR") == 0) {
if (cFemonOsd::Instance())
return cString::sprintf("%s on device #%d", *getBitrateKbits(cFemonOsd::Instance()->GetDolbyBitrate()), cDevice::ActualDevice()->CardIndex());
else
return cString::sprintf("--- kbit/s on device #%d", cDevice::ActualDevice()->CardIndex());
}
return NULL;
}
class cMenuFemonSetup : public cMenuSetupPage {
private:
const char *dispmodes[eFemonModeMaxNumber];
const char *skins[eFemonSkinMaxNumber];
const char *themes[eFemonThemeMaxNumber];
cFemonConfig data;
cVector<const char*> help;
void Setup(void);
protected:
virtual eOSState ProcessKey(eKeys Key);
virtual void Store(void);
public:
cMenuFemonSetup(void);
};
cMenuFemonSetup::cMenuFemonSetup(void)
{
dispmodes[modeBasic] = tr("basic");
dispmodes[modeTransponder] = tr("transponder");
dispmodes[modeStream] = tr("stream");
dispmodes[modeAC3] = tr("AC-3");
debug("%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[eFemonThemeSTTNG] = tr("ST:TNG");
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();
}
@@ -98,17 +302,50 @@ void cMenuFemonSetup::Setup(void)
int current = Current();
Clear();
Add(new cMenuEditBoolItem( tr("Hide Mainmenu Entry"), &femonConfig.hidemenu, tr("no"), tr("yes")));
Add(new cMenuEditBoolItem( tr("Use Syslog Output"), &femonConfig.syslogoutput, tr("no"), tr("yes")));
Add(new cMenuEditStraItem( tr("Default Display Mode"), &femonConfig.displaymode, modeMaxNumber, dispmodes));
Add(new cMenuEditBoolItem( tr("Position"), &femonConfig.position, tr("bottom"), tr("top")));
Add(new cMenuEditBoolItem( tr("Show CA System"), &femonConfig.showcasystem, tr("no"), tr("yes")));
Add(new cMenuEditIntItem( tr("Red Limit [%]"), &femonConfig.redlimit, 1, 50));
Add(new cMenuEditIntItem( tr("Green Limit [%]"), &femonConfig.greenlimit, 51, 100));
Add(new cMenuEditIntItem( tr("OSD Update Interval [0.1s]"), &femonConfig.updateinterval, 1, 100));
Add(new cMenuEditBoolItem( tr("Analyze Stream"), &femonConfig.analyzestream, tr("no"), tr("yes")));
if (femonConfig.analyzestream)
Add(new cMenuEditIntItem(tr("Calculation Interval [0.1s]"), &femonConfig.calcinterval, 1, 100));
help.Clear();
Add(new cMenuEditBoolItem(tr("Hide main menu entry"), &data.hidemenu));
help.Append(tr("Define whether the main menu entry is hidden."));
Add(new cMenuEditStraItem(tr("Default display mode"), &data.displaymode, eFemonModeMaxNumber, dispmodes));
help.Append(tr("Define the default display mode at startup."));
Add(new cMenuEditStraItem(trVDR("Setup.OSD$Skin"), &data.skin, eFemonSkinMaxNumber, skins));
help.Append(tr("Define the used OSD skin."));
Add(new cMenuEditStraItem(trVDR("Setup.OSD$Theme"), &data.theme, eFemonThemeMaxNumber,themes));
help.Append(tr("Define the used OSD theme."));
Add(new cMenuEditBoolItem(tr("Position"), &data.position, trVDR("bottom"), trVDR("top")));
help.Append(tr("Define the position of OSD."));
Add(new cMenuEditIntItem(tr("Red limit [%]"), &data.redlimit, 1, 50));
help.Append(tr("Define a limit for red bar, which is used to indicate a bad signal."));
Add(new cMenuEditIntItem(tr("Green limit [%]"), &data.greenlimit, 51, 100));
help.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]"), &data.updateinterval, 1, 100));
help.Append(tr("Define an interval for OSD updates. The smaller interval generates higher CPU load."));
Add(new cMenuEditBoolItem(tr("Analyze stream"), &data.analyzestream));
help.Append(tr("Define whether the DVB stream is analyzed and bitrates calculated."));
if (femonConfig.analyzestream) {
Add(new cMenuEditIntItem(tr("Calculation interval [0.1s]"), &data.calcinterval, 1, 100));
help.Append(tr("Define an interval for calculation. The bigger interval generates more stable values."));
}
Add(new cMenuEditBoolItem(tr("Use SVDRP service"), &data.usesvdrp));
help.Append(tr("Define whether the SVDRP service is used in client/server setups."));
if (data.usesvdrp) {
Add(new cMenuEditIntItem(tr("SVDRP service port"), &data.svdrpport, 1, 65535));
help.Append(tr("Define the port number of SVDRP service."));
Add(new cMenuEditStrItem(tr("SVDRP service IP"), data.svdrpip, MaxSvdrpIp, ".1234567890"));
help.Append(tr("Define the IP address of SVDRP service."));
}
SetCurrent(Get(current));
Display();
@@ -116,27 +353,35 @@ void cMenuFemonSetup::Setup(void)
void cMenuFemonSetup::Store(void)
{
debug("%s()\n", __PRETTY_FUNCTION__);
femonConfig = data;
SetupStore("HideMenu", femonConfig.hidemenu);
SetupStore("SyslogOutput", femonConfig.syslogoutput);
SetupStore("DisplayMode", femonConfig.displaymode);
SetupStore("Skin", femonConfig.skin);
SetupStore("Theme", femonConfig.theme);
SetupStore("Position", femonConfig.position);
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 oldAnalyzestream = femonConfig.analyzestream;
int oldUsesvdrp = data.usesvdrp;
int oldAnalyzestream = data.analyzestream;
eOSState state = cMenuSetupPage::ProcessKey(Key);
if (Key != kNone && (femonConfig.analyzestream != oldAnalyzestream)) {
if (Key != kNone && (data.analyzestream != oldAnalyzestream || data.usesvdrp != oldUsesvdrp))
Setup();
}
if ((Key == kInfo) && (state == osUnknown) && (Current() < help.Size()))
return AddSubMenu(new cMenuText(cString::sprintf("%s - %s '%s'", tr("Help"), trVDR("Plugin"), PLUGIN_NAME_I18N), help[Current()]));
return state;
}

49
femon.h
View File

@@ -1,49 +0,0 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
* $Id$
*/
#ifndef __FEMON_H
#define __FEMON_H
#include <vdr/plugin.h>
static const char *VERSION = "0.0.7";
static const char *DESCRIPTION = "DVB Signal Information Monitor (OSD)";
static const char *MAINMENUENTRY = "Signal Information";
class cPluginFemon : public cPlugin {
private:
// Add any member variables or functions you may need here.
public:
cPluginFemon(void);
virtual ~cPluginFemon();
virtual const char *Version(void) { return VERSION; }
virtual const char *Description(void) { return tr(DESCRIPTION); }
virtual const char *CommandLineHelp(void);
virtual bool ProcessArgs(int argc, char *argv[]);
virtual bool Initialize(void);
virtual bool Start(void);
virtual void Housekeeping(void);
virtual const char *MainMenuEntry(void) { return (femonConfig.hidemenu ? NULL : tr(MAINMENUENTRY)); }
virtual cOsdObject *MainMenuAction(void);
virtual cMenuSetupPage *SetupMenu(void);
virtual bool SetupParse(const char *Name, const char *Value);
};
class cMenuFemonSetup : public cMenuSetupPage {
private:
const char *dispmodes[modeMaxNumber];
virtual void Setup(void);
protected:
virtual eOSState ProcessKey(eKeys Key);
virtual void Store(void);
public:
cMenuFemonSetup(void);
};
#endif //__FEMON_H

105
femonaac.c Normal file
View File

@@ -0,0 +1,105 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#include "femontools.h"
#include "femonaac.h"
#define IS_HEAAC_AUDIO(buf) (((buf)[0] == 0xFF) && (((buf)[1] & 0xF6) == 0xF0))
unsigned int cFemonAAC::s_Samplerates[16] =
{
96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, -1, -1, -1, -1
};
cFemonAAC::cFemonAAC(cFemonAudioIf *audiohandler)
: m_AudioHandler(audiohandler)
{
}
cFemonAAC::~cFemonAAC()
{
}
bool cFemonAAC::processAudio(const uint8_t *buf, int len)
{
cBitStream bs(buf, len * 8);
if (!m_AudioHandler)
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(len))
return false;
bs.skipBits(8 * PesPayloadOffset(buf));
// 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
m_AudioHandler->SetAudioCodec(AUDIO_CODEC_HEAAC);
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_RESERVED);
switch (channel_configuration) {
case 0:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_STEREO);
break;
case 1:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_JOINT_STEREO);
break;
case 2:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_DUAL);
break;
case 3:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_SINGLE);
break;
default:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_INVALID);
break;
}
switch (sampling_frequency_index) {
case 0xC ... 0xF:
m_AudioHandler->SetAudioSamplingFrequency(AUDIO_SAMPLING_FREQUENCY_RESERVED);
break;
default:
m_AudioHandler->SetAudioSamplingFrequency(s_Samplerates[sampling_frequency_index]);
break;
}
return true;
}

26
femonaac.h Normal file
View File

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

93
femonac3.c Normal file
View File

@@ -0,0 +1,93 @@
/*
* 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 "femontools.h"
#include "femonac3.h"
unsigned int cFemonAC3::s_Bitrates[32] =
{
32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 576, 640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
unsigned int cFemonAC3::s_Frequencies[4] =
{
480, 441, 320, 0
};
unsigned int cFemonAC3::s_Frames[3][32] =
{
{64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 448, 512, 640, 768, 896, 1024, 1152, 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{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 *audiohandler)
: m_AudioHandler(audiohandler)
{
}
cFemonAC3::~cFemonAC3()
{
}
bool cFemonAC3::processAudio(const uint8_t *buf, int len)
{
int fscod, frmsizcod, bsmod, acmod;
int centermixlevel = AUDIO_CENTER_MIX_LEVEL_INVALID;
int surroundmixlevel = AUDIO_SURROUND_MIX_LEVEL_INVALID;
int dolbysurroundmode = AUDIO_DOLBY_SURROUND_MODE_INVALID;
cBitStream bs(buf, len * 8);
if (!m_AudioHandler)
return false;
// skip PES header
if (!PesLongEnough(len))
return false;
bs.skipBits(8 * PesPayloadOffset(buf));
// http://rmworkshop.com/dvd_info/related_info/ac3hdr.htm
// AC3 audio detection
if (bs.getU16() != 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);
m_AudioHandler->SetAC3Bitrate(1000 * s_Bitrates[frmsizcod >> 1]);
m_AudioHandler->SetAC3SamplingFrequency(100 * s_Frequencies[fscod]);
m_AudioHandler->SetAC3Bitstream(bsmod);
m_AudioHandler->SetAC3AudioCoding(acmod);
m_AudioHandler->SetAC3CenterMix(centermixlevel);
m_AudioHandler->SetAC3SurroundMix(surroundmixlevel);
m_AudioHandler->SetAC3DolbySurround(dolbysurroundmode);
m_AudioHandler->SetAC3LFE(bs.getBit()); // low frequency effects on
m_AudioHandler->SetAC3Dialog(bs.getBits(5)); // dialog normalization
return true;
}

28
femonac3.h Normal file
View File

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

149
femonaudio.h Normal file
View File

@@ -0,0 +1,149 @@
/*
* Frontend Status Monitor plugin for the AUDIO Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONAUDIO_H
#define __FEMONAUDIO_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
};
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 codec) = 0;
// kbit/s or eAudioBitrate
virtual void SetAudioBitrate(double bitrate) = 0;
// Hz or eAudioSamplingFrequency
virtual void SetAudioSamplingFrequency(int sampling) = 0;
// eAudioChannelMode
virtual void SetAudioChannel(eAudioChannelMode mode) = 0;
};
class cFemonAC3If {
public:
cFemonAC3If() {}
virtual ~cFemonAC3If() {}
// bit/s or eAudioBitrate
virtual void SetAC3Bitrate(int bitrate) = 0;
// Hz or eAudioSamplingFrequency
virtual void SetAC3SamplingFrequency(int sampling) = 0;
// 0..7 or eAudioBitstreamMode
virtual void SetAC3Bitstream(int mode) = 0;
// 0..7 or eAudioCodingMode
virtual void SetAC3AudioCoding(int mode) = 0;
// eAudioDolbySurroundMode
virtual void SetAC3DolbySurround(int mode) = 0;
// eAudioCenterMixLevel
virtual void SetAC3CenterMix(int level) = 0;
// eAudioSurroundMixLevel
virtual void SetAC3SurroundMix(int level) = 0;
// -dB
virtual void SetAC3Dialog(int level) = 0;
// boolean
virtual void SetAC3LFE(bool onoff) = 0;
};
#endif //__FEMONAUDIO_H

View File

@@ -3,9 +3,9 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id$
*/
#include <string.h>
#include "femoncfg.h"
cFemonConfig femonConfig;
@@ -14,12 +14,127 @@ cFemonConfig::cFemonConfig(void)
{
hidemenu = 0;
displaymode = 0;
skin = 0;
theme = 0;
position = 1;
redlimit = 33;
greenlimit = 66;
updateinterval = 5;
analyzestream = 1;
calcinterval = 20;
syslogoutput = 0;
showcasystem = 0;
usesvdrp = 0;
svdrpport = 2001;
strncpy(svdrpip, "0.0.0.0", sizeof(svdrpip));
}
const cFemonTheme femonTheme[eFemonThemeMaxNumber] =
{
{
// eFemonThemeClassic
4, // bpp
0x7F000000, // clrBackground
0xFFFCFCFC, // clrTitleBackground
0xFF000000, // clrTitleText
0xFFFCC024, // clrActiveText
0xFFFCFCFC, // clrInactiveText
0xFFFC1414, // clrRed
0xFFFCC024, // clrYellow
0xFF24FC24, // clrGreen
},
{
// eFemonThemeElchi
4, // bpp
0xC8000066, // clrBackground
0xC833AAEE, // clrTitleBackground
0xFF000000, // clrTitleText
0xFFCCBB22, // clrActiveText
0xFFFFFFFF, // clrInactiveText
0xFFFF0000, // clrRed
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
0xC80C0C0C, // clrBackground
0xC832557A, // clrTitleBackground
0xFF000000, // clrTitleText
0xFFCE7B00, // clrActiveText
0xFF9A9A9A, // clrInactiveText
0xFF992900, // clrRed
0xFFCE7B00, // clrYellow
0xFF336600, // clrGreen
},
{
// eFemonThemeMoronimo
4, // bpp
0xDF294A6B, // clrBackground
0xDF3E5578, // clrTitleBackground
0xFF9BBAD7, // clrTitleText
0xFFCE7B00, // clrActiveText
0xFF9A9A9A, // clrInactiveText
0xFF992900, // clrRed
0xFFCE7B00, // clrYellow
0xFF336600, // clrGreen
},
{
// eFemonThemeEnigma
4, // bpp
0xB8DEE5FA, // clrBackground
0xB84158BC, // clrTitleBackground
0xFFFFFFFF, // clrTitleText
0xFF000000, // clrActiveText
0xFF000000, // clrInactiveText
0xB8C40000, // clrRed
0xB8C4C400, // clrYellow
0xB800C400, // clrGreen
},
{
// eFemonThemeEgalsTry
4, // bpp
0xCA2B1B9E, // clrBackground
0xDFBEBAC3, // clrTitleBackground
0xFF280249, // clrTitleText
0xFFD4D7DB, // clrActiveText
0xDFCFCFCF, // clrInactiveText
0xFFFF0000, // clrRed
0xFFFCC024, // clrYellow
0xFF20980B, // clrGreen
},
{
// eFemonThemeDuotone
2, // bpp
0x7F000000, // clrBackground
0xFFFCFCFC, // clrTitleBackground
0x7F000000, // clrTitleText
0xFFFCFCFC, // clrActiveText
0xFFFCFCFC, // clrInactiveText
0xFFFC1414, // clrRed
0xFFFCFCFC, // clrYellow
0xFFFCFCFC, // clrGreen
},
{
// eFemonThemeSilverGreen
4, // bpp
0xD9526470, // clrBackground
0xD9293841, // clrTitleBackground
0xFFB3BDCA, // clrTitleText
0xFFCE7B00, // clrActiveText
0xFFB3BDCA, // clrInactiveText
0xFF992900, // clrRed
0xFFCE7B00, // clrYellow
0xFF336600, // clrGreen
},
};

View File

@@ -3,19 +3,21 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id$
*/
#ifndef __FEMONCFG_H
#define __FEMONCFG_H
enum dispModes {
modeBasic,
modeTransponder,
modeStream,
modeAC3,
modeMaxNumber
};
#define MaxSvdrpIp 15 // xxx.xxx.xxx.xxx
enum eFemonModes
{
eFemonModeBasic,
eFemonModeTransponder,
eFemonModeStream,
eFemonModeAC3,
eFemonModeMaxNumber
};
struct cFemonConfig
{
@@ -23,16 +25,55 @@ public:
cFemonConfig(void);
int hidemenu;
int displaymode;
int skin;
int theme;
int position;
int redlimit;
int greenlimit;
int updateinterval;
int analyzestream;
int calcinterval;
int syslogoutput;
int showcasystem;
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,
eFemonThemeSTTNG,
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

Binary file not shown.

769
femonh264.c Normal file
View File

@@ -0,0 +1,769 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#include "femontools.h"
#include "femonh264.h"
const cFemonH264::t_DAR cFemonH264::s_DAR[] =
{
{ 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::s_SAR[] =
{
{ 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::s_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::s_SeiNumClockTsTable[9] =
{
1, 1, 1, 2, 2, 3, 3, 2, 3
};
cFemonH264::cFemonH264(cFemonVideoIf *videohandler)
: m_VideoHandler(videohandler),
m_Width(0),
m_Height(0),
m_AspectRatio(VIDEO_ASPECT_RATIO_INVALID),
m_Format(VIDEO_FORMAT_INVALID),
m_FrameRate(0),
m_BitRate(0),
m_Scan(VIDEO_SCAN_INVALID),
m_CpbDpbDelaysPresentFlag(false),
m_PicStructPresentFlag(false),
m_FrameMbsOnlyFlag(false),
m_MbAdaptiveFrameFieldFlag(false),
m_TimeOffsetLength(0)
{
reset();
}
cFemonH264::~cFemonH264()
{
}
bool cFemonH264::processVideo(const uint8_t *buf, int len)
{
uint8_t nal_data[len];
bool aud_found = false, sps_found = false, sei_found = true; // SEI temporarily disabled!
const uint8_t *start = buf;
const uint8_t *end = start + len;
if (!m_VideoHandler)
return false;
// skip PES header
if (!PesLongEnough(len))
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
//debug("H.264: Found NAL AUD at offset %d/%d\n", int(buf - start), len);
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) {
//debug("H.264: Found NAL SPS at offset %d/%d\n", int(buf - start), len);
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) {
//debug("H.264: Found NAL SEI at offset %d/%d\n", iny(buf - start), len);
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) {
m_VideoHandler->SetVideoCodec(VIDEO_CODEC_H264);
if (sps_found) {
//debug("H.264 SPS: size %dx%d, aspect %d format %d framerate %.2f bitrate %.0f\n", m_Width, m_Height, m_AspectRatio, m_Format, m_FrameRate, m_BitRate);
m_VideoHandler->SetVideoFormat(m_Format);
m_VideoHandler->SetVideoSize(m_Width, m_Height);
m_VideoHandler->SetVideoAspectRatio(m_AspectRatio);
m_VideoHandler->SetVideoFramerate(m_FrameRate);
m_VideoHandler->SetVideoBitrate(m_BitRate);
}
if (sei_found) {
//debug("H.264 SEI: scan %d\n", m_Scan);
m_VideoHandler->SetVideoScan(m_Scan);
}
}
return aud_found;
}
void cFemonH264::reset()
{
m_CpbDpbDelaysPresentFlag = false;
m_PicStructPresentFlag = false;
m_FrameMbsOnlyFlag = false;
m_MbAdaptiveFrameFieldFlag = false;
m_TimeOffsetLength = 0;
}
const uint8_t *cFemonH264::nextStartCode(const uint8_t *start, const uint8_t *end)
{
for (end -= 3; start < end; ++start) {
if ((start[0] == 0x00) && (start[1] == 0x00) && (start[2] == 0x01))
return start;
}
return (end + 3);
}
int cFemonH264::nalUnescape(uint8_t *dst, const uint8_t *src, int len)
{
int s = 0, d = 0;
while (s < len) {
if (!src[s] && !src[s + 1]) {
// hit 00 00 xx
dst[d] = dst[d + 1] = 0;
s += 2;
d += 2;
if (src[s] == 3) {
s++; // 00 00 03 xx --> 00 00 xx
if (s >= len)
return d;
}
}
dst[d++] = src[s++];
}
return d;
}
int cFemonH264::parseSPS(const uint8_t *buf, int len)
{
int profile_idc, level_idc, constraint_set3_flag, pic_order_cnt_type, i, j;
cBitStream bs(buf, len);
uint32_t width = m_Width;
uint32_t height = m_Height;
eVideoAspectRatio aspect_ratio = m_AspectRatio;
eVideoFormat format = m_Format;
double frame_rate = m_FrameRate;
double bit_rate = m_BitRate;
bool cpb_dpb_delays_present_flag = m_CpbDpbDelaysPresentFlag;
bool pic_struct_present_flag = m_PicStructPresentFlag;
bool frame_mbs_only_flag = m_FrameMbsOnlyFlag;
bool mb_adaptive_frame_field_flag = m_MbAdaptiveFrameFieldFlag;
uint32_t time_offset_length = m_TimeOffsetLength;
profile_idc = bs.getU8(); // profile_idc
bs.skipBit(); // constraint_set0_flag
bs.skipBit(); // constraint_set1_flag
bs.skipBit(); // constraint_set2_flag
constraint_set3_flag = bs.getBit(); // constraint_set3_flag
bs.skipBits(4); // reserved_zero_4bits
level_idc = bs.getU8(); // level_idc
bs.skipUeGolomb(); // seq_parameter_set_id
//debug("H.264 SPS: profile_idc %d level_idc %d\n", 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
//debug("H.264 SPS: pic_width: %u mbs\n", width);
//debug("H.264 SPS: pic_height: %u mbs\n", height);
//debug("H.264 SPS: frame only flag: %d\n", frame_mbs_only_flag);
width *= 16;
height *= 16 * (frame_mbs_only_flag ? 1 : 2);
if (!frame_mbs_only_flag)
mb_adaptive_frame_field_flag = bs.getBit(); // mb_adaptive_frame_field_flag
bs.skipBit(); // direct_8x8_inference_flag
if (bs.getBit()) { // frame_cropping_flag
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
//debug("H.264 SPS: cropping %d %d %d %d\n", crop_left, crop_top, crop_right, crop_bottom);
width -= 2 * (crop_left + crop_right);
if (frame_mbs_only_flag)
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.getU8(); // aspect_ratio_idc
//debug("H.264 SPS: aspect_ratio_idc %d\n", aspect_ratio_idc);
if (aspect_ratio_idc == 255) { // extended sar
sar_width = bs.getU16(); // sar_width
sar_height = bs.getU16(); // sar_height
}
else if (aspect_ratio_idc < ELEMENTS(s_SAR)) {
sar_width = s_SAR[aspect_ratio_idc].w;
sar_height = s_SAR[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(s_DAR); ++i) {
if (s_DAR[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 = s_DAR[index].dar;
//debug("H.264 SPS: DAR %dx%d (%d)\n", sar_width, sar_height, aspect_ratio);
}
}
if (bs.getBit()) // overscan_info_present_flag
bs.skipBit(); // overscan_approriate_flag
if (bs.getBit()) { // video_signal_type_present_flag
uint32_t video_format;
video_format = bs.getBits(3); // video_format
if (video_format < sizeof(s_VideoFormats) / sizeof(s_VideoFormats[0])) {
format = s_VideoFormats[video_format];
//debug("H.264 SPS: video format %d\n", format);
}
bs.skipBit(); // video_full_range_flag
if (bs.getBit()) { // colour_description_present_flag
bs.skipBits(8); // colour_primaries
bs.skipBits(8); // transfer_characteristics
bs.skipBits(8); // matrix_coefficients
}
}
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.getU32(); // num_units_in_tick
time_scale = bs.getU32(); // 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
}
}
m_Width = width;
m_Height = height;
m_AspectRatio = aspect_ratio;
m_Format = format;
m_FrameRate = frame_rate;
m_BitRate = bit_rate;
m_CpbDpbDelaysPresentFlag = cpb_dpb_delays_present_flag;
m_PicStructPresentFlag = pic_struct_present_flag;
m_FrameMbsOnlyFlag = frame_mbs_only_flag;
m_MbAdaptiveFrameFieldFlag = mb_adaptive_frame_field_flag;
m_TimeOffsetLength = time_offset_length;
return (bs.getIndex() / 8);
}
int cFemonH264::parseSEI(const uint8_t *buf, int len)
{
int num_referenced_subseqs, i;
cBitStream bs(buf, len);
eVideoScan scan = m_Scan;
while ((bs.getIndex() * 8 + 16) < len) { // sei_message
int lastByte, payloadSize = 0, payloadType = 0;
do {
lastByte = bs.getU8() & 0xFF;
payloadType += lastByte;
} while (lastByte == 0xFF); // last_payload_type_byte
do {
lastByte = bs.getU8() & 0xFF;
payloadSize += lastByte;
} while (lastByte == 0xFF); // last_payload_size_byte
switch (payloadType) { // sei_payload
case 1: // pic_timing
if (m_CpbDpbDelaysPresentFlag) { // cpb_dpb_delays_present_flag
bs.skipUeGolomb(); // cpb_removal_delay
bs.skipUeGolomb(); // dpb_output_delay
}
if (m_PicStructPresentFlag) { // pic_struct_present_flag
uint32_t pic_struct;
pic_struct = bs.getBits(4); // pic_struct
if (pic_struct >= (sizeof(s_SeiNumClockTsTable)) / sizeof(s_SeiNumClockTsTable[0]))
return 0;
if (m_FrameMbsOnlyFlag && !m_MbAdaptiveFrameFieldFlag)
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;
}
}
//debug("H.264 SEI: pic struct %d scan type %d\n", pic_struct, scan);
for (int i = 0; i < s_SeiNumClockTsTable[pic_struct]; ++i) {
if (bs.getBit()) { // clock_timestamp_flag[i]
int full_timestamp_flag;
switch (bs.getBits(2)) { // ct_type
case 0:
scan = VIDEO_SCAN_PROGRESSIVE;
break;
case 1:
scan = VIDEO_SCAN_INTERLACED;
break;
case 2:
scan = VIDEO_SCAN_UNKNOWN;
break;
default:
scan = VIDEO_SCAN_RESERVED;
break;
}
//debug("H.264 SEI: scan type %d\n", scan);
bs.skipBit(); // nuit_field_based_flag
bs.skipBits(5); // counting_type
full_timestamp_flag = bs.getBit(); // full_timestamp_flag
bs.skipBit(); // discontinuity_flag
bs.skipBit(); // cnt_dropped_flag
bs.skipBits(8); // n_frames
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 (m_TimeOffsetLength > 0)
bs.skipBits(m_TimeOffsetLength); // time_offset
}
}
}
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();
}
m_Scan = scan;
return (bs.getIndex() / 8);
}

64
femonh264.h Normal file
View File

@@ -0,0 +1,64 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONH264_H
#define __FEMONH264_H
#include "femonvideo.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 *m_VideoHandler;
uint32_t m_Width;
uint32_t m_Height;
eVideoAspectRatio m_AspectRatio;
eVideoFormat m_Format;
double m_FrameRate;
double m_BitRate;
eVideoScan m_Scan;
bool m_CpbDpbDelaysPresentFlag;
bool m_PicStructPresentFlag;
bool m_FrameMbsOnlyFlag;
bool m_MbAdaptiveFrameFieldFlag;
uint32_t m_TimeOffsetLength;
void reset();
const uint8_t *nextStartCode(const uint8_t *start, const uint8_t *end);
int nalUnescape(uint8_t *dst, const uint8_t *src, int len);
int parseSPS(const uint8_t *buf, int len);
int parseSEI(const uint8_t *buf, int len);
static const t_SAR s_SAR[];
static const t_DAR s_DAR[];
static const eVideoFormat s_VideoFormats[];
static const uint8_t s_SeiNumClockTsTable[9];
public:
cFemonH264(cFemonVideoIf *videohandler);
virtual ~cFemonH264();
bool processVideo(const uint8_t *buf, int len);
};
#endif //__FEMONH264_H

File diff suppressed because it is too large Load Diff

View File

@@ -1,17 +0,0 @@
/*
* 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/config.h> // for VDRVERSNUM
#include <vdr/i18n.h>
extern const tI18nPhrase Phrases[];
#endif // __FEMONI18N_H

286
femonmpeg.c Normal file
View File

@@ -0,0 +1,286 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#include "femontools.h"
#include "femonmpeg.h"
#define IS_EXTENSION_START(buf) (((buf)[0] == 0x00) && ((buf)[1] == 0x00) && ((buf)[2] == 0x01) && ((buf)[3] == 0xB5))
unsigned int cFemonMPEG::s_Bitrates[2][3][16] =
{
{
{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
}
};
unsigned int cFemonMPEG::s_Samplerates[2][4] =
{
{22050, 24000, 16000, -1}, // MPEG-2
{44100, 48000, 32000, -1} // MPEG-1
};
eAudioCodec cFemonMPEG::s_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 *videohandler, cFemonAudioIf *audiohandler)
: m_VideoHandler(videohandler),
m_AudioHandler(audiohandler)
{
}
cFemonMPEG::~cFemonMPEG()
{
}
bool cFemonMPEG::processAudio(const uint8_t *buf, int len)
{
cBitStream bs(buf, len * 8);
if (!m_AudioHandler)
return false;
// skip PES header
if (!PesLongEnough(len))
return false;
bs.skipBits(8 * PesPayloadOffset(buf));
// MPEG audio detection
if (bs.getBits(12) != 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
m_AudioHandler->SetAudioCodec(s_Formats[id][layer]);
switch (mode) {
case 0:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_STEREO);
break;
case 1:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_JOINT_STEREO);
break;
case 2:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_DUAL);
break;
case 3:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_SINGLE);
break;
default:
m_AudioHandler->SetAudioChannel(AUDIO_CHANNEL_MODE_INVALID);
break;
}
switch (bit_rate_index) {
case 0:
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_FREE);
break;
case 0xF:
m_AudioHandler->SetAudioBitrate(AUDIO_BITRATE_RESERVED);
break;
default:
m_AudioHandler->SetAudioBitrate(1000 * s_Bitrates[id][layer][bit_rate_index]);
break;
}
switch (sampling_frequency) {
case 3:
m_AudioHandler->SetAudioSamplingFrequency(AUDIO_SAMPLING_FREQUENCY_RESERVED);
break;
default:
m_AudioHandler->SetAudioSamplingFrequency(s_Samplerates[id][sampling_frequency]);
break;
}
return true;
}
bool cFemonMPEG::processVideo(const uint8_t *buf, int len)
{
cBitStream bs(buf, len * 8);
if (!m_VideoHandler)
return false;
// skip PES header
if (!PesLongEnough(len))
return false;
bs.skipBits(8 * PesPayloadOffset(buf));
// MPEG-2 video detection, search for start code
if (bs.getU32() != 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.getU32() != 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.getU32() != 0x000001B5) && // extension start code
(bs.getBits(4) == 0x0010)) { // sequence display extension id
switch (bs.getBits(3)) { // video format
case 0x000:
format = VIDEO_FORMAT_COMPONENT;
break;
case 0x001:
format = VIDEO_FORMAT_PAL;
break;
case 0x010:
format = VIDEO_FORMAT_NTSC;
break;
case 0x011:
format = VIDEO_FORMAT_SECAM;
break;
case 0x100:
format = VIDEO_FORMAT_MAC;
break;
case 0x101:
format = VIDEO_FORMAT_UNKNOWN;
break;
case 0x110:
case 0x111:
format = VIDEO_FORMAT_RESERVED;
break;
default:
format = VIDEO_FORMAT_INVALID;
break;
}
}
}
m_VideoHandler->SetVideoCodec(VIDEO_CODEC_MPEG2);
m_VideoHandler->SetVideoSize(horizontal_size, vertical_size);
m_VideoHandler->SetVideoBitrate(400.0 * (double)(bit_rate));
m_VideoHandler->SetVideoFramerate(frame_rate);
m_VideoHandler->SetVideoScan(eVideoScan(scan));
m_VideoHandler->SetVideoAspectRatio(eVideoAspectRatio(aspect));
m_VideoHandler->SetVideoFormat(eVideoFormat(format));
return true;
}

31
femonmpeg.h Normal file
View File

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

1455
femonosd.c

File diff suppressed because it is too large Load Diff

View File

@@ -3,7 +3,6 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id$
*/
#ifndef __FEMONOSD_H
@@ -15,42 +14,71 @@
#include <vdr/osd.h>
#include <vdr/thread.h>
#include <vdr/status.h>
#include <vdr/plugin.h>
#include <vdr/channels.h>
#include <vdr/font.h>
#include <vdr/transfer.h>
#include <vdr/tools.h>
#include "svdrpservice.h"
#define MAX_BM_NUMBER 8
class cFemonOsd : public cOsdObject, public cThread, public cStatus {
private:
bool m_Active;
cOsdBase *m_Osd;
tWindowHandle m_InfoWindow;
tWindowHandle m_StatusWindow;
cFemonReceiver *m_Receiver;
int m_Frontend;
struct dvb_frontend_info m_FrontendInfo;
int m_Number;
int m_OldNumber;
int m_InputTime;
uint16_t m_SNR;
uint16_t m_Signal;
uint32_t m_BER;
uint32_t m_UNC;
fe_status_t m_FrontendStatus;
int m_DisplayMode;
eDvbFont m_Font;
cMutex* m_Mutex;
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;
int m_Number;
int m_OldNumber;
uint16_t m_SNR;
bool m_SNRValid;
uint16_t m_Signal;
bool m_SignalValid;
uint32_t m_BER;
bool m_BERValid;
uint32_t m_UNC;
bool m_UNCValid;
fe_status_t m_FrontendStatus;
bool m_FrontendStatusValid;
dvb_frontend_info m_FrontendInfo;
int m_DisplayMode;
int m_OsdWidth;
int m_OsdHeight;
cFont *m_Font;
cTimeMs m_InputTime;
cCondWait m_Sleep;
cMutex m_Mutex;
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:
cFemonOsd(void);
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

View File

@@ -3,324 +3,245 @@
*
* 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(int Ca, int Vpid, int Apid, int Dpid)
#if VDRVERSNUM >= 10300
:cReceiver(Ca, -1, 3, Vpid, Apid, Dpid), cThread("femon receiver")
#else
:cReceiver(Ca, -1, 3, Vpid, Apid, Dpid)
#endif
cFemonReceiver::cFemonReceiver(int Vtype, int Vpid, int Apid, int Dpid)
: cThread("femon receiver"),
m_Mutex(),
m_Sleep(),
m_Active(false),
m_DetectH264(this),
m_DetectMPEG(this, this),
m_DetectAAC(this),
m_DetectAC3(this),
m_VideoBuffer(KILOBYTE(512), TS_SIZE, false, "Femon video"),
m_VideoType(Vtype),
m_VideoPid(Vpid),
m_VideoPacketCount(0),
m_VideoBitrate(0.0),
m_VideoValid(false),
m_AudioBuffer(KILOBYTE(256), TS_SIZE, false, "Femon audio"),
m_AudioPid(Apid),
m_AudioPacketCount(0),
m_AudioBitrate(0.0),
m_AudioValid(false),
m_AC3Buffer(KILOBYTE(256), TS_SIZE, false, "Femon AC3"),
m_AC3Pid(Dpid),
m_AC3PacketCount(0),
m_AC3Bitrate(0),
m_AC3Valid(false)
{
//printf("cFemonReceiver::cFemonReceiver()\n");
m_Active = false;
m_VideoPid = Vpid;
m_AudioPid = Apid;
m_AC3Pid = Dpid;
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;
debug("%s()\n", __PRETTY_FUNCTION__);
AddPid(m_VideoPid);
AddPid(m_AudioPid);
AddPid(m_AC3Pid);
m_VideoBuffer.SetTimeouts(0, 100);
m_AudioBuffer.SetTimeouts(0, 100);
m_AC3Buffer.SetTimeouts(0, 100);
m_VideoInfo.codec = VIDEO_CODEC_INVALID;
m_VideoInfo.format = VIDEO_FORMAT_INVALID;
m_VideoInfo.scan = VIDEO_SCAN_INVALID;
m_VideoInfo.aspectRatio = VIDEO_ASPECT_RATIO_INVALID;
m_VideoInfo.width = 0;
m_VideoInfo.height = 0;
m_VideoInfo.frameRate = 0;
m_VideoInfo.bitrate = AUDIO_BITRATE_INVALID;
m_AudioInfo.codec = AUDIO_CODEC_UNKNOWN;
m_AudioInfo.bitrate = AUDIO_BITRATE_INVALID;
m_AudioInfo.samplingFrequency = AUDIO_SAMPLING_FREQUENCY_INVALID;
m_AudioInfo.channelMode = AUDIO_CHANNEL_MODE_INVALID;
m_AC3Info.bitrate = AUDIO_BITRATE_INVALID;
m_AC3Info.samplingFrequency = AUDIO_SAMPLING_FREQUENCY_INVALID;
m_AC3Info.bitstreamMode = AUDIO_BITSTREAM_MODE_INVALID;
m_AC3Info.audioCodingMode = AUDIO_CODING_MODE_INVALID;
m_AC3Info.dolbySurroundMode = AUDIO_DOLBY_SURROUND_MODE_INVALID;
m_AC3Info.centerMixLevel = AUDIO_CENTER_MIX_LEVEL_INVALID;
m_AC3Info.surroundMixLevel = AUDIO_SURROUND_MIX_LEVEL_INVALID;
m_AC3Info.dialogLevel = 0;
m_AC3Info.lfe = false;
}
cFemonReceiver::~cFemonReceiver(void)
{
//printf("cFemonReceiver::~cFemonReceiver()\n");
debug("%s()\n", __PRETTY_FUNCTION__);
Deactivate();
}
void cFemonReceiver::Deactivate(void)
{
debug("%s()\n", __PRETTY_FUNCTION__);
if (m_Active) {
m_Active = false;
Cancel(0);
m_Sleep.Signal();
if (Running())
Cancel(3);
Detach();
}
}
/* The following function originates from libdvbmpeg: */
void cFemonReceiver::GetVideoInfo(uint8_t *mbuf, int count)
{
//printf("cFemonReceiver::GetVideoInfo()\n");
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 * (((headr[4] << 10) & 0x0003FC00UL) | ((headr[5] << 2) & 0x000003FCUL) | (((headr[6] & 0xC0) >> 6) & 0x00000003UL)) / 1000000.0;
}
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)
{
//printf("cFemonReceiver::GetAudioInfo()\n");
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 / 1000.0;
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];
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)) // if 3 front channels
m_AC3CenterMixLevel = (headr[4] & 0x18) >> 3;
else
m_AC3CenterMixLevel = FR_NOTVALID;
if (m_AC3AudioCodingMode & 0x04) // if a surround channel exists
m_AC3SurroundMixLevel = (headr[4] & 0x06) >> 1;
else
m_AC3SurroundMixLevel = FR_NOTVALID;
if (m_AC3AudioCodingMode == 0x02) // if in 2/0 mode
m_AC3DolbySurroundMode = ((headr[4] & 1) << 1) | ((headr[5] & 0x80) >> 7);
else
m_AC3DolbySurroundMode = FR_NOTVALID;
m_AC3LfeOn = (headr[5] & 0x40) >> 6;
m_AC3DialogLevel = (headr[5] & 0x3e) >> 1;
}
void cFemonReceiver::Activate(bool On)
{
//printf("cFemonReceiver::Activate()\n");
Start();
debug("%s(%d)\n", __PRETTY_FUNCTION__, On);
if (On)
Start();
else
Deactivate();
}
void cFemonReceiver::Receive(uchar *Data, int Length)
{
//printf("cFemonReceiver::Receive()\n");
// TS packet length: TS_SIZE
if (Length == TS_SIZE) {
int pid = ((Data[1] & 0x1f) << 8) | (Data[2]);
if (Running() && (*Data == TS_SYNC_BYTE) && (Length == TS_SIZE)) {
int len, pid = TsPid(Data);
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);
}
++m_VideoPacketCount;
len = m_VideoBuffer.Put(Data, Length);
if (len != Length) {
m_VideoBuffer.ReportOverflow(Length - len);
m_VideoBuffer.Clear();
}
}
else if (pid == m_AudioPid) {
++m_AudioPacketCount;
len = m_AudioBuffer.Put(Data, Length);
if (len != Length) {
m_AudioBuffer.ReportOverflow(Length - len);
m_AudioBuffer.Clear();
}
}
else if (pid == m_AC3Pid) {
++m_AC3PacketCount;
len = m_AC3Buffer.Put(Data, Length);
if (len != Length) {
m_AC3Buffer.ReportOverflow(Length - len);
m_AC3Buffer.Clear();
}
}
/* end */
}
}
void cFemonReceiver::Action(void)
{
//printf("cFemonReceiver::Action()\n");
#if (VDRVERSNUM < 10300)
isyslog("femon receiver: thread started (pid = %d)", getpid());
#endif
debug("%s()\n", __PRETTY_FUNCTION__);
cTimeMs calcPeriod(0);
m_Active = true;
while (m_Active) {
// TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit
m_VideoBitrate = (8.0 * 184.0 * m_VideoPacketCount) / (femonConfig.calcinterval * 100000.0);
m_VideoPacketCount = 0;
m_AudioBitrate = (8.0 * 184.0 * m_AudioPacketCount) / (femonConfig.calcinterval * 100.0);
m_AudioPacketCount = 0;
m_AC3Bitrate = (8.0 * 184.0 * m_AC3PacketCount) / (femonConfig.calcinterval * 100.0);
m_AC3PacketCount = 0;
usleep(100000L * femonConfig.calcinterval);
while (Running() && m_Active) {
uint8_t *Data;
double timeout;
int len, Length;
bool processed = false;
// process available video data
while (Data = m_VideoBuffer.Get(Length)) {
if (!m_Active || (Length < TS_SIZE))
break;
Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) {
Length = i;
break;
}
}
m_VideoBuffer.Del(Length);
continue;
}
processed = true;
if (TsPayloadStart(Data)) {
while (const uint8_t *p = m_VideoAssembler.GetPes(len)) {
if (m_VideoType == 0x1B) { // MPEG4
if (m_DetectH264.processVideo(p, len)) {
m_VideoValid = true;
break;
}
}
else {
if (m_DetectMPEG.processVideo(p, len)) {
m_VideoValid = true;
break;
}
}
}
m_VideoAssembler.Reset();
}
m_VideoAssembler.PutTs(Data, Length);
m_VideoBuffer.Del(Length);
}
// process available audio data
while (Data = m_AudioBuffer.Get(Length)) {
if (!m_Active || (Length < TS_SIZE))
break;
Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) {
Length = i;
break;
}
}
m_AudioBuffer.Del(Length);
continue;
}
processed = true;
if (const uint8_t *p = m_AudioAssembler.GetPes(len)) {
if (m_DetectAAC.processAudio(p, len) || m_DetectMPEG.processAudio(p, len))
m_AudioValid = true;
m_AudioAssembler.Reset();
}
m_AudioAssembler.PutTs(Data, Length);
m_AudioBuffer.Del(Length);
}
// process available dolby data
while (Data = m_AC3Buffer.Get(Length)) {
if (!m_Active || (Length < TS_SIZE))
break;
Length = TS_SIZE;
if (*Data != TS_SYNC_BYTE) {
for (int i = 1; i < Length; ++i) {
if (Data[i] == TS_SYNC_BYTE) {
Length = i;
break;
}
}
m_AC3Buffer.Del(Length);
continue;
}
processed = true;
if (const uint8_t *p = m_AC3Assembler.GetPes(len)) {
if (m_DetectAC3.processAudio(p, len))
m_AC3Valid = true;
m_AC3Assembler.Reset();
}
m_AC3Assembler.PutTs(Data, Length);
m_AC3Buffer.Del(Length);
}
// calculate bitrates
timeout = double(calcPeriod.Elapsed());
if (m_Active && (timeout >= (100.0 * femonConfig.calcinterval))) {
// TS packet 188 bytes - 4 byte header; MPEG standard defines 1Mbit = 1000000bit
// PES headers should be compensated!
m_VideoBitrate = (1000.0 * 8.0 * 184.0 * m_VideoPacketCount) / timeout;
m_VideoPacketCount = 0;
m_AudioBitrate = (1000.0 * 8.0 * 184.0 * m_AudioPacketCount) / timeout;
m_AudioPacketCount = 0;
m_AC3Bitrate = (1000.0 * 8.0 * 184.0 * m_AC3PacketCount) / timeout;
m_AC3PacketCount = 0;
calcPeriod.Set(0);
}
if (!processed)
m_Sleep.Wait(10); // to avoid busy loop and reduce cpu load
}
#if (VDRVERSNUM < 10300)
isyslog("femon receiver: thread stopped (pid = %d)", getpid());
#endif
}

View File

@@ -3,7 +3,6 @@
*
* See the README file for copyright information and how to reach the author.
*
* $Id$
*/
#ifndef __FEMONRECEIVER_H
@@ -12,82 +11,49 @@
#include <vdr/thread.h>
#include <vdr/receiver.h>
enum eVideoFormat {
VF_UNKNOWN = 0,
VF_PAL = 1,
VF_NTSC = 2,
};
#include "femonh264.h"
#include "femonmpeg.h"
#include "femonaac.h"
#include "femonac3.h"
#include "femonaudio.h"
#include "femonvideo.h"
#include "femontools.h"
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,
};
#define FR_RESERVED -1
#define FR_FREE -2
#define FR_NOTVALID -3
class cFemonReceiver : public cReceiver, public cThread {
class cFemonReceiver : public cReceiver, public cThread, public cFemonVideoIf, public cFemonAudioIf, public cFemonAC3If {
private:
bool m_Active;
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);
cMutex m_Mutex;
cCondWait m_Sleep;
bool m_Active;
cFemonH264 m_DetectH264;
cFemonMPEG m_DetectMPEG;
cFemonAAC m_DetectAAC;
cFemonAC3 m_DetectAC3;
cRingBufferLinear m_VideoBuffer;
cTsToPes m_VideoAssembler;
int m_VideoType;
int m_VideoPid;
int m_VideoPacketCount;
double m_VideoBitrate;
bool m_VideoValid;
video_info_t m_VideoInfo;
cRingBufferLinear m_AudioBuffer;
cTsToPes m_AudioAssembler;
int m_AudioPid;
int m_AudioPacketCount;
double m_AudioBitrate;
bool m_AudioValid;
audio_info_t m_AudioInfo;
cRingBufferLinear m_AC3Buffer;
cTsToPes m_AC3Assembler;
int m_AC3Pid;
int m_AC3PacketCount;
double m_AC3Bitrate;
bool m_AC3Valid;
ac3_info_t m_AC3Info;
protected:
virtual void Activate(bool On);
@@ -95,38 +61,115 @@ protected:
virtual void Action(void);
public:
cFemonReceiver(int Ca, int Vpid, int Apid, int Dpid);
virtual void SetVideoCodec(eVideoCodec codec) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.codec = codec; }
virtual void SetVideoFormat(eVideoFormat format) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.format = format; }
virtual void SetVideoScan(eVideoScan scan) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.scan = scan; }
virtual void SetVideoAspectRatio(eVideoAspectRatio aspectratio) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.aspectRatio = aspectratio; }
virtual void SetVideoSize(int width, int height) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.width = width;
m_VideoInfo.height = height; }
virtual void SetVideoFramerate(double framerate) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.frameRate = framerate; }
virtual void SetVideoBitrate(double bitrate) { cMutexLock MutexLock(&m_Mutex);
m_VideoInfo.bitrate = bitrate; }
virtual void SetAudioCodec(eAudioCodec codec) { cMutexLock MutexLock(&m_Mutex);
m_AudioInfo.codec = codec; }
virtual void SetAudioBitrate(double bitrate) { cMutexLock MutexLock(&m_Mutex);
m_AudioInfo.bitrate = bitrate; }
virtual void SetAudioSamplingFrequency(int sampling) { cMutexLock MutexLock(&m_Mutex);
m_AudioInfo.samplingFrequency = sampling; }
virtual void SetAudioChannel(eAudioChannelMode mode) { cMutexLock MutexLock(&m_Mutex);
m_AudioInfo.channelMode = mode; }
virtual void SetAC3Bitrate(int bitrate) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.bitrate = bitrate; }
virtual void SetAC3SamplingFrequency(int sampling) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.samplingFrequency = sampling; }
virtual void SetAC3Bitstream(int mode) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.bitstreamMode = mode; }
virtual void SetAC3AudioCoding(int mode) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.audioCodingMode = mode; }
virtual void SetAC3DolbySurround(int mode) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.dolbySurroundMode = mode; }
virtual void SetAC3CenterMix(int level) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.centerMixLevel = level; }
virtual void SetAC3SurroundMix(int level) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.surroundMixLevel = level; }
virtual void SetAC3Dialog(int level) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.dialogLevel = level; }
virtual void SetAC3LFE(bool onoff) { cMutexLock MutexLock(&m_Mutex);
m_AC3Info.lfe = onoff; }
public:
cFemonReceiver(int Vtype, int Vpid, int Apid, int Dpid);
virtual ~cFemonReceiver();
void Deactivate(void);
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; }; // Mbit/s
double VideoBitrate(void) { return m_VideoBitrate; }; // Mbit/s
bool VideoValid(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoValid; }; // boolean
double VideoBitrate(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoBitrate; }; // bit/s
int VideoCodec(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.codec; }; // eVideoCodec
int VideoFormat(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.format; }; // eVideoFormat
int VideoScan(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.scan; }; // eVideoScan
int VideoAspectRatio(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.aspectRatio; }; // eVideoAspectRatio
int VideoHorizontalSize(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.width; }; // pixels
int VideoVerticalSize(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.height; }; // pixels
double VideoFrameRate(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.frameRate; }; // Hz
double VideoStreamBitrate(void) { cMutexLock MutexLock(&m_Mutex);
return m_VideoInfo.bitrate; }; // bit/s
bool AudioValid(void) { 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; }; // kbit/s
double AudioBitrate(void) { return m_AudioBitrate; }; // kbit/s
bool AudioValid(void) { cMutexLock MutexLock(&m_Mutex);
return m_AudioValid; }; // boolean
double AudioBitrate(void) { cMutexLock MutexLock(&m_Mutex);
return m_AudioBitrate; }; // bit/s
int AudioCodec(void) { cMutexLock MutexLock(&m_Mutex);
return m_AudioInfo.codec; }; // eAudioCodec
int AudioChannelMode(void) { cMutexLock MutexLock(&m_Mutex);
return m_AudioInfo.channelMode; }; // eAudioChannelMode
double AudioStreamBitrate(void) { cMutexLock MutexLock(&m_Mutex);
return m_AudioInfo.bitrate; }; // bit/s or eAudioBitrate
int AudioSamplingFreq(void) { cMutexLock MutexLock(&m_Mutex);
return m_AudioInfo.samplingFrequency; }; // Hz or eAudioSamplingFrequency
bool AC3Valid(void) { return m_AC3Valid; }; // boolean
int AC3SamplingFreq(void) { return m_AC3SamplingFreq; }; // Hz
double AC3StreamBitrate(void) { return m_AC3StreamBitrate; }; // kbit/s
double AC3Bitrate(void) { return m_AC3Bitrate; }; // kbit/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
bool AC3Valid(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Valid; }; // boolean
double AC3Bitrate(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Bitrate; }; // bit/s
double AC3StreamBitrate(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.bitrate; }; // bit/s or eAudioBitrate
int AC3SamplingFreq(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.samplingFrequency; }; // Hz or eAudioSamplingFrequency
int AC3BitStreamMode(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.bitstreamMode; }; // 0..7 or eAudioBitstreamMode
int AC3AudioCodingMode(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.audioCodingMode; }; // 0..7 or eAudioCodingMode
bool AC3_2_0(void) { cMutexLock MutexLock(&m_Mutex);
return (m_AC3Info.audioCodingMode == AUDIO_CODING_MODE_2_0); }; // boolean
bool AC3_5_1(void) { cMutexLock MutexLock(&m_Mutex);
return (m_AC3Info.audioCodingMode == AUDIO_CODING_MODE_3_2); }; // boolean
int AC3DolbySurroundMode(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.dolbySurroundMode; }; // eAudioDolbySurroundMode
int AC3CenterMixLevel(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.centerMixLevel; }; // eAudioCenterMixLevel
int AC3SurroundMixLevel(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.surroundMixLevel; }; // eAudioSurroundMixLevel
int AC3DialogLevel(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.dialogLevel; }; // -dB
bool AC3Lfe(void) { cMutexLock MutexLock(&m_Mutex);
return m_AC3Info.lfe; }; // boolean
};
#endif //__FEMONRECEIVER_H

26
femonservice.h Normal file
View File

@@ -0,0 +1,26 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONSERVICE_H
#define __FEMONSERVICE_H
#include <linux/dvb/frontend.h>
struct FemonService_v1_0 {
cString fe_name;
cString fe_status;
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;
};
#endif //__FEMONSERVICE_H

83
femonsymbol.c Normal file
View File

@@ -0,0 +1,83 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#include "femonsymbol.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/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/format1080.xpm"
#include "symbols/format720.xpm"
#include "symbols/format576.xpm"
#include "symbols/format480.xpm"
cBitmap bmSymbol[SYMBOL_MAX_COUNT] =
{
cBitmap(stereo_xpm), // SYMBOL_STEREO
cBitmap(monoleft_xpm), // SYMBOL_MONO_LEFT
cBitmap(monoright_xpm), // SYMBOL_MONO_RIGHT
cBitmap(dolbydigital_xpm), // SYMBOL_DD
cBitmap(dolbydigital20_xpm), // SYMBOL_DD20
cBitmap(dolbydigital51_xpm), // SYMBOL_DD51
cBitmap(mpeg2_xpm), // SYMBOL_MPEG2
cBitmap(h264_xpm), // SYMBOL_H264
cBitmap(pal_xpm), // SYMBOL_PAL
cBitmap(ntsc_xpm), // SYMBOL_NTSC
cBitmap(encrypted_xpm), // SYMBOL_ENCRYPTED
cBitmap(svdrp_xpm), // SYMBOL_SVDRP
cBitmap(lock_xpm), // SYMBOL_LOCK
cBitmap(signal_xpm), // SYMBOL_SIGNAL
cBitmap(carrier_xpm), // SYMBOL_CARRIER
cBitmap(viterbi_xpm), // SYMBOL_VITERBI
cBitmap(sync_xpm), // SYMBOL_SYNC
cBitmap(ar11_xpm), // SYMBOL_AR_1_1
cBitmap(ar169_xpm), // SYMBOL_AR_16_9
cBitmap(ar2211_xpm), // SYMBOL_AR_2_21_1
cBitmap(ar43_xpm), // SYMBOL_AR_4_3
cBitmap(device_xpm), // SYMBOL_DEVICE
cBitmap(zero_xpm), // SYMBOL_ZERO
cBitmap(one_xpm), // SYMBOL_ONE
cBitmap(two_xpm), // SYMBOL_TWO
cBitmap(three_xpm), // SYMBOL_THREE
cBitmap(four_xpm), // SYMBOL_FOUR
cBitmap(five_xpm), // SYMBOL_FIVE
cBitmap(six_xpm), // SYMBOL_SIX
cBitmap(seven_xpm), // SYMBOL_SEVEN
cBitmap(eight_xpm), // SYMBOL_EIGHT
cBitmap(format1080_xpm), // SYMBOL_FORMAT_1080
cBitmap(format720_xpm), // SYMBOL_FORMAT_720
cBitmap(format576_xpm), // SYMBOL_FORMAT_576
cBitmap(format480_xpm) // SYMBOL_FORMAT_480
};

54
femonsymbol.h Normal file
View File

@@ -0,0 +1,54 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONSYMBOL_H
#define __FEMONSYMBOL_H
#include <vdr/osd.h>
enum eSymbols {
SYMBOL_STEREO,
SYMBOL_MONO_LEFT,
SYMBOL_MONO_RIGHT,
SYMBOL_DD,
SYMBOL_DD20,
SYMBOL_DD51,
SYMBOL_MPEG2,
SYMBOL_H264,
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_1080,
SYMBOL_FORMAT_720,
SYMBOL_FORMAT_576,
SYMBOL_FORMAT_480,
SYMBOL_MAX_COUNT
};
extern cBitmap bmSymbol[SYMBOL_MAX_COUNT];
#endif // __FEMONSYMBOL_H

624
femontools.c Normal file
View File

@@ -0,0 +1,624 @@
/*
* 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 <stdint.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/dvb/frontend.h>
#include "femonreceiver.h"
#include "femonosd.h"
#include "femontools.h"
static cString getCA(int value)
{
// http://www.dvb.org/index.php?id=174
// http://en.wikipedia.org/wiki/Conditional_access_system
switch (value) {
case 0x0000: return cString::sprintf("%s (%X)", trVDR("Free To Air"), value); // Reserved
case 0x0001 ... 0x009F:
case 0x00A2 ... 0x00FF: return cString::sprintf("%s (%X)", tr("Fixed"), value); // Standardized systems
case 0x00A0 ... 0x00A1: return cString::sprintf("%s (%X)", tr("Analog"), value); // Analog signals
case 0x0100 ... 0x01FF: return cString::sprintf("%s (%X)", "SECA Mediaguard", value); // Canal Plus
case 0x0464: return cString::sprintf("%s (%X)", "EuroDec", value); // EuroDec
case 0x0500 ... 0x05FF: return cString::sprintf("%s (%X)", "Viaccess", value); // France Telecom
case 0x0600 ... 0x06FF: return cString::sprintf("%s (%X)", "Irdeto", value); // Irdeto
case 0x0900 ... 0x09FF: return cString::sprintf("%s (%X)", "NDS Videoguard", value); // News Datacom
case 0x0B00 ... 0x0BFF: return cString::sprintf("%s (%X)", "Conax", value); // Norwegian Telekom
case 0x0D00 ... 0x0DFF: return cString::sprintf("%s (%X)", "CryptoWorks", value); // Philips
case 0x0E00 ... 0x0EFF: return cString::sprintf("%s (%X)", "PowerVu", value); // Scientific Atlanta
case 0x1000: return cString::sprintf("%s (%X)", "RAS", value); // Tandberg Television
case 0x1200 ... 0x12FF: return cString::sprintf("%s (%X)", "NagraVision", value); // BellVu Express
case 0x1700 ... 0x17FF: return cString::sprintf("%s (%X)", "BetaCrypt", value); // BetaTechnik
case 0x1800 ... 0x18FF: return cString::sprintf("%s (%X)", "NagraVision", value); // Kudelski SA
case 0x22F0: return cString::sprintf("%s (%X)", "Codicrypt", value); // Scopus Network Technologies
case 0x2600: return cString::sprintf("%s (%X)", "BISS", value); // European Broadcasting Union
case 0x4347: return cString::sprintf("%s (%X)", "CryptOn", value); // CryptOn
case 0x4800: return cString::sprintf("%s (%X)", "Accessgate", value); // Telemann
case 0x4900: return cString::sprintf("%s (%X)", "China Crypt", value); // CryptoWorks
case 0x4A10: return cString::sprintf("%s (%X)", "EasyCas", value); // EasyCas
case 0x4A20: return cString::sprintf("%s (%X)", "AlphaCrypt", value); // AlphaCrypt
case 0x4A70: return cString::sprintf("%s (%X)", "DreamCrypt", value); // Dream Multimedia
case 0x4A60: return cString::sprintf("%s (%X)", "SkyCrypt", value); // @Sky
case 0x4A61: return cString::sprintf("%s (%X)", "Neotioncrypt", value); // Neotion
case 0x4A62: return cString::sprintf("%s (%X)", "SkyCrypt", value); // @Sky
case 0x4A63: return cString::sprintf("%s (%X)", "Neotion SHL", value); // Neotion
case 0x4A64 ... 0x4A6F: return cString::sprintf("%s (%X)", "SkyCrypt", value); // @Sky
case 0x4A80: return cString::sprintf("%s (%X)", "ThalesCrypt", value); // TPS
case 0x4AA1: return cString::sprintf("%s (%X)", "KeyFly", value); // SIDSA
case 0x4ABF: return cString::sprintf("%s (%X)", "DG-Crypt", value); // Beijing Compunicate Technology Inc.
case 0x4AD0 ... 0x4AD1: return cString::sprintf("%s (%X)", "X-Crypt", value); // XCrypt Inc.
case 0x4AD4: return cString::sprintf("%s (%X)", "OmniCrypt", value); // Widevine Technologies, Inc.
case 0x4AE0: return cString::sprintf("%s (%X)", "RossCrypt", value); // Digi Raum Electronics Co. Ltd.
case 0x5500: return cString::sprintf("%s (%X)", "Z-Crypt", value); // Digi Raum Electronics Co. Ltd.
case 0x5501: return cString::sprintf("%s (%X)", "Griffin", value); // Griffin
default: break;
}
return cString::sprintf("%X", value);
}
static const char *getUserString(int Value, const tChannelParameterMap *Map)
{
const tChannelParameterMap *map = Map;
while (map && map->userValue != -1) {
if (map->driverValue == Value)
return map->userString ? trVDR(map->userString) : "---";
map++;
}
return "---";
}
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;
cChannel *channel = Channels.GetByNumber(cDevice::CurrentChannel());
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (fe < 0)
return NULL;
info = cString::sprintf("CARD:%d", cardIndex);
if (ioctl(fe, FE_GET_INFO, &value) >= 0)
info = cString::sprintf("%s\nTYPE:%d\nNAME:%s", *info, value.type, value.name);
if (ioctl(fe, FE_READ_STATUS, &status) >= 0)
info = cString::sprintf("%s\nSTAT:%02X", *info, status);
if (ioctl(fe, FE_READ_SIGNAL_STRENGTH, &signal) >= 0)
info = cString::sprintf("%s\nSGNL:%04X", *info, signal);
if (ioctl(fe, FE_READ_SNR, &snr) >= 0)
info = cString::sprintf("%s\nSNRA:%04X", *info, snr);
if (ioctl(fe, FE_READ_BER, &ber) >= 0)
info = cString::sprintf("%s\nBERA:%08X", *info, ber);
if (ioctl(fe, FE_READ_UNCORRECTED_BLOCKS, &unc) >= 0)
info = cString::sprintf("%s\nUNCB:%08X", *info, unc);
close(fe);
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;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (fe < 0)
return NULL;
memset(&value, 0, sizeof(value));
ioctl(fe, FE_GET_INFO, &value);
close(fe);
return (cString::sprintf("%s on device #%d", value.name, cardIndex));
}
cString getFrontendStatus(int cardIndex)
{
fe_status_t value;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (fe < 0)
return NULL;
memset(&value, 0, sizeof(value));
ioctl(fe, FE_READ_STATUS, &value);
close(fe);
return (cString::sprintf("Status %s:%s:%s:%s:%s on 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;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (fe < 0)
return (value);
ioctl(fe, FE_READ_SIGNAL_STRENGTH, &value);
close(fe);
return (value);
}
uint16_t getSNR(int cardIndex)
{
uint16_t value = 0;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (fe < 0)
return (value);
ioctl(fe, FE_READ_SNR, &value);
close(fe);
return (value);
}
uint32_t getBER(int cardIndex)
{
uint32_t value = 0;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (fe < 0)
return (value);
ioctl(fe, FE_READ_BER, &value);
close(fe);
return (value);
}
uint32_t getUNC(int cardIndex)
{
uint32_t value = 0;
cString dev = cString::sprintf(FRONTEND_DEVICE, cardIndex, 0);
int fe = open(dev, O_RDONLY | O_NONBLOCK);
if (fe < 0)
return (value);
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)
{
int value = 0;
cString caids = cString::sprintf("%s", *getCA(channel->Ca(value)));
while (channel->Ca(++value) && (value < MAXCAIDS))
caids = cString::sprintf("%s, %s", *caids, *getCA(channel->Ca(value)));
return caids;
}
cString getVideoStream(int value)
{
if (value != 0)
return cString::sprintf("#%d", value);
return cString::sprintf("---");
}
cString getAudioStream(int value, const cChannel *channel)
{
int pid = 0;
if (IS_AUDIO_TRACK(value))
pid = int(value - ttAudioFirst);
if (channel && channel->Apid(pid)) {
if (channel->Alang(pid))
return cString::sprintf("#%d (%s)", channel->Apid(pid), channel->Alang(pid));
else
return cString::sprintf("#%d", channel->Apid(pid));
}
return cString::sprintf("---");
}
cString getAC3Stream(int value, const cChannel *channel)
{
int pid = 0;
if (IS_DOLBY_TRACK(value))
pid = int(value - ttDolbyFirst);
if (channel && channel->Dpid(pid)) {
if (channel->Dlang(pid))
return cString::sprintf("#%d (%s)", channel->Dpid(pid), channel->Dlang(pid));
else
return cString::sprintf("#%d", channel->Dpid(pid));
}
return cString::sprintf("---");
}
cString getVideoCodec(int value)
{
switch (value) {
case VIDEO_CODEC_MPEG2: return cString::sprintf("%s", tr("MPEG-2"));
case VIDEO_CODEC_H264: return cString::sprintf("%s", tr("H.264"));
default: break;
}
return cString::sprintf("---");
}
cString getAudioCodec(int value)
{
switch (value) {
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"));
default: break;
}
return cString::sprintf("---");
}
cString getAudioChannelMode(int value)
{
switch (value) {
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 value)
{
return cString::sprintf("%s", getUserString(value, CoderateValues));
}
cString getTransmission(int value)
{
return cString::sprintf("%s", getUserString(value, TransmissionValues));
}
cString getBandwidth(int value)
{
return cString::sprintf("%s", getUserString(value, BandwidthValues));
}
cString getInversion(int value)
{
return cString::sprintf("%s", getUserString(value, InversionValues));
}
cString getHierarchy(int value)
{
return cString::sprintf("%s", getUserString(value, HierarchyValues));
}
cString getGuard(int value)
{
return cString::sprintf("%s", getUserString(value, GuardValues));
}
cString getModulation(int value)
{
return cString::sprintf("%s", getUserString(value, ModulationValues));
}
cString getSystem(int value)
{
return cString::sprintf("%s", getUserString(value, SystemValues));
}
cString getRollOff(int value)
{
return cString::sprintf("%s", getUserString(value, RollOffValues));
}
cString getResolution(int width, int height, int scan)
{
if ((width > 0) && (height > 0)) {
switch (scan) {
case VIDEO_SCAN_INTERLACED: return cString::sprintf("%dx%d %s", width, height, tr("interlaced"));
case VIDEO_SCAN_PROGRESSIVE: return cString::sprintf("%dx%d %s", width, height, tr("progressive"));
default: return cString::sprintf("%dx%d", width, height);
}
}
return cString::sprintf("---");
}
cString getAspectRatio(int value)
{
switch (value) {
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 value)
{
switch (value) {
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 value)
{
if (value > 0)
return cString::sprintf("%.2f %s", value, tr("Hz"));
return cString::sprintf("---");
}
cString getAC3BitStreamMode(int value, int coding)
{
switch (value) {
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", (coding == 1) ? tr("Voice Over (VO)") : tr("Karaoke"));
default: break;
}
return cString::sprintf("---");
}
cString getAC3AudioCodingMode(int value, int stream)
{
if (stream != 7) {
switch (value) {
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 value)
{
switch (value) {
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 value)
{
switch (value) {
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 value)
{
switch (value) {
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 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 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", value, tr("Hz"));
}
cString getAudioBitrate(double value, double stream)
{
switch ((int)stream) {
case AUDIO_BITRATE_INVALID: return cString::sprintf("---");
case AUDIO_BITRATE_RESERVED: return cString::sprintf("%s (%s)", tr("reserved"), *getBitrateKbits(value));
case AUDIO_BITRATE_FREE: return cString::sprintf("%s (%s)", tr("free"), *getBitrateKbits(value));
default: break;
}
return cString::sprintf("%s (%s)", *getBitrateKbits(stream), *getBitrateKbits(value));
}
cString getVideoBitrate(double value, double stream)
{
return cString::sprintf("%s (%s)", *getBitrateMbits(stream), *getBitrateMbits(value));
}
cString getBitrateMbits(double value)
{
if (value > 0)
return cString::sprintf("%.2f %s", value / 1000000.0, tr("Mbit/s"));
return cString::sprintf("---");
}
cString getBitrateKbits(double value)
{
if (value > 0)
return cString::sprintf("%.0f %s", value / 1000.0, tr("kbit/s"));
return cString::sprintf("---");
}
cBitStream::cBitStream(const uint8_t *buf, const int len)
: data(buf),
count(len),
index(0)
{
}
cBitStream::~cBitStream()
{
}
int cBitStream::getBit()
{
if (index >= count)
return (1); // -> no infinite colomb's ...
int r = (data[index >> 3] >> (7 - (index & 7))) & 1;
++index;
return (r);
}
uint32_t cBitStream::getBits(uint32_t n)
{
uint32_t r = 0;
while (n--)
r = (r | (getBit() << n));
return (r);
}
void cBitStream::skipBits(uint32_t n)
{
index += n;
}
uint32_t cBitStream::getUeGolomb()
{
int n = 0;
while (!getBit() && (n < 32))
n++;
return (n ? ((1 << n) - 1) + getBits(n) : 0);
}
int32_t cBitStream::getSeGolomb()
{
uint32_t r = getUeGolomb() + 1;
return ((r & 1) ? -(r >> 1) : (r >> 1));
}
void cBitStream::skipGolomb()
{
int n = 0;
while (!getBit() && (n < 32))
n++;
skipBits(n);
}
void cBitStream::skipUeGolomb()
{
skipGolomb();
}
void cBitStream::skipSeGolomb()
{
skipGolomb();
}
void cBitStream::byteAlign()
{
int n = index % 8;
if (n > 0)
skipBits(8 - n);
}

105
femontools.h Normal file
View File

@@ -0,0 +1,105 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONTOOLS_H
#define __FEMONTOOLS_H
#include <stdint.h>
#include <vdr/channels.h>
#include <vdr/remux.h>
#include <vdr/tools.h>
#ifdef DEBUG
#define debug(x...) dsyslog("FEMON: " x);
#define error(x...) esyslog("ERROR: " x);
#else
#define debug(x...) ;
#define error(x...) esyslog("ERROR: " x);
#endif
#define ELEMENTS(x) (sizeof(x) / sizeof(x[0]))
#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);
cString getVideoStream(int value);
cString getVideoCodec(int value);
cString getAudioStream(int value, const cChannel *channel);
cString getAudioCodec(int value);
cString getAudioChannelMode(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 getSystem(int value);
cString getRollOff(int value);
cString getResolution(int width, int height, int scan);
cString getAspectRatio(int value);
cString getVideoFormat(int value);
cString getFrameRate(double value);
cString getAC3Stream(int value, const cChannel *channel);
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 getVideoBitrate(double value, double stream);
cString getBitrateMbits(double value);
cString getBitrateKbits(double value);
class cBitStream {
private:
const uint8_t *data;
int count; // in bits
int index; // in bits
public:
cBitStream(const uint8_t *buf, const int len);
~cBitStream();
int getBit();
uint32_t getBits(uint32_t n);
void skipBits(uint32_t n);
uint32_t getUeGolomb();
int32_t getSeGolomb();
void skipGolomb();
void skipUeGolomb();
void skipSeGolomb();
void byteAlign();
void skipBit() { skipBits(1); }
uint32_t getU8() { return getBits(8); }
uint32_t getU16() { return ((getBits(8) << 8) | getBits(8)); }
uint32_t getU24() { return ((getBits(8) << 16) | (getBits(8) << 8) | getBits(8)); }
uint32_t getU32() { return ((getBits(8) << 24) | (getBits(8) << 16) | (getBits(8) << 8) | getBits(8)); }
bool isEOF() { return (index >= count); }
void reset() { index = 0; }
int getIndex() { return (isEOF() ? count : index); }
const uint8_t *getData() { return (isEOF() ? NULL : data + (index / 8)); }
};
#endif // __FEMONTOOLS_H

93
femonvideo.h Normal file
View File

@@ -0,0 +1,93 @@
/*
* Frontend Status Monitor plugin for the Video Disk Recorder
*
* See the README file for copyright information and how to reach the author.
*
*/
#ifndef __FEMONVIDEO_H
#define __FEMONVIDEO_H
enum eVideoCodec {
VIDEO_CODEC_INVALID = -1,
VIDEO_CODEC_UNKNOWN,
VIDEO_CODEC_MPEG2,
VIDEO_CODEC_H264
};
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 codec) = 0;
// eVideoFormat
virtual void SetVideoFormat(eVideoFormat format) = 0;
// eVideoScan
virtual void SetVideoScan(eVideoScan scan) = 0;
// eVideoAspectRatio
virtual void SetVideoAspectRatio(eVideoAspectRatio aspectratio) = 0;
// pixels
virtual void SetVideoSize(int width, int height) = 0;
// Hz
virtual void SetVideoFramerate(double framerate) = 0;
// Mbit/s
virtual void SetVideoBitrate(double bitrate) = 0;
};
#endif //__FEMONVIDEO_H

375
po/de_DE.po Normal file
View File

@@ -0,0 +1,375 @@
# VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Peter Marquardt
# Andreas Brachold
# Christian Wieninger
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Christian Wieninger\n"
"Language-Team: <vdr@linuxtv.org>\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 "DVB Signal Informationsanzeige (OSD)"
msgid "Signal Information"
msgstr "Signalinformationen"
msgid "Femon not available"
msgstr "Femon nicht verf<72>gbar"
msgid "basic"
msgstr "Standard"
msgid "transponder"
msgstr "Transponder"
msgid "stream"
msgstr "Stream"
msgid "AC-3"
msgstr "AC-3"
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 "Hide main menu entry"
msgstr "Hauptmen<65>eintrag verstecken"
msgid "Define whether the main menu entry is hidden."
msgstr ""
msgid "Default display mode"
msgstr "Standard Anzeigemodus"
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 "Position"
msgid "Define the position of OSD."
msgstr ""
msgid "Red limit [%]"
msgstr "Grenze Rot [%]"
msgid "Define a limit for red bar, which is used to indicate a bad signal."
msgstr ""
msgid "Green limit [%]"
msgstr "Grenze Gr<47>n [%]"
msgid "Define a limit for green bar, which is used to indicate a good signal."
msgstr ""
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 ""
msgid "Analyze stream"
msgstr "Stream analysieren"
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
msgstr ""
msgid "Calculation interval [0.1s]"
msgstr "Berechnungsintervall [0.1s]"
msgid "Define an interval for calculation. The bigger interval generates more stable values."
msgstr ""
msgid "Use SVDRP service"
msgstr "SVDRP Service verwenden"
msgid "Define whether the SVDRP service is used in client/server setups."
msgstr ""
msgid "SVDRP service port"
msgstr "SVDRP Service Port"
msgid "Define the port number of SVDRP service."
msgstr ""
msgid "SVDRP service IP"
msgstr "SVDRP Service IP"
msgid "Define the IP address of SVDRP service."
msgstr ""
msgid "Help"
msgstr "Hilfe"
msgid "Video"
msgstr "Video"
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 "Stream Information"
msgstr "Streaminformation"
msgid "Video Stream"
msgstr "Video Stream"
msgid "Codec"
msgstr ""
msgid "Bitrate"
msgstr "Bitrate"
msgid "Aspect Ratio"
msgstr "Seitenverh<72>ltnis"
msgid "Frame Rate"
msgstr "Bildrate"
msgid "Video Format"
msgstr "Bildformat"
msgid "Resolution"
msgstr "Aufl<66>sung"
msgid "Audio Stream"
msgstr "Audio Stream"
msgid "Channel Mode"
msgstr ""
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<66>ner Effekte"
msgid "Dialogue Normalization"
msgstr "Dialog Normalisierung"
msgid "Fixed"
msgstr "Fest"
msgid "Analog"
msgstr "Analog"
msgid "MPEG-2"
msgstr ""
msgid "H.264"
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 "stereo"
msgstr ""
msgid "joint Stereo"
msgstr ""
msgid "dual"
msgstr ""
msgid "mono"
msgstr ""
msgid "interlaced"
msgstr ""
msgid "progressive"
msgstr ""
msgid "reserved"
msgstr "belegt"
msgid "extended"
msgstr ""
msgid "unknown"
msgstr "unbekannt"
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 "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 "<22>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"

373
po/es_ES.po Normal file
View File

@@ -0,0 +1,373 @@
# VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Luis Palacios
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Luis Palacios\n"
"Language-Team: <vdr@linuxtv.org>\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<63>n de la se<73>al DVB"
msgid "Signal Information"
msgstr "Monitorizaci<63>n de la se<73>al DVB"
msgid "Femon not available"
msgstr ""
msgid "basic"
msgstr "B<>sico"
msgid "transponder"
msgstr "Transpondedor"
msgid "stream"
msgstr "Flujo"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "Cl<43>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 "Hide main menu entry"
msgstr "Ocultar en el men<65> principal"
msgid "Define whether the main menu entry is hidden."
msgstr ""
msgid "Default display mode"
msgstr "Modo de visualizaci<63>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<63>n"
msgid "Define the position of OSD."
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<63>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 "Video"
msgstr "Video"
msgid "Audio"
msgstr "Audio"
msgid "Transponder Information"
msgstr "Informaci<63>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 "Stream Information"
msgstr "Informaci<63>n del flujo"
msgid "Video Stream"
msgstr "Flujo de video"
msgid "Codec"
msgstr ""
msgid "Bitrate"
msgstr "Tasa de bits"
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<63>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<63>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<63>n del di<64>logo"
msgid "Fixed"
msgstr "Fijo"
msgid "Analog"
msgstr "Anal<61>gico"
msgid "MPEG-2"
msgstr ""
msgid "H.264"
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 "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<44>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"

373
po/et_EE.po Normal file
View File

@@ -0,0 +1,373 @@
# VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Arthur Konovalov
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Arthur Konovalov\n"
"Language-Team: <vdr@linuxtv.org>\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 "basic"
msgstr "standard"
msgid "transponder"
msgstr "transponder"
msgid "stream"
msgstr "voog"
msgid "AC-3"
msgstr "AC-3"
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 "Hide main menu entry"
msgstr "Peita valik peamen<65><6E>s"
msgid "Define whether the main menu entry is hidden."
msgstr "Valiku peamen<65><6E>s peitmise m<><6D>ritlemine."
msgid "Default display mode"
msgstr "Vaikemoodus"
msgid "Define the default display mode at startup."
msgstr "K<>ivitamisel vaikemooduse m<><6D>ritlemine."
msgid "Define the used OSD skin."
msgstr "Kasutatava ekraanikesta m<><6D>ritlemine."
msgid "Define the used OSD theme."
msgstr "Kasutatava teema m<><6D>ritlemine."
msgid "Position"
msgstr "Positsioon"
msgid "Define the position of OSD."
msgstr "Ekraaniinfo positsiooni m<><6D>ritlemine."
msgid "Red limit [%]"
msgstr "Punase limiit [%]"
msgid "Define a limit for red bar, which is used to indicate a bad signal."
msgstr "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<><6D>ritlemine. V<>iksem intervall- suurem CPU koormus."
msgid "Analyze stream"
msgstr "Voo anal<61><6C>s"
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
msgstr "DVB voo bitikiiruse rehkendamise m<><6D>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<><6D>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<><6D>ritlemine."
msgid "SVDRP service port"
msgstr "SVDRP port"
msgid "Define the port number of SVDRP service."
msgstr "SVDRP teenuse pordi m<><6D>ritlemine."
msgid "SVDRP service IP"
msgstr "SVDRP IP"
msgid "Define the IP address of SVDRP service."
msgstr "SVDRP teenuse IP aadressi m<><6D>ritlemine."
msgid "Help"
msgstr "Abi"
msgid "Video"
msgstr "Video"
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 "Stream Information"
msgstr "Vooinfo"
msgid "Video Stream"
msgstr "Videovoog"
msgid "Codec"
msgstr "Koodek"
msgid "Bitrate"
msgstr "Bitikiirus"
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<><74>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<><74>p"
msgid "Low Frequency Effects"
msgstr "LFE kanal"
msgid "Dialogue Normalization"
msgstr "Dialoogi normalisatsioon"
msgid "Fixed"
msgstr "Fikseeritud"
msgid "Analog"
msgstr "Analoog"
msgid "MPEG-2"
msgstr "MPEG-2"
msgid "H.264"
msgstr "H.264"
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 "stereo"
msgstr "stereo"
msgid "joint Stereo"
msgstr "joint stereo"
msgid "dual"
msgstr "duaalne"
msgid "mono"
msgstr "mono"
msgid "interlaced"
msgstr "<22>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<67>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<65><72>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"

373
po/fi_FI.po Normal file
View File

@@ -0,0 +1,373 @@
# VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Rolf Ahrenberg
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Rolf Ahrenberg\n"
"Language-Team: <vdr@linuxtv.org>\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 "basic"
msgstr "perus"
msgid "transponder"
msgstr "transponderi"
msgid "stream"
msgstr "lähete"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "Klassinen"
msgid "Elchi"
msgstr "Elchi"
msgid "ST:TNG"
msgstr "ST:TNG"
msgid "DeepBlue"
msgstr "DeepBlue"
msgid "Moronimo"
msgstr "Moronimo"
msgid "Enigma"
msgstr "Enigma"
msgid "EgalsTry"
msgstr "EgalsTry"
msgid "Duotone"
msgstr "Duotone"
msgid "SilverGreen"
msgstr "SilverGreen"
msgid "Hide main menu entry"
msgstr "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 "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 "Video"
msgstr "Kuva"
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 "Lähete-ID"
msgid "Rid"
msgstr "Radio-ID"
msgid "Coderate"
msgstr "Suojaustaso"
msgid "Stream Information"
msgstr "Lähetteen tiedot"
msgid "Video Stream"
msgstr "Kuvaraita"
msgid "Codec"
msgstr "Koodekki"
msgid "Bitrate"
msgstr "Bittinopeus"
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 "Fixed"
msgstr "kiinteä"
msgid "Analog"
msgstr "analoginen"
msgid "MPEG-2"
msgstr "MPEG-2"
msgid "H.264"
msgstr "H.264"
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 "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"

373
po/fr_FR.po Normal file
View File

@@ -0,0 +1,373 @@
# VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Nicolas Huillard
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2008-01-26 09:59+0100\n"
"Last-Translator: NIVAL Micha<68>l <mnival@club-internet.fr>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ISO-8859-1\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "DVB Signal Information Monitor (OSD)"
msgstr "Affiche les informations du signal DVB"
msgid "Signal Information"
msgstr "Signal DVB"
msgid "Femon not available"
msgstr "Femon n'est pas disponible"
msgid "basic"
msgstr "basique"
msgid "transponder"
msgstr "transpondeur"
msgid "stream"
msgstr "flux"
msgid "AC-3"
msgstr "AC-3"
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 "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<74>e doit <20>tre masqu<71>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 <20> utiliser."
msgid "Define the used OSD theme."
msgstr "D<>finit le th<74>me OSD <20> utiliser."
msgid "Position"
msgstr "Position"
msgid "Define the position of OSD."
msgstr "D<>finit la position de l'OSD."
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<69> 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<69> pour indiquer un bon signal."
msgid "OSD update interval [0.1s]"
msgstr "Intervalle de mise <20> jour (0,1s)"
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
msgstr "D<>finit l'intervalle de mise <20> jour de l'OSD. Un petit intervalle g<>n<EFBFBD>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<79> et le bitrates calcul<75>."
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<EFBFBD>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<69> en 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'<27>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 "Video"
msgstr "Vid<69>o"
msgid "Audio"
msgstr "Audio"
msgid "Transponder Information"
msgstr "Information 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 "Stream Information"
msgstr "Information flux"
msgid "Video Stream"
msgstr "Flux vid<69>o"
msgid "Codec"
msgstr ""
msgid "Bitrate"
msgstr "Bitrate"
msgid "Aspect Ratio"
msgstr "Proportions d'image"
msgid "Frame Rate"
msgstr "Rafra<72>chissement"
msgid "Video Format"
msgstr "Standard vid<69>o"
msgid "Resolution"
msgstr "R<>solution"
msgid "Audio Stream"
msgstr "Flux audio"
msgid "Channel Mode"
msgstr ""
msgid "Sampling Frequency"
msgstr "Fr<46>quence d'<27>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 "Fixed"
msgstr "Fixe"
msgid "Analog"
msgstr "Analogique"
msgid "MPEG-2"
msgstr ""
msgid "H.264"
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 "stereo"
msgstr ""
msgid "joint Stereo"
msgstr ""
msgid "dual"
msgstr ""
msgid "mono"
msgstr ""
msgid "interlaced"
msgstr ""
msgid "progressive"
msgstr ""
msgid "reserved"
msgstr "r<>serv<72>"
msgid "extended"
msgstr ""
msgid "unknown"
msgstr "inconnu"
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 "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<71>"
msgid "MHz"
msgstr "MHz"
msgid "free"
msgstr "libre"
msgid "Mbit/s"
msgstr "Mbit/s"
msgid "kbit/s"
msgstr "kbit/s"

374
po/it_IT.po Normal file
View File

@@ -0,0 +1,374 @@
# VDR plugin language source file.
# Copyright (C) 2007 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: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2008-11-10 23:37+0100\n"
"Last-Translator: Diego Pierotto <vdr-italian@tiscali.it>\n"
"Language-Team: <vdr@linuxtv.org>\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 "Mostra info segnale DVB (OSD)"
msgid "Signal Information"
msgstr "Info segnale"
msgid "Femon not available"
msgstr "Femon non disponibile"
msgid "basic"
msgstr "base"
msgid "transponder"
msgstr "transponder"
msgid "stream"
msgstr "flusso"
msgid "AC-3"
msgstr "AC-3"
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 "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 <20> nascosta."
msgid "Default display mode"
msgstr "Modalit<69> visualizz. predefinita"
msgid "Define the default display mode at startup."
msgstr "Definisci la modalit<69> 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 "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<50> piccolo <20> l'intervallo maggiore sar<61> 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 <20> 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<70> grande genera valori pi<70> 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 "Video"
msgstr "Video"
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 "Stream Information"
msgstr "Informazioni flusso"
msgid "Video Stream"
msgstr "Flusso video"
msgid "Codec"
msgstr "Codifica"
msgid "Bitrate"
msgstr "Bitrate"
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<69> canale"
msgid "Sampling Frequency"
msgstr "Frequenza campionamento"
msgid "AC-3 Stream"
msgstr "Flusso AC-3"
msgid "Bit Stream Mode"
msgstr "Modalit<69> bitstream"
msgid "Audio Coding Mode"
msgstr "Modalit<69> codifica audio"
msgid "Center Mix Level"
msgstr "Livello sonoro centrale"
msgid "Surround Mix Level"
msgstr "Livello sonoro surround"
msgid "Dolby Surround Mode"
msgstr "Modalit<69> Dolby Surround"
msgid "Low Frequency Effects"
msgstr "Effetti bassa frequenza"
msgid "Dialogue Normalization"
msgstr "Normalizzazione dialoghi"
msgid "Fixed"
msgstr "Fisso"
msgid "Analog"
msgstr "Analogico"
msgid "MPEG-2"
msgstr "MPEG-2"
msgid "H.264"
msgstr "H.264"
msgid "MPEG-1 Layer I"
msgstr "MPEG-1 Layer I"
msgid "MPEG-1 Layer II"
msgstr "MPEG-1 Layer II"
msgid "MPEG-1 Layer III"
msgstr "MPEG-1 Layer III"
msgid "MPEG-2 Layer I"
msgstr "MPEG-2 Layer I"
msgid "MPEG-2 Layer II"
msgstr "MPEG-2 Layer II"
msgid "MPEG-2 Layer III"
msgstr "MPEG-2 Layer III"
msgid "HE-AAC"
msgstr "HE-AAC"
msgid "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"

373
po/lt_LT.po Normal file
View File

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

373
po/ru_RU.po Normal file
View File

@@ -0,0 +1,373 @@
# VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Vyacheslav Dikonov
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2007-08-12 23:22+0300\n"
"Last-Translator: Vyacheslav Dikonov\n"
"Language-Team: <vdr@linuxtv.org>\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 "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
msgid "Signal Information"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
msgid "Femon not available"
msgstr ""
msgid "basic"
msgstr ""
msgid "transponder"
msgstr ""
msgid "stream"
msgstr ""
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr ""
msgid "Elchi"
msgstr "Elchi"
msgid "ST:TNG"
msgstr "ST:TNG"
msgid "DeepBlue"
msgstr "DeepBlue"
msgid "Moronimo"
msgstr "Moronimo"
msgid "Enigma"
msgstr "Enigma"
msgid "EgalsTry"
msgstr "EgalsTry"
msgid "Duotone"
msgstr "Duotone"
msgid "SilverGreen"
msgstr "SilverGreen"
msgid "Hide main menu entry"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"
msgid "Define whether the main menu entry is hidden."
msgstr ""
msgid "Default display mode"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
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 "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"
msgid "Define the position of OSD."
msgstr ""
msgid "Red limit [%]"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> (%)"
msgid "Define a limit for red bar, which is used to indicate a bad signal."
msgstr ""
msgid "Green limit [%]"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> (%)"
msgid "Define a limit for green bar, which is used to indicate a good signal."
msgstr ""
msgid "OSD update interval [0.1s]"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (0,1 <20><><EFBFBD>)"
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
msgstr ""
msgid "Analyze stream"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
msgstr ""
msgid "Calculation interval [0.1s]"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (0,1 <20><><EFBFBD>)"
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 "Video"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD>"
msgid "Audio"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD>"
msgid "Transponder Information"
msgstr "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
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 "Stream Information"
msgstr ""
msgid "Video Stream"
msgstr ""
msgid "Codec"
msgstr ""
msgid "Bitrate"
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 "Fixed"
msgstr ""
msgid "Analog"
msgstr ""
msgid "MPEG-2"
msgstr ""
msgid "H.264"
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 "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 "<22><>"
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 "<22><><EFBFBD>"
msgid "free"
msgstr ""
msgid "Mbit/s"
msgstr "<22><><EFBFBD><EFBFBD>/<2F>"
msgid "kbit/s"
msgstr "<22><><EFBFBD><EFBFBD>/<2F>"

373
po/zh_CN.po Normal file
View File

@@ -0,0 +1,373 @@
# VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Nan Feng VDR <nfgx@21cn.com>, 2009.2
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2009-09-21 21:36+0800\n"
"Last-Translator: NanFeng <nfgx@21cn.com>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "DVB Signal Information Monitor (OSD)"
msgstr "卫星信号信息显示(OSD)"
msgid "Signal Information"
msgstr "频道信息浏览"
msgid "Femon not available"
msgstr "Femon插件无法使用"
msgid "basic"
msgstr "基本"
msgid "transponder"
msgstr "转发器"
msgid "stream"
msgstr "数据流"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "经典"
msgid "Elchi"
msgstr "Elchi"
msgid "ST:TNG"
msgstr "ST:TNG"
msgid "DeepBlue"
msgstr "DeepBlue"
msgid "Moronimo"
msgstr "Moronimo"
msgid "Enigma"
msgstr "Enigma"
msgid "EgalsTry"
msgstr "EgalsTry"
msgid "Duotone"
msgstr "双色调"
msgid "SilverGreen"
msgstr "银绿"
msgid "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 "Red limit [%]"
msgstr "红限制[ ]"
msgid "Define a limit for red bar, which is used to indicate a bad signal."
msgstr "定义一个限制红键,这是用来表示一个坏的信号."
msgid "Green limit [%]"
msgstr "绿限制[ ]"
msgid "Define a limit for green bar, which is used to indicate a good signal."
msgstr "定义一个限制的绿色键,这是用来表示一个良好的信号."
msgid "OSD update interval [0.1s]"
msgstr "菜单更新间隔时间 [0.1s]"
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
msgstr "确定一个OSD的更新时间间隔.较小的间隔产生较高的CPU负载."
msgid "Analyze stream"
msgstr "分析流"
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
msgstr "确定是否DVB流分析和比特率计算."
msgid "Calculation interval [0.1s]"
msgstr "计算时间间隔 [0.1s]"
msgid "Define an interval for calculation. The bigger interval generates more stable values."
msgstr "定义一个时间间隔来计算.更大的时间价格产生将更稳定."
msgid "Use SVDRP service"
msgstr "使用SVDRP服务"
msgid "Define whether the SVDRP service is used in client/server setups."
msgstr "定义是否SVDRP服务是用来在客户机/服务器的设置."
msgid "SVDRP service port"
msgstr "SVDRP服务端口"
msgid "Define the port number of SVDRP service."
msgstr "定义SVDRP服务的端口号."
msgid "SVDRP service IP"
msgstr "SVDRP服务的IP地址"
msgid "Define the IP address of SVDRP service."
msgstr "定义SVDRP服务的IP地址."
msgid "Help"
msgstr "帮助"
msgid "Video"
msgstr "视频"
msgid "Audio"
msgstr "音频"
msgid "Transponder Information"
msgstr "转发器信息"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "码速率"
msgid "Stream Information"
msgstr "流信息"
msgid "Video Stream"
msgstr "视频流"
msgid "Codec"
msgstr "解码模式"
msgid "Bitrate"
msgstr "比特率"
msgid "Aspect Ratio"
msgstr "纵横比"
msgid "Frame Rate"
msgstr "帧速率"
msgid "Video Format"
msgstr "视频制式"
msgid "Resolution"
msgstr "分辨率"
msgid "Audio Stream"
msgstr "音频流"
msgid "Channel Mode"
msgstr "声道模式"
msgid "Sampling Frequency"
msgstr "采样频率"
msgid "AC-3 Stream"
msgstr "AC-3流"
msgid "Bit Stream Mode"
msgstr "比特流模式"
msgid "Audio Coding Mode"
msgstr "音频编码模式"
msgid "Center Mix Level"
msgstr "中心混合级别"
msgid "Surround Mix Level"
msgstr "环绕混合级别"
msgid "Dolby Surround Mode"
msgstr "杜比环绕声模式"
msgid "Low Frequency Effects"
msgstr "低频效果"
msgid "Dialogue Normalization"
msgstr "对话正常化"
msgid "Fixed"
msgstr "固定"
msgid "Analog"
msgstr "模拟"
msgid "MPEG-2"
msgstr "MPEG-2"
msgid "H.264"
msgstr "H.264"
msgid "MPEG-1 Layer I"
msgstr "MPEG-1 Layer I"
msgid "MPEG-1 Layer II"
msgstr "MPEG-1 Layer II"
msgid "MPEG-1 Layer III"
msgstr "MPEG-1 Layer III"
msgid "MPEG-2 Layer I"
msgstr "MPEG-2 Layer I"
msgid "MPEG-2 Layer II"
msgstr "MPEG-2 Layer II"
msgid "MPEG-2 Layer III"
msgstr "MPEG-2 Layer III"
msgid "HE-AAC"
msgstr "HE-AAC"
msgid "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 "千字节/秒"

373
po/zh_TW.po Normal file
View File

@@ -0,0 +1,373 @@
# VDR plugin language source file.
# Copyright (C) 2007 Rolf Ahrenberg
# This file is distributed under the same license as the femon package.
# Nan Feng VDR <nfgx@21cn.com>, 2009.2
#
msgid ""
msgstr ""
"Project-Id-Version: femon 1.7.3\n"
"Report-Msgid-Bugs-To: Rolf Ahrenberg\n"
"POT-Creation-Date: 2009-08-29 20:57+0300\n"
"PO-Revision-Date: 2009-09-21 21:36+0800\n"
"Last-Translator: NanFeng <nfgx@21cn.com>\n"
"Language-Team: <vdr@linuxtv.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
msgid "DVB Signal Information Monitor (OSD)"
msgstr "衛星信號信息顯示(OSD)"
msgid "Signal Information"
msgstr "頻道信息瀏覽"
msgid "Femon not available"
msgstr "Femon插件無法使用"
msgid "basic"
msgstr "基本"
msgid "transponder"
msgstr "轉發器"
msgid "stream"
msgstr "數據流"
msgid "AC-3"
msgstr "AC-3"
msgid "Classic"
msgstr "經典"
msgid "Elchi"
msgstr "Elchi"
msgid "ST:TNG"
msgstr "ST:TNG"
msgid "DeepBlue"
msgstr "DeepBlue"
msgid "Moronimo"
msgstr "Moronimo"
msgid "Enigma"
msgstr "Enigma"
msgid "EgalsTry"
msgstr "EgalsTry"
msgid "Duotone"
msgstr "雙色調"
msgid "SilverGreen"
msgstr "銀綠"
msgid "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 "Red limit [%]"
msgstr "紅限制[ ]"
msgid "Define a limit for red bar, which is used to indicate a bad signal."
msgstr "定義一個限制紅鍵,這是用來表示一個壞的信號."
msgid "Green limit [%]"
msgstr "綠限制[ ]"
msgid "Define a limit for green bar, which is used to indicate a good signal."
msgstr "定義一個限制的綠色鍵,這是用來表示一個良好的信號."
msgid "OSD update interval [0.1s]"
msgstr "菜單更新間隔時間[0.1s]"
msgid "Define an interval for OSD updates. The smaller interval generates higher CPU load."
msgstr "確定一個OSD的更新時間間隔.較小的間隔產生較高的CPU負載."
msgid "Analyze stream"
msgstr "分析流"
msgid "Define whether the DVB stream is analyzed and bitrates calculated."
msgstr "確定是否DVB流分析和比特率計算."
msgid "Calculation interval [0.1s]"
msgstr "計算時間間隔[0.1s]"
msgid "Define an interval for calculation. The bigger interval generates more stable values."
msgstr "定義一個時間間隔來計算.更大的時間價格產生將更穩定."
msgid "Use SVDRP service"
msgstr "使用SVDRP服務"
msgid "Define whether the SVDRP service is used in client/server setups."
msgstr "定義是否SVDRP服務是用來在客戶機/服務器的設置."
msgid "SVDRP service port"
msgstr "SVDRP服務端口"
msgid "Define the port number of SVDRP service."
msgstr "定義SVDRP服務的端口號."
msgid "SVDRP service IP"
msgstr "SVDRP服務的IP地址"
msgid "Define the IP address of SVDRP service."
msgstr "定義SVDRP服務的IP地址."
msgid "Help"
msgstr "幫助"
msgid "Video"
msgstr "視頻"
msgid "Audio"
msgstr "音頻"
msgid "Transponder Information"
msgstr "轉發器信息"
msgid "Apid"
msgstr "Apid"
msgid "Dpid"
msgstr "Dpid"
msgid "Spid"
msgstr "Spid"
msgid "Nid"
msgstr "Nid"
msgid "Tid"
msgstr "Tid"
msgid "Rid"
msgstr "Rid"
msgid "Coderate"
msgstr "碼速率"
msgid "Stream Information"
msgstr "流信息"
msgid "Video Stream"
msgstr "視頻流"
msgid "Codec"
msgstr "解碼模式"
msgid "Bitrate"
msgstr "比特率"
msgid "Aspect Ratio"
msgstr "縱橫比"
msgid "Frame Rate"
msgstr "幀速率"
msgid "Video Format"
msgstr "視頻制式"
msgid "Resolution"
msgstr "分辨率"
msgid "Audio Stream"
msgstr "音頻流"
msgid "Channel Mode"
msgstr "聲道模式"
msgid "Sampling Frequency"
msgstr "採樣頻率"
msgid "AC-3 Stream"
msgstr "AC-3流"
msgid "Bit Stream Mode"
msgstr "比特流模式"
msgid "Audio Coding Mode"
msgstr "音頻編碼模式"
msgid "Center Mix Level"
msgstr "中心混合級別"
msgid "Surround Mix Level"
msgstr "環繞混合級別"
msgid "Dolby Surround Mode"
msgstr "杜比環繞聲模式"
msgid "Low Frequency Effects"
msgstr "低頻效果"
msgid "Dialogue Normalization"
msgstr "對話正常化"
msgid "Fixed"
msgstr "固定"
msgid "Analog"
msgstr "模擬"
msgid "MPEG-2"
msgstr "MPEG-2"
msgid "H.264"
msgstr "H.264"
msgid "MPEG-1 Layer I"
msgstr "MPEG-1 Layer I"
msgid "MPEG-1 Layer II"
msgstr "MPEG-1 Layer II"
msgid "MPEG-1 Layer III"
msgstr "MPEG-1 Layer III"
msgid "MPEG-2 Layer I"
msgstr "MPEG-2 Layer I"
msgid "MPEG-2 Layer II"
msgstr "MPEG-2 Layer II"
msgid "MPEG-2 Layer III"
msgstr "MPEG-2 Layer III"
msgid "HE-AAC"
msgstr "HE-AAC"
msgid "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 "千字節/秒"

39
svdrpservice.h Normal file
View File

@@ -0,0 +1,39 @@
/*
* svdrpservice.h: Public interface of the plugin's services
*
* See the README file for copyright information and how to reach the author.
*/
#ifndef _SVDRPSERVICE__H
#define _SVDRPSERVICE__H
#include <vdr/tools.h>
class cLine: public cListObject {
private:
char *Line;
public:
const char *Text() { return Line; }
cLine(const char *s) { Line = s ? strdup(s) : NULL; };
virtual ~cLine() { if (Line) free(Line); };
};
struct SvdrpConnection_v1_0 {
// in
cString serverIp;
unsigned short serverPort;
bool shared;
// in+out
int handle;
};
struct SvdrpCommand_v1_0 {
// in
cString command;
int handle;
// out
cList<cLine> reply;
unsigned short responseCode;
};
#endif //_SVDRPSERVICE__H

23
symbols/ar11.xpm Normal file
View File

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

23
symbols/ar169.xpm Normal file
View File

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

23
symbols/ar2211.xpm Normal file
View File

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

23
symbols/ar43.xpm Normal file
View File

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

24
symbols/carrier.xpm Normal file
View File

@@ -0,0 +1,24 @@
/* XPM */
static const char *const carrier_xpm[] = {
"96 19 2 1",
". c #FFFFFF",
"+ c #000000",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++............................................................................................++",
"++............................................................................................++",
"++...........+++++.......+++++.....++++++++....++++++++....+++...++++++++...++++++++..........++",
"++..........+++++++......+++++.....+++++++++...+++++++++...+++...++++++++...+++++++++.........++",
"++..........+++.++++.....+++++.....+++...+++...+++...+++...+++...+++........+++...+++.........++",
"++.........+++...++.....+++.+++....+++...+++...+++...+++...+++...+++........+++...+++.........++",
"++.........+++..........+++.+++....++++++++....++++++++....+++...+++++++....++++++++..........++",
"++.........+++..........+++.+++....+++++++.....+++++++.....+++...+++++++....+++++++...........++",
"++.........+++.........+++...+++...+++..+++....+++..+++....+++...+++........+++..+++..........++",
"++.........+++...++....+++++++++...+++..+++....+++..+++....+++...+++........+++..+++..........++",
"++..........+++.++++...+++++++++...+++...+++...+++...+++...+++...+++........+++...+++.........++",
"++..........+++++++...+++.....+++..+++...+++...+++...+++...+++...++++++++...+++...+++.........++",
"++...........+++++....+++.....+++..+++....+++..+++....+++..+++...++++++++...+++....+++........++",
"++............................................................................................++",
"++............................................................................................++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"};

23
symbols/device.xpm Normal file
View File

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

23
symbols/dolbydigital.xpm Normal file
View File

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

View File

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

View File

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

23
symbols/eight.xpm Normal file
View File

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

23
symbols/encrypted.xpm Normal file
View File

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

23
symbols/five.xpm Normal file
View File

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

23
symbols/format1080.xpm Normal file
View File

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

23
symbols/format480.xpm Normal file
View File

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

23
symbols/format576.xpm Normal file
View File

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

23
symbols/format720.xpm Normal file
View File

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

23
symbols/four.xpm Normal file
View File

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

23
symbols/h264.xpm Normal file
View File

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

24
symbols/lock.xpm Normal file
View File

@@ -0,0 +1,24 @@
/* XPM */
static const char *const lock_xpm[] = {
"96 19 2 1",
". c #FFFFFF",
"+ c #000000",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++............................................................................................++",
"++............................................................................................++",
"++........................+++........+++++........+++++.....+++....+++........................++",
"++........................+++.......++++++++.....+++++++....+++...+++.........................++",
"++........................+++.......+++..+++.....+++.++++...+++..+++..........................++",
"++........................+++......+++....+++...+++...++....+++.+++...........................++",
"++........................+++......+++....+++...+++.........+++++++...........................++",
"++........................+++......+++....+++...+++.........++++.+++..........................++",
"++........................+++......+++....+++...+++.........+++..+++..........................++",
"++........................+++......+++....+++...+++...++....+++...+++.........................++",
"++........................+++.......+++..+++.....+++.++++...+++...+++.........................++",
"++........................+++++++...++++++++.....+++++++....+++....+++........................++",
"++........................+++++++.....++++........+++++.....+++.....+++.......................++",
"++............................................................................................++",
"++............................................................................................++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"};

23
symbols/monoleft.xpm Normal file
View File

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

23
symbols/monoright.xpm Normal file
View File

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

23
symbols/mpeg2.xpm Normal file
View File

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

23
symbols/ntsc.xpm Normal file
View File

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

23
symbols/one.xpm Normal file
View File

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

23
symbols/pal.xpm Normal file
View File

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

23
symbols/seven.xpm Normal file
View File

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

24
symbols/signal.xpm Normal file
View File

@@ -0,0 +1,24 @@
/* XPM */
static const char *const signal_xpm[] = {
"96 19 2 1",
". c #FFFFFF",
"+ c #000000",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++............................................................................................++",
"++............................................................................................++",
"++.................+++++....+++......+++++.....+++....+++.....+++++.....+++...................++",
"++...............++++++++...+++....++++++++....++++...+++.....+++++.....+++...................++",
"++...............+++..+++...+++....+++..++++...+++++..+++.....+++++.....+++...................++",
"++...............+++........+++...+++....++....+++++..+++....+++.+++....+++...................++",
"++...............++++++.....+++...+++..........++++++.+++....+++.+++....+++...................++",
"++................++++++....+++...+++..+++++...+++.++.+++....+++.+++....+++...................++",
"++..................+++++...+++...+++..+++++...+++.++++++...+++...+++...+++...................++",
"++...............+++..+++...+++...+++....+++...+++..+++++...+++++++++...+++...................++",
"++...............+++..+++...+++....+++...+++...+++..+++++...+++++++++...+++...................++",
"++................++++++....+++....+++++++++...+++...++++..+++.....+++..+++++++...............++",
"++.................++++.....+++......+++++.....+++....+++..+++.....+++..+++++++...............++",
"++............................................................................................++",
"++............................................................................................++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"};

23
symbols/six.xpm Normal file
View File

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

23
symbols/stereo.xpm Normal file
View File

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

23
symbols/svdrp.xpm Normal file
View File

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

24
symbols/sync.xpm Normal file
View File

@@ -0,0 +1,24 @@
/* XPM */
static const char *const sync_xpm[] = {
"96 19 2 1",
". c #FFFFFF",
"+ c #000000",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++............................................................................................++",
"++............................................................................................++",
"++.........................+++++...+++.....+++..+++....+++.....+++++..........................++",
"++.......................++++++++...+++...+++...++++...+++....+++++++.........................++",
"++.......................+++..+++....+++.+++....+++++..+++....+++.++++........................++",
"++.......................+++.........+++.+++....+++++..+++...+++...++.........................++",
"++.......................++++++.......+++++.....++++++.+++...+++..............................++",
"++........................++++++......+++++.....+++.++.+++...+++..............................++",
"++..........................+++++......+++......+++.++++++...+++..............................++",
"++.......................+++..+++......+++......+++..+++++...+++...++.........................++",
"++.......................+++..+++......+++......+++..+++++....+++.++++........................++",
"++........................++++++.......+++......+++...++++....+++++++.........................++",
"++.........................++++........+++......+++....+++.....+++++..........................++",
"++............................................................................................++",
"++............................................................................................++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"};

23
symbols/three.xpm Normal file
View File

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

23
symbols/two.xpm Normal file
View File

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

24
symbols/viterbi.xpm Normal file
View File

@@ -0,0 +1,24 @@
/* XPM */
static const char *const viterbi_xpm[] = {
"96 19 2 1",
". c #FFFFFF",
"+ c #000000",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++............................................................................................++",
"++............................................................................................++",
"++............+++.....+++..+++...+++++++++..++++++++...++++++++....++++++++....+++............++",
"++.............++.....++...+++...+++++++++..++++++++...+++++++++...+++++++++...+++............++",
"++.............+++...+++...+++......+++.....+++........+++...+++...+++...+++...+++............++",
"++.............+++...+++...+++......+++.....+++........+++...+++...+++...+++...+++............++",
"++..............++...++....+++......+++.....+++++++....++++++++....++++++++....+++............++",
"++..............+++.+++....+++......+++.....+++++++....+++++++.....++++++++....+++............++",
"++..............+++.+++....+++......+++.....+++........+++..+++....+++...+++...+++............++",
"++...............++.++.....+++......+++.....+++........+++..+++....+++...+++...+++............++",
"++...............+++++.....+++......+++.....+++........+++...+++...+++...+++...+++............++",
"++...............+++++.....+++......+++.....++++++++...+++...+++...+++++++++...+++............++",
"++................+++......+++......+++.....++++++++...+++....+++..++++++++....+++............++",
"++............................................................................................++",
"++............................................................................................++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++",
"++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"};

23
symbols/zero.xpm Normal file
View File

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