mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Version 1.5.10
- Implemented handling DVB subtitles (thanks to Marco Schlüßler, and also to Pekka Virtanen for writing the subtitle plugin, which helped in implementing subtitle handling in VDR). - The new remote control key "Subtitles" can be used to bring up the list of available subtitles. - The new setup option "DVB/Subtitle languages" can be used to define the preferred languages for subtitles. - Fixed selecting the audio track when pressing Ok in the Audio menu (thanks to Marco Schlüßler). - Implemented display of DVB subtitles in live viewing mode. - Implemented subtitle track selection. - Implemented bitmap color reduction and shrinking to display subtitles even on devices that can't display the necessary number of colors. - Added compatibility mode for playback of recordings made with the subtitles plugin (with some help from Rolf Ahrenberg). - The new setup option "DVB/Subtitle offset" can be used to shift the location of the subtitles in the vertical direction. - The new setup options "DVB/Subtitle foreground/background transparency" define an additional level of transparency for the foreground and background color of subtitles. - Existing recordings made with the subtitle plugin can be given an 'X' record in their info.vdr file, so that subtitles can be automatically selected upon replay, according to the preferred language setup, as in X 3 03 ger deutsch (see vdr.5). Note that these entries need to be added in the proper sequence, so that they correspond with the actual track languages in the recording. - Now generating translation files without line numbers to avoid unnecessarily large diffs. Plugin authors may want to replace the -F option with --no-location in the xgettext and msgmerge calls in their Makefiles. - Updated the Finnish OSD texts (thanks to Rolf Ahrenberg). - Added a missing Channels.SetModified(true) call when deleting or moving a channel in the Channels menu (reported by Halim Sahin). - Fixed a missing '-' at the next to last line of SVDRP help texts (reported by Denis Knauf). - Added a missing SetVolumeDevice() call in cDevice::SetPrimaryDevice() (reported by Reinhard Nissl). - Fixed a crash when pressing Left while at the first character of a cMenuEditStrItem (thanks to Christian Wieninger). - Only creating a new cDvbOsdProvider in cDvbDevice::MakePrimaryDevice() if 'On' is true (i.e. this device is being made the primary device). - Updated the Italian OSD texts (thanks to Diego Pierotto). - Fixed handling reallocated memory in cCharSetConv::Convert() (reported by Udo Richter). - Fixed a new[]/delete mismatch in cMenuEditStrItem::LeaveEditMode() (thanks to Udo Richter). - Implemented sending all frames to devices that can handle them in fast forward trick speeds (thanks to Timo Eskola). - Updated the Hungarian language texts (thanks to Thomas Günther). - Fixed description of DeviceSetAvailableTrack() and cReceiver(), and added an example ~cMyReceiver() in PLUGINS.html (thanks to Marco Schlüßler). - Improved the description of where logging goes in the INSTALL file (thanks to Elias Luttinen). - Added a note about how to initiate internationalization support to the README.i18n file. The Makefile generated by the 'newplugin' script now has the 'i18n' target automatically create an initial 'po/pluginname.pot' file. Plugin authors may want to add the '$(I18Npot)' dependency to the 'i18n' target in their Makefiles, as in i18n: $(I18Npot) $(I18Nmo) (based on a suggestion by Torsten Kunkel). - Removed a duplicate ',' from the ca_ES.po file (thanks to Thomas Günther). - Added the 'ß' character to the "allowed characters" in the de_DE.po file (suggested by Thomas Günther). - Made the default copy ctor of cRecording private (thanks to Markus Hahn). Same for the assign operator. - Added cRecording::Undelete() (based on a patch from Markus Hahn). - Added cDevice::CloseFilter() to allow a device to have complete control over both opening and closing section filters (thanks to Rolf Ahrenberg). - Some fixes to PLUGINS.html (thanks to Rolf Ahrenberg).
This commit is contained in:
parent
46c882c04d
commit
dbf38b7c68
41
CONTRIBUTORS
41
CONTRIBUTORS
@ -1024,6 +1024,10 @@ Rolf Ahrenberg <rahrenbe@cc.hut.fi>
|
||||
for improving cControl::Launch() to keep 'control' from pointing to uninitialized
|
||||
memory
|
||||
for adding internationalization to the "skincurses" plugin
|
||||
for helping with adding compatibility mode for playback of recordings made with
|
||||
the subtitles plugin
|
||||
for implementing cDevice::CloseFilter()
|
||||
for some fixes to PLUGINS.html
|
||||
|
||||
Ralf Klueber <ralf.klueber@vodafone.com>
|
||||
for reporting a bug in cutting a recording if there is only a single editing mark
|
||||
@ -1138,6 +1142,7 @@ Reinhard Nissl <rnissl@gmx.de>
|
||||
for fixing a busy loop in fast forward if the next video data file is missing
|
||||
for adding a debug error message to cReceiver::~cReceiver() in case it is still
|
||||
attached to a device
|
||||
for reporting a missing SetVolumeDevice() call in cDevice::SetPrimaryDevice()
|
||||
|
||||
Richard Robson <richard_robson@beeb.net>
|
||||
for reporting freezing replay if a timer starts while in Transfer Mode from the
|
||||
@ -1293,6 +1298,8 @@ Marcus M
|
||||
Pekka Virtanen <pekka.virtanen@sci.fi>
|
||||
for adding language code handling to the subtitling descriptor in 'libsi'
|
||||
for adding missing NULL checks when accessing sectionHandler in device.c
|
||||
for writing the subtitle plugin, which helped in implementing subtitle handling
|
||||
in VDR
|
||||
|
||||
John Kennedy <rkennedy@ix.netcom.com>
|
||||
for publishing "A Fast Bresenham Algorithm For Drawing Ellipses" (found at
|
||||
@ -1419,6 +1426,10 @@ Marco Schl
|
||||
for fixing a problem with characters >0x7F in the modified version of skipspace()
|
||||
for reporting a faulty comment in Make.config.template
|
||||
for fixing checking for ttDolbyLast in cDevice::SetCurrentAudioTrack()
|
||||
for fixing selecting the audio track when pressing Ok in the Audio menu
|
||||
for implementing handling DVB subtitles
|
||||
for fixing the description of DeviceSetAvailableTrack() and cReceiver(), and adding
|
||||
an example ~cMyReceiver() in PLUGINS.html (thanks to Marco Schlüßler).
|
||||
|
||||
Jürgen Schmitz <j.schmitz@web.de>
|
||||
for reporting a bug in displaying the current channel when switching via the SVDRP
|
||||
@ -1522,6 +1533,8 @@ Udo Richter <udo_richter@gmx.de>
|
||||
for fixing handling single byte characters >0x7F in Utf8ToArray()
|
||||
for fixing clearing color buttons in the 'curses' skin
|
||||
for adding a missing error report to cCuttingThread::Action()
|
||||
for reporting a problem in handling reallocated memory in cCharSetConv::Convert()
|
||||
for fixing a new[]/delete mismatch in cMenuEditStrItem::LeaveEditMode()
|
||||
|
||||
Sven Kreiensen <svenk@kammer.uni-hannover.de>
|
||||
for his help in keeping 'channels.conf.terr' up to date
|
||||
@ -1772,6 +1785,9 @@ Thomas G
|
||||
show the current APIVERSION
|
||||
for fixing i18n characters for the Hungarian texts
|
||||
for implementing using nl_langinfo(CODESET) to determine the local codeset to use
|
||||
for removing a duplicate ',' from the ca_ES.po file
|
||||
for suggesting to add the 'ß' character to the "allowed characters" in the
|
||||
de_DE.po file
|
||||
|
||||
David Woodhouse <dwmw2@infradead.org>
|
||||
for his help in replacing the get/put_unaligned() macros from asm/unaligned.h with
|
||||
@ -1878,6 +1894,8 @@ Christian Wieninger <cwieninger@gmx.de>
|
||||
for reporting a problem with the device selection in case of timer conflicts
|
||||
for a patch that fixed part of a crash in i18n character set conversion
|
||||
for reporting a bug in stripping the context in I18nTranslate()
|
||||
for fixing a crash when pressing Left while at the first character of a
|
||||
cMenuEditStrItem
|
||||
|
||||
Thiemo Gehrke <tgehrke@reel-multimedia.com>
|
||||
for suggesting to add a setup option to turn off the automatic timeout of the
|
||||
@ -1949,6 +1967,8 @@ Markus Hahn <mhahn@reel-multimedia.com>
|
||||
for suggesting that the "Back" key should restore the original string when pressed
|
||||
while editing a string item
|
||||
for fixing detection of Premiere NVOD channel links
|
||||
for making the default copy ctor of cRecording private
|
||||
for a patch that was used to implement cRecording::Undelete()
|
||||
|
||||
Jaroslaw Swierczynski <swiergot@gmail.com>
|
||||
for updating the Polish OSD texts and the fontosd-iso8859-2.c file
|
||||
@ -2169,3 +2189,24 @@ Bruno Roussel <bruno.roussel@free.fr>
|
||||
Matthias Becker <becker.matthias@gmail.com>
|
||||
for suggesting to add a new i18n macro that can be used by plugins to mark
|
||||
texts they want to reuse from VDR's core translations
|
||||
|
||||
Halim Sahin <halim.sahin@t-online.de>
|
||||
for reporting that the channels.conf file was not written when stopping VDR after
|
||||
deleting or moving a channel in the Channels menu
|
||||
|
||||
Denis Knauf <denis.knauf@gmail.com>
|
||||
for reporting a missing '-' at the next to last line of SVDRP help texts
|
||||
|
||||
Diego Pierotto <vdr-italian@tiscali.it>
|
||||
for translating OSD texts to the Italian language
|
||||
|
||||
Timo Eskola <timo@tolleri.net>
|
||||
for implementing sending all frames to devices that can handle them in fast forward
|
||||
trick speeds
|
||||
|
||||
Elias Luttinen <el@iki.fi>
|
||||
for improving the description of where logging goes in the INSTALL file
|
||||
|
||||
Torsten Kunkel <vdrml@tkunkel.de>
|
||||
for pointing out that it was not obvious how to initiate internationalization
|
||||
support for a plugin
|
||||
|
71
HISTORY
71
HISTORY
@ -5416,3 +5416,74 @@ Video Disk Recorder Revision History
|
||||
function to hand through the Level.
|
||||
- Fixed checking for ttDolbyLast in cDevice::SetCurrentAudioTrack() (thanks
|
||||
to Marco Schlüßler).
|
||||
|
||||
2007-10-14: Version 1.5.10
|
||||
|
||||
- Implemented handling DVB subtitles (thanks to Marco Schlüßler, and also to
|
||||
Pekka Virtanen for writing the subtitle plugin, which helped in implementing
|
||||
subtitle handling in VDR).
|
||||
- The new remote control key "Subtitles" can be used to bring up the list
|
||||
of available subtitles.
|
||||
- The new setup option "DVB/Subtitle languages" can be used to define the
|
||||
preferred languages for subtitles.
|
||||
- Fixed selecting the audio track when pressing Ok in the Audio menu (thanks
|
||||
to Marco Schlüßler).
|
||||
- Implemented display of DVB subtitles in live viewing mode.
|
||||
- Implemented subtitle track selection.
|
||||
- Implemented bitmap color reduction and shrinking to display subtitles even
|
||||
on devices that can't display the necessary number of colors.
|
||||
- Added compatibility mode for playback of recordings made with the subtitles
|
||||
plugin (with some help from Rolf Ahrenberg).
|
||||
- The new setup option "DVB/Subtitle offset" can be used to shift the location
|
||||
of the subtitles in the vertical direction.
|
||||
- The new setup options "DVB/Subtitle foreground/background transparency"
|
||||
define an additional level of transparency for the foreground and background
|
||||
color of subtitles.
|
||||
- Existing recordings made with the subtitle plugin can be given an 'X' record
|
||||
in their info.vdr file, so that subtitles can be automatically selected upon
|
||||
replay, according to the preferred language setup, as in
|
||||
X 3 03 ger deutsch
|
||||
(see vdr.5). Note that these entries need to be added in the proper sequence,
|
||||
so that they correspond with the actual track languages in the recording.
|
||||
- Now generating translation files without line numbers to avoid unnecessarily
|
||||
large diffs. Plugin authors may want to replace the -F option with
|
||||
--no-location in the xgettext and msgmerge calls in their Makefiles.
|
||||
- Updated the Finnish OSD texts (thanks to Rolf Ahrenberg).
|
||||
- Added a missing Channels.SetModified(true) call when deleting or moving a
|
||||
channel in the Channels menu (reported by Halim Sahin).
|
||||
- Fixed a missing '-' at the next to last line of SVDRP help texts (reported by
|
||||
Denis Knauf).
|
||||
- Added a missing SetVolumeDevice() call in cDevice::SetPrimaryDevice() (reported
|
||||
by Reinhard Nissl).
|
||||
- Fixed a crash when pressing Left while at the first character of a cMenuEditStrItem
|
||||
(thanks to Christian Wieninger).
|
||||
- Only creating a new cDvbOsdProvider in cDvbDevice::MakePrimaryDevice() if 'On'
|
||||
is true (i.e. this device is being made the primary device).
|
||||
- Updated the Italian OSD texts (thanks to Diego Pierotto).
|
||||
- Fixed handling reallocated memory in cCharSetConv::Convert() (reported by Udo
|
||||
Richter).
|
||||
- Fixed a new[]/delete mismatch in cMenuEditStrItem::LeaveEditMode() (thanks to
|
||||
Udo Richter).
|
||||
- Implemented sending all frames to devices that can handle them in fast forward
|
||||
trick speeds (thansk to Timo Eskola).
|
||||
- Updated the Hungarian language texts (thanks to Thomas Günther).
|
||||
- Fixed description of DeviceSetAvailableTrack() and cReceiver(), and added an
|
||||
example ~cMyReceiver() in PLUGINS.html (thanks to Marco Schlüßler).
|
||||
- Improved the description of where logging goes in the INSTALL file (thanks to
|
||||
Elias Luttinen).
|
||||
- Added a note about how to initiate internationalization support to the
|
||||
README.i18n file. The Makefile generated by the 'newplugin' script now has the
|
||||
'i18n' target automatically create an initial 'po/pluginname.pot' file.
|
||||
Plugin authors may want to add the '$(I18Npot)' dependency to the 'i18n'
|
||||
target in their Makefiles, as in
|
||||
i18n: $(I18Npot) $(I18Nmo)
|
||||
(based on a suggestion by Torsten Kunkel).
|
||||
- Removed a duplicate ',' from the ca_ES.po file (thanks to Thomas Günther).
|
||||
- Added the 'ß' character to the "allowed charcaters" in the de_DE.po file
|
||||
(suggested by Thomas Günther).
|
||||
- Made the default copy ctor of cRecording private (thanks to Markus Hahn).
|
||||
Same for the assign operator.
|
||||
- Added cRecording::Undelete() (based on a patch from Markus Hahn).
|
||||
- Added cDevice::CloseFilter() to allow a device to have complete control over
|
||||
both opening and closing section filters (thanks to Rolf Ahrenberg).
|
||||
- Some fixes to PLUGINS.html (thanks to Rolf Ahrenberg).
|
||||
|
5
INSTALL
5
INSTALL
@ -66,8 +66,9 @@ to the 'make' command. Alternatively, you can call VDR with the command
|
||||
line option '--vfat'.
|
||||
|
||||
When running, the 'vdr' program writes status information into the
|
||||
system log file (/var/log/messages). You may want to watch these
|
||||
messages (tail -f /var/log/mesages) to see if there are any problems.
|
||||
system log file, which is usually /var/log/messages (or /var/log/user.log,
|
||||
depending on your syslog configuration). You may want to watch these
|
||||
messages (tail -f /var/log/messages) to see if there are any problems.
|
||||
|
||||
The program can be controlled via a network connection to its SVDRP
|
||||
port ("Simple Video Disk Recorder Protocol"). By default, it listens
|
||||
|
26
MANUAL
26
MANUAL
@ -59,6 +59,7 @@ Version 1.4
|
||||
Mute mute
|
||||
|
||||
Audio select audio track
|
||||
Subtitles select subtitles
|
||||
|
||||
Schedule \
|
||||
Channels |
|
||||
@ -675,6 +676,31 @@ Version 1.4
|
||||
many "Audio language" options which allow you to select the
|
||||
individual preferred languages.
|
||||
|
||||
Display subtitles = no If set to 'yes', the first available subtitles in the list
|
||||
of preferred subtitle languages will be turned on when
|
||||
switching to a channel that provides subtitles.
|
||||
|
||||
Subtitle languages = 0 Some tv stations broadcast various subtitle tracks in different
|
||||
languages. This option allows you to define which language(s)
|
||||
you prefer in such cases. By default, or if none of the
|
||||
preferred languages is broadcast, no subtitles will
|
||||
be selected when switching to such a channel. If this option
|
||||
is set to a non-zero value, the menu page will contain that
|
||||
many "Subtitle language" options which allow you to select the
|
||||
individual preferred languages.
|
||||
|
||||
Subtitle offset = 0 Allows you to shift the location of the subtitles in the
|
||||
vertical direction. The valid range is -50...50. This option
|
||||
is only avialable if "Display subtitles" is set to 'yes'.
|
||||
|
||||
Subtitle foreground transparency = 0
|
||||
Subtitle background transparency = 0
|
||||
These define an additional level of transparency for the
|
||||
foreground and background color of subtitles. Valid ranges
|
||||
are 0...9 for foreground transparency, and 0...10 for
|
||||
background transparency. By default the values as broadcast
|
||||
are used.
|
||||
|
||||
LNB:
|
||||
|
||||
SLOF = 11700 The switching frequency (in MHz) between low and
|
||||
|
8
Makefile
8
Makefile
@ -4,7 +4,7 @@
|
||||
# See the main source file 'vdr.c' for copyright information and
|
||||
# how to reach the author.
|
||||
#
|
||||
# $Id: Makefile 1.106 2007/08/25 08:52:17 kls Exp $
|
||||
# $Id: Makefile 1.108 2007/10/13 09:26:40 kls Exp $
|
||||
|
||||
.DELETE_ON_ERROR:
|
||||
|
||||
@ -37,7 +37,7 @@ DOXYFILE = Doxyfile
|
||||
SILIB = $(LSIDIR)/libsi.a
|
||||
|
||||
OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o dvbci.o dvbosd.o\
|
||||
dvbplayer.o dvbspu.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\
|
||||
dvbplayer.o dvbspu.o dvbsubtitle.o eit.o eitscan.o epg.o filter.o font.o i18n.o interface.o keys.o\
|
||||
lirc.o menu.o menuitems.o nit.o osdbase.o osd.o pat.o player.o plugin.o rcu.o\
|
||||
receiver.o recorder.o recording.o remote.o remux.o ringbuffer.o sdt.o sections.o shutdown.o\
|
||||
skinclassic.o skins.o skinsttng.o sources.o spu.o status.o svdrp.o themes.o thread.o\
|
||||
@ -114,10 +114,10 @@ I18Npot = $(PODIR)/vdr.pot
|
||||
msgfmt -c -o $@ $<
|
||||
|
||||
$(I18Npot): $(wildcard *.c)
|
||||
xgettext -C -cTRANSLATORS --no-wrap -F -k -ktr -ktrNOOP --msgid-bugs-address='<vdr-bugs@cadsoft.de>' -o $@ $(wildcard *.c)
|
||||
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='<vdr-bugs@cadsoft.de>' -o $@ $(wildcard *.c)
|
||||
|
||||
$(I18Npo): $(I18Npot)
|
||||
msgmerge -U --no-wrap -F --backup=none -q $@ $<
|
||||
msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
|
||||
|
||||
i18n: $(I18Nmo)
|
||||
@mkdir -p $(LOCALEDIR)
|
||||
|
54
PLUGINS.html
54
PLUGINS.html
@ -14,18 +14,18 @@ Copyright © 2006 Klaus Schmidinger<br>
|
||||
<a href="http://www.cadsoft.de/vdr">www.cadsoft.de/vdr</a>
|
||||
</center>
|
||||
<p>
|
||||
<!--X1.5.1--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||
Important modifications introduced in version 1.5.1 are marked like this.
|
||||
<!--X1.5.1--></td></tr></table>
|
||||
<!--X1.5.3--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||
<!--X1.5.3--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||
Important modifications introduced in version 1.5.3 are marked like this.
|
||||
<!--X1.5.3--></td></tr></table>
|
||||
<!--X1.5.7--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%>
|
||||
<!--X1.5.7--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||
Important modifications introduced in version 1.5.7 are marked like this.
|
||||
<!--X1.5.7--></td></tr></table>
|
||||
<!--X1.5.8--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
|
||||
<!--X1.5.8--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%>
|
||||
Important modifications introduced in version 1.5.8 are marked like this.
|
||||
<!--X1.5.8--></td></tr></table>
|
||||
<!--X1.5.10--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
|
||||
Important modifications introduced in version 1.5.10 are marked like this.
|
||||
<!--X1.5.10--></td></tr></table>
|
||||
<p>
|
||||
VDR provides an easy to use plugin interface that allows additional functionality
|
||||
to be added to the program by implementing a dynamically loadable library file.
|
||||
@ -64,9 +64,7 @@ structures and allows it to hook itself into specific areas to perform special a
|
||||
<li><a href="#Housekeeping">Housekeeping</a>
|
||||
<li><a href="#Main thread hook">Main thread hook</a>
|
||||
<li><a href="#Activity">Activity</a>
|
||||
<!--X1.5.1--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||
<li><a href="#Wakeup">Wakeup</a>
|
||||
<!--X1.5.1--></td></tr></table>
|
||||
<li><a href="#Setup parameters">Setup parameters</a>
|
||||
<li><a href="#The Setup menu">The Setup menu</a>
|
||||
<li><a href="#Configuration files">Configuration files</a>
|
||||
@ -685,7 +683,6 @@ be queried, and further prompts may show up. If all prompts have been confirmed,
|
||||
the shutdown will take place. As soon as one prompt is not confirmed, no
|
||||
further plugins will be queried and no shutdown will be done.
|
||||
|
||||
<!--X1.5.1--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||
<a name="Wakeup"><hr><h2>Wakeup</h2>
|
||||
|
||||
<center><i><b>Wake me up before you go-go</b></i></center><p>
|
||||
@ -718,7 +715,6 @@ After wakeup, the plugin shall continue to return the wakeup time and shall
|
||||
return a string when <tt>Active()</tt> is called at that time, otherwise VDR may shut down
|
||||
again instantly. If <tt>WakeupTime()</tt> returns a time that is not in
|
||||
the future, the time will be ignored.
|
||||
<!--X1.5.1--></td></tr></table>
|
||||
|
||||
<a name="Setup parameters"><hr><h2>Setup parameters</h2>
|
||||
|
||||
@ -910,7 +906,7 @@ const char *MyConfigDir = cPlugin::ConfigDirectory();
|
||||
|
||||
<center><i><b>Welcome to Babylon!</b></i></center><p>
|
||||
|
||||
<!--X1.5.7--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%>
|
||||
<!--X1.5.7--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||
If a plugin displays texts to the user, it should prepare for internationalization
|
||||
of these texts. All that is necessary for this is to mark every text that is
|
||||
presented to the user as translatable, as in
|
||||
@ -921,7 +917,7 @@ const char *s = tr("Hello world!");
|
||||
|
||||
The text given here must be the English version, and the returned pointer is either
|
||||
a translated version (if available) or the original string.
|
||||
<!--X1.5.8--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
|
||||
<!--X1.5.8--><table width=100%><tr><td bgcolor=#AA0000> </td><td width=100%>
|
||||
Texts are searched for in the domain registered for this plugin.
|
||||
If a plugin wants to make use of texts defined by the core VDR code, it can use
|
||||
the special <tt>trVDR()</tt> macro to mark these texts without having them
|
||||
@ -944,7 +940,7 @@ for (int i = 0; i < 3; i++)
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
<p>
|
||||
<!--X1.5.3--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||
<!--X1.5.3--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||
The system VDR is running on may use a character encoding where a single character
|
||||
(or <i>symbol</i>) consists of more than one byte (UTF-8, as opposed to, for instance,
|
||||
ISO8859-1, where every character is represented by a single byte in memory).
|
||||
@ -1332,7 +1328,9 @@ A player that has special requirements about audio tracks should announce its
|
||||
available audio tracks by calling
|
||||
|
||||
<p><table><tr><td bgcolor=#F0F0F0><pre>
|
||||
bool DeviceSetAvailableTrack(eTrackType Type, int Index, uint16_t Id, const char *Language = NULL, uint32_t Flags = 0)
|
||||
<!--X1.5.10--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
|
||||
bool DeviceSetAvailableTrack(eTrackType Type, int Index, uint16_t Id, const char *Language = NULL, const char *Description = NULL)
|
||||
<!--X1.5.10--></td></tr></table>
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
See <tt>device.h</tt> for details about the parameters for track handling.
|
||||
@ -1458,10 +1456,20 @@ public:
|
||||
};
|
||||
|
||||
cMyReceiver::cMyReceiver(int Pid)
|
||||
:cReceiver(0, -1, Pid)
|
||||
<!--X1.5.10--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
|
||||
:cReceiver(tChannelID(), -1, Pid)
|
||||
<!--X1.5.10--></td></tr></table>
|
||||
{
|
||||
}
|
||||
|
||||
<!--X1.5.10--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%><pre>
|
||||
cMyReceiver::~cMyReceiver()
|
||||
{
|
||||
cReceiver::Detach();
|
||||
...
|
||||
}
|
||||
<!--X1.5.10--></pre></td></tr></table>
|
||||
|
||||
void cMyReceiver::Activate(bool On)
|
||||
{
|
||||
// start your own thread for processing the received data
|
||||
@ -1606,7 +1614,7 @@ with the full required resolution. Only if this fails shall it use alternate
|
||||
areas. Drawing areas are always rectangular and may not overlap (but do not need
|
||||
to be adjacent).
|
||||
<p>
|
||||
<!--X1.5.3--><table width=100%><tr><td bgcolor=#00AA00> </td><td width=100%>
|
||||
<!--X1.5.3--><table width=100%><tr><td bgcolor=#0000AA> </td><td width=100%>
|
||||
Special consideration may have to be given to color usage if the OSD provides
|
||||
8bpp (256 colors). In that case, fonts may be drawn using <i>anti-aliasing</i>,
|
||||
which requires several blended color values between the foreground and background
|
||||
@ -1778,7 +1786,7 @@ selecting which channel it shall tune to:
|
||||
<p><table><tr><td bgcolor=#F0F0F0><pre>
|
||||
virtual bool ProvidesSource(int Source) const;
|
||||
virtual bool ProvidesTransponder(const cChannel *Channel) const;
|
||||
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL);
|
||||
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL) const;
|
||||
virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
@ -1824,6 +1832,9 @@ virtual bool HasDecoder(void) const;
|
||||
virtual bool CanReplay(void) const;
|
||||
virtual bool SetPlayMode(ePlayMode PlayMode);
|
||||
virtual int64_t GetSTC(void);
|
||||
<!--X1.5.10--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
|
||||
virtual bool HasIBPTrickSpeed(void);
|
||||
<!--X1.5.10--></td></tr></table>
|
||||
virtual void TrickSpeed(int Speed);
|
||||
virtual void Clear(void);
|
||||
virtual void Play(void);
|
||||
@ -1838,7 +1849,7 @@ In addition, the following functions may be implemented to provide further
|
||||
functionality:
|
||||
|
||||
<p><table><tr><td bgcolor=#F0F0F0><pre>
|
||||
virtual bool GrabImage(const char *FileName, bool Jpeg = true, int Quality = -1, int Si
|
||||
virtual bool GrabImage(const char *FileName, bool Jpeg = true, int Quality = -1, int SizeX = -1, int SizeY = -1);
|
||||
virtual void SetVideoFormat(bool VideoFormat16_9);
|
||||
virtual void SetVolumeDevice(int Volume);
|
||||
</pre></td></tr></table><p>
|
||||
@ -1847,13 +1858,16 @@ virtual void SetVolumeDevice(int Volume);
|
||||
<b>Section Filtering</b>
|
||||
<p>
|
||||
If your device provides section filtering capabilities it can implement
|
||||
the function
|
||||
the functions
|
||||
|
||||
<p><table><tr><td bgcolor=#F0F0F0><pre>
|
||||
virtual int OpenFilter(u_short Pid, u_char Tid, u_char Mask);
|
||||
<!--X1.5.10--><table width=100%><tr><td bgcolor=#FF0000> </td><td width=100%>
|
||||
virtual void CloseFilter(int Handle);
|
||||
<!--X1.5.10--></td></tr></table>
|
||||
</pre></td></tr></table><p>
|
||||
|
||||
which must open a file handle that delivers section data for the given
|
||||
which must open and close a file handle that delivers section data for the given
|
||||
filter parameters.
|
||||
<p>
|
||||
In order to actually start section handling, the
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 1.18 2007/08/19 14:18:59 kls Exp $
|
||||
# $Id: Makefile 1.20 2007/10/14 09:23:04 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
@ -80,12 +80,12 @@ I18Npot = $(PODIR)/$(PLUGIN).pot
|
||||
msgfmt -c -o $@ $<
|
||||
|
||||
$(I18Npot): $(wildcard *.c)
|
||||
xgettext -C -cTRANSLATORS --no-wrap -F -k -ktr -ktrNOOP --msgid-bugs-address='<vdr-bugs@cadsoft.de>' -o $@ $(wildcard *.c)
|
||||
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='<vdr-bugs@cadsoft.de>' -o $@ $(wildcard *.c)
|
||||
|
||||
$(I18Npo): $(I18Npot)
|
||||
msgmerge -U --no-wrap -F --backup=none -q $@ $<
|
||||
msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
|
||||
|
||||
i18n: $(I18Nmo)
|
||||
i18n: $(I18Npot) $(I18Nmo)
|
||||
@mkdir -p $(LOCALEDIR)
|
||||
for i in $(I18Ndirs); do\
|
||||
mkdir -p $(LOCALEDIR)/$$i/LC_MESSAGES;\
|
||||
|
@ -9,7 +9,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Jordi Vilà <jvila@tinet.org>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -17,26 +17,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Vladimír Bárta <vladimir.barta@k2atmitec.cz>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -15,26 +15,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr "Pøátelský pozdrav"
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr "Ahoj"
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "Èas pozdravu (s)"
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "Pou¾ít alternativní pozdrav"
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr "Ahoj svìte!"
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr "Nazdar vespolek!"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "Ahoj svìte!"
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Mogens Elneff <mogens@elneff.dk>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -15,26 +15,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Klaus Schmidinger <kls@cadsoft.de>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -15,26 +15,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr "Ein freundlicher Gruß"
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr "Hallo"
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "Dauer des Grußes (s)"
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "Alternativen Gruß verwenden"
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr "Hallo Welt!"
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr "Tach zusammen!"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "Hallo Welt!"
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Dimitrios Dimitrakos <mail@dimitrios.de>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -15,26 +15,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-7\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Ruben Nunez Francisco <ruben.nunez@tang-it.com>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -15,26 +15,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Arthur Konovalov <kasjas@hot.ee>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -15,26 +15,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-13\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
@ -10,7 +10,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Rolf Ahrenberg <rahrenbe@cc.hut.fi>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -18,26 +18,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr "Ystävällisin terveisin"
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr "Hei"
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "Tervehdysaika (s)"
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "Käytä vaihtoehtoista tervehdystä"
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr "Hei maailma!"
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr "Mitä kuuluu?"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "Hei maailma!"
|
||||
|
@ -10,7 +10,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Nicolas Huillard <nhuillard@e-dition.fr>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -18,26 +18,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Drazen Dupor <drazen.dupor@dupor.com>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -16,26 +16,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Istvan Koenigsberger <istvnko@hotmail.com>, Guido Josten <guido.josten@t-online.de>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -16,26 +16,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
@ -9,7 +9,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Sean Carlos <seanc@libero.it>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -17,26 +17,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
@ -9,7 +9,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Maarten Wisse <Maarten.Wisse@urz.uni-hd.de>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -17,26 +17,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Truls Slevigen <truls@slevigen.no>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -16,26 +16,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Michael Rakowski <mrak@gmx.de>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -15,26 +15,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Paulo Lopes <pmml@netvita.pt>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -15,26 +15,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Lucian Muresan <lucianm@users.sourceforge.net>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -16,26 +16,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Vyacheslav Dikonov <sdiconov@mail.ru>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -15,26 +15,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-5\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr "´àãÖÕáÚÞÕ ßàØÒÕâáâÒØÕ"
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr "¿àØÒÕâ!"
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr "¿àÞÔÞÛÖØâÕÛìÝÞáâì ßàØÒÕâáâÒØï"
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr "°ÛìâÕàÝÐâØÒÝÞÕ ßàØÒÕâáâÒØÕ"
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr "·ÔàÐÒáâÒãÙ ÜØà!"
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr "ºÐÚ ßÞÖØÒÐÕâÕ?"
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr "·ÔàÐÒáâÒãÙ ÜØà!"
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Matjaz Thaler <matjaz.thaler@guest.arnes.si>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -16,26 +16,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-2\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Tomas Prybil <tomas@prybil.se>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -16,26 +16,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-1\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: VDR 1.5.7\n"
|
||||
"Report-Msgid-Bugs-To: <vdr-bugs@cadsoft.de>\n"
|
||||
"POT-Creation-Date: 2007-08-11 14:35+0200\n"
|
||||
"POT-Creation-Date: 2007-10-13 11:52+0200\n"
|
||||
"PO-Revision-Date: 2007-08-11 12:34+0200\n"
|
||||
"Last-Translator: Oktay Yolgeçen <oktay_73@yahoo.de>\n"
|
||||
"Language-Team: <vdr@linuxtv.org>\n"
|
||||
@ -15,26 +15,20 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-9\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: hello.c:16
|
||||
msgid "A friendly greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:17
|
||||
msgid "Hello"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:60
|
||||
msgid "Greeting time (s)"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:61
|
||||
msgid "Use alternate greeting"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
||||
#: hello.c:129
|
||||
msgid "Howdy folks!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Hello world!"
|
||||
msgstr ""
|
||||
|
@ -57,3 +57,7 @@ VDR Plugin 'skincurses' Revision History
|
||||
- Moved the "all" target in the Makefile before the "Implicit rules",
|
||||
so that a plain "make" will compile everything.
|
||||
- Added internationalization.
|
||||
|
||||
2007-08-26: Version 0.1.4
|
||||
|
||||
- Adapted to the new Level parameter of cOsd.
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Makefile for a Video Disk Recorder plugin
|
||||
#
|
||||
# $Id: Makefile 1.11 2007/08/19 14:19:07 kls Exp $
|
||||
# $Id: Makefile 1.13 2007/10/14 09:23:25 kls Exp $
|
||||
|
||||
# The official name of this plugin.
|
||||
# This name will be used in the '-P...' option of VDR to load the plugin.
|
||||
@ -78,12 +78,12 @@ I18Npot = $(PODIR)/$(PLUGIN).pot
|
||||
msgfmt -c -o $@ $<
|
||||
|
||||
$(I18Npot): $(wildcard *.c)
|
||||
xgettext -C -cTRANSLATORS --no-wrap -F -k -ktr -ktrNOOP --msgid-bugs-address='<vdr-bugs@cadsoft.de>' -o $@ $(wildcard *.c)
|
||||
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='<vdr-bugs@cadsoft.de>' -o $@ $(wildcard *.c)
|
||||
|
||||
$(I18Npo): $(I18Npot)
|
||||
msgmerge -U --no-wrap -F --backup=none -q $@ $<
|
||||
msgmerge -U --no-wrap --no-location --backup=none -q $@ $<
|
||||
|
||||
i18n: $(I18Nmo)
|
||||
i18n: $(I18Npot) $(I18Nmo)
|
||||
@mkdir -p $(LOCALEDIR)
|
||||
for i in $(I18Ndirs); do\
|
||||
mkdir -p $(LOCALEDIR)/$$i/LC_MESSAGES;\
|
||||
|
@ -15,18 +15,14 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: skincurses.c:15
|
||||
msgid "A text only skin"
|
||||
msgstr "Eine reine Text-Oberfläche"
|
||||
|
||||
#: skincurses.c:566
|
||||
msgid "Key$Mute"
|
||||
msgstr "Stumm"
|
||||
|
||||
#: skincurses.c:569
|
||||
msgid "Volume "
|
||||
msgstr "Lautstärke"
|
||||
|
||||
#: skincurses.c:699
|
||||
msgid "Text mode"
|
||||
msgstr "Text-Modus"
|
||||
|
@ -15,18 +15,14 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=ISO-8859-15\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: skincurses.c:15
|
||||
msgid "A text only skin"
|
||||
msgstr "Tekstipohjainen ulkoasu"
|
||||
|
||||
#: skincurses.c:566
|
||||
msgid "Key$Mute"
|
||||
msgstr "Mykistys"
|
||||
|
||||
#: skincurses.c:569
|
||||
msgid "Volume "
|
||||
msgstr "Äänenvoimakkuus "
|
||||
|
||||
#: skincurses.c:699
|
||||
msgid "Text mode"
|
||||
msgstr "Teksti"
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* See the README file for copyright information and how to reach the author.
|
||||
*
|
||||
* $Id: skincurses.c 1.17 2007/08/15 14:01:54 kls Exp $
|
||||
* $Id: skincurses.c 1.18 2007/08/26 20:16:59 kls Exp $
|
||||
*/
|
||||
|
||||
#include <ncurses.h>
|
||||
@ -11,7 +11,7 @@
|
||||
#include <vdr/plugin.h>
|
||||
#include <vdr/skins.h>
|
||||
|
||||
static const char *VERSION = "0.1.3";
|
||||
static const char *VERSION = "0.1.4";
|
||||
static const char *DESCRIPTION = trNOOP("A text only skin");
|
||||
static const char *MAINMENUENTRY = NULL;
|
||||
|
||||
@ -72,7 +72,7 @@ public:
|
||||
};
|
||||
|
||||
cCursesOsd::cCursesOsd(int Left, int Top)
|
||||
:cOsd(Left, Top)
|
||||
:cOsd(Left, Top, 0)
|
||||
{
|
||||
savedRegion = NULL;
|
||||
|
||||
|
18
README.i18n
18
README.i18n
@ -7,6 +7,19 @@ these texts. The instructions apply equally to VDR itself or any
|
||||
plugin.
|
||||
|
||||
|
||||
How to initiate internationalization support
|
||||
--------------------------------------------
|
||||
|
||||
Not every plugin necessarily has texts that are visible to the
|
||||
user, therefore there is by default no 'po' directory.
|
||||
If your plugin source contains texts marked for translation
|
||||
with tr(), you need to
|
||||
|
||||
- Change into the source directory.
|
||||
- Enter the command 'mkdir po'.
|
||||
|
||||
After that, continue with "How to translate to a new language".
|
||||
|
||||
How to translate to a new language
|
||||
----------------------------------
|
||||
|
||||
@ -18,15 +31,16 @@ How to translate to a new language
|
||||
will create a new *.po file for your language.
|
||||
- Edit the new *.po file and translate the texts.
|
||||
You can do this either with your favorite text editor, or
|
||||
with a specialited tool like POEdit, GTranslator, KBabel
|
||||
with a specialized tool like POEdit, GTranslator, KBabel
|
||||
or whatever you have.
|
||||
|
||||
How to maintain an existing language file
|
||||
-----------------------------------------
|
||||
|
||||
- Change into the source directory.
|
||||
- Do a 'make i18n' to have the *.po files brought up-to-date
|
||||
with the texts in the source code.
|
||||
- Edit the new *.po file and translate the texts.
|
||||
- Edit the modified *.po file(s) and translate the texts.
|
||||
If you are using a plain text editor, you should search for
|
||||
empty strings ("") to find new, untranslated texts. Also,
|
||||
look for the "fuzzy" keyword to find translations that have
|
||||
|
22
channels.c
22
channels.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: channels.c 1.54 2007/07/21 14:55:01 kls Exp $
|
||||
* $Id: channels.c 1.55 2007/10/12 14:40:53 kls Exp $
|
||||
*/
|
||||
|
||||
#include "channels.h"
|
||||
@ -440,12 +440,12 @@ static int IntArrayToString(char *s, const int *a, int Base = 10, const char n[]
|
||||
return q - s;
|
||||
}
|
||||
|
||||
void cChannel::SetPids(int Vpid, int Ppid, int *Apids, char ALangs[][MAXLANGCODE2], int *Dpids, char DLangs[][MAXLANGCODE2], int Tpid)
|
||||
void cChannel::SetPids(int Vpid, int Ppid, int *Apids, char ALangs[][MAXLANGCODE2], int *Dpids, char DLangs[][MAXLANGCODE2], int *Spids, char SLangs[][MAXLANGCODE2], int Tpid)
|
||||
{
|
||||
int mod = CHANNELMOD_NONE;
|
||||
if (vpid != Vpid || ppid != Ppid || tpid != Tpid)
|
||||
mod |= CHANNELMOD_PIDS;
|
||||
int m = IntArraysDiffer(apids, Apids, alangs, ALangs) | IntArraysDiffer(dpids, Dpids, dlangs, DLangs);
|
||||
int m = IntArraysDiffer(apids, Apids, alangs, ALangs) | IntArraysDiffer(dpids, Dpids, dlangs, DLangs) | IntArraysDiffer(spids, Spids, slangs, SLangs);
|
||||
if (m & STRDIFF)
|
||||
mod |= CHANNELMOD_LANGS;
|
||||
if (m & VALDIFF)
|
||||
@ -468,7 +468,16 @@ void cChannel::SetPids(int Vpid, int Ppid, int *Apids, char ALangs[][MAXLANGCODE
|
||||
q += IntArrayToString(q, Dpids, 10, DLangs);
|
||||
}
|
||||
*q = 0;
|
||||
dsyslog("changing pids of channel %d from %d+%d:%s:%d to %d+%d:%s:%d", Number(), vpid, ppid, OldApidsBuf, tpid, Vpid, Ppid, NewApidsBuf, Tpid);
|
||||
const int SBufferSize = MAXSPIDS * (5 + 1 + MAXLANGCODE2) + 10; // 5 digits plus delimiting ',' or ';' plus optional '=cod', +10: paranoia
|
||||
char OldSpidsBuf[SBufferSize];
|
||||
char NewSpidsBuf[SBufferSize];
|
||||
q = OldSpidsBuf;
|
||||
q += IntArrayToString(q, spids, 10, slangs);
|
||||
*q = 0;
|
||||
q = NewSpidsBuf;
|
||||
q += IntArrayToString(q, Spids, 10, SLangs);
|
||||
*q = 0;
|
||||
dsyslog("changing pids of channel %d from %d+%d:%s:%s:%d to %d+%d:%s:%s:%d", Number(), vpid, ppid, OldApidsBuf, OldSpidsBuf, tpid, Vpid, Ppid, NewApidsBuf, NewSpidsBuf, Tpid);
|
||||
vpid = Vpid;
|
||||
ppid = Ppid;
|
||||
for (int i = 0; i < MAXAPIDS; i++) {
|
||||
@ -481,6 +490,11 @@ void cChannel::SetPids(int Vpid, int Ppid, int *Apids, char ALangs[][MAXLANGCODE
|
||||
strn0cpy(dlangs[i], DLangs[i], MAXLANGCODE2);
|
||||
}
|
||||
dpids[MAXDPIDS] = 0;
|
||||
for (int i = 0; i < MAXSPIDS; i++) {
|
||||
spids[i] = Spids[i];
|
||||
strn0cpy(slangs[i], SLangs[i], MAXLANGCODE2);
|
||||
}
|
||||
spids[MAXSPIDS] = 0;
|
||||
tpid = Tpid;
|
||||
modification |= mod;
|
||||
Channels.SetModified();
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: channels.h 1.44 2007/07/21 14:58:36 kls Exp $
|
||||
* $Id: channels.h 1.45 2007/09/02 10:23:11 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __CHANNELS_H
|
||||
@ -33,7 +33,7 @@
|
||||
|
||||
#define MAXAPIDS 32 // audio
|
||||
#define MAXDPIDS 16 // dolby (AC3 + DTS)
|
||||
#define MAXSPIDS 8 // subtitles
|
||||
#define MAXSPIDS 32 // subtitles
|
||||
#define MAXCAIDS 8 // conditional access
|
||||
|
||||
#define MAXLANGCODE1 4 // a 3 letter language code, zero terminated
|
||||
@ -212,7 +212,7 @@ public:
|
||||
void SetId(int Nid, int Tid, int Sid, int Rid = 0);
|
||||
void SetName(const char *Name, const char *ShortName, const char *Provider);
|
||||
void SetPortalName(const char *PortalName);
|
||||
void SetPids(int Vpid, int Ppid, int *Apids, char ALangs[][MAXLANGCODE2], int *Dpids, char DLangs[][MAXLANGCODE2], int Tpid);
|
||||
void SetPids(int Vpid, int Ppid, int *Apids, char ALangs[][MAXLANGCODE2], int *Dpids, char DLangs[][MAXLANGCODE2], int *Spids, char SLangs[][MAXLANGCODE2], int Tpid);
|
||||
void SetCaIds(const int *CaIds); // list must be zero-terminated
|
||||
void SetCaDescriptors(int Level);
|
||||
void SetLinkChannels(cLinkChannels *LinkChannels);
|
||||
|
17
config.c
17
config.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: config.c 1.156 2007/08/12 12:09:37 kls Exp $
|
||||
* $Id: config.c 1.157 2007/10/06 14:28:58 kls Exp $
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
@ -236,6 +236,11 @@ cSetup::cSetup(void)
|
||||
MarginStart = 2;
|
||||
MarginStop = 10;
|
||||
AudioLanguages[0] = -1;
|
||||
DisplaySubtitles = 0;
|
||||
SubtitleLanguages[0] = -1;
|
||||
SubtitleOffset = 0;
|
||||
SubtitleFgTransparency = 0;
|
||||
SubtitleBgTransparency = 0;
|
||||
EPGLanguages[0] = -1;
|
||||
EPGScanTimeout = 5;
|
||||
EPGBugfixLevel = 3;
|
||||
@ -406,6 +411,11 @@ bool cSetup::Parse(const char *Name, const char *Value)
|
||||
else if (!strcasecmp(Name, "MarginStart")) MarginStart = atoi(Value);
|
||||
else if (!strcasecmp(Name, "MarginStop")) MarginStop = atoi(Value);
|
||||
else if (!strcasecmp(Name, "AudioLanguages")) return ParseLanguages(Value, AudioLanguages);
|
||||
else if (!strcasecmp(Name, "DisplaySubtitles")) DisplaySubtitles = atoi(Value);
|
||||
else if (!strcasecmp(Name, "SubtitleLanguages")) return ParseLanguages(Value, SubtitleLanguages);
|
||||
else if (!strcasecmp(Name, "SubtitleOffset")) SubtitleOffset = atoi(Value);
|
||||
else if (!strcasecmp(Name, "SubtitleFgTransparency")) SubtitleFgTransparency = atoi(Value);
|
||||
else if (!strcasecmp(Name, "SubtitleBgTransparency")) SubtitleBgTransparency = atoi(Value);
|
||||
else if (!strcasecmp(Name, "EPGLanguages")) return ParseLanguages(Value, EPGLanguages);
|
||||
else if (!strcasecmp(Name, "EPGScanTimeout")) EPGScanTimeout = atoi(Value);
|
||||
else if (!strcasecmp(Name, "EPGBugfixLevel")) EPGBugfixLevel = atoi(Value);
|
||||
@ -483,6 +493,11 @@ bool cSetup::Save(void)
|
||||
Store("MarginStart", MarginStart);
|
||||
Store("MarginStop", MarginStop);
|
||||
StoreLanguages("AudioLanguages", AudioLanguages);
|
||||
Store("DisplaySubtitles", DisplaySubtitles);
|
||||
StoreLanguages("SubtitleLanguages", SubtitleLanguages);
|
||||
Store("SubtitleOffset", SubtitleOffset);
|
||||
Store("SubtitleFgTransparency", SubtitleFgTransparency);
|
||||
Store("SubtitleBgTransparency", SubtitleBgTransparency);
|
||||
StoreLanguages("EPGLanguages", EPGLanguages);
|
||||
Store("EPGScanTimeout", EPGScanTimeout);
|
||||
Store("EPGBugfixLevel", EPGBugfixLevel);
|
||||
|
14
config.h
14
config.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: config.h 1.298 2007/08/19 16:02:50 kls Exp $
|
||||
* $Id: config.h 1.299 2007/10/06 14:27:18 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __CONFIG_H
|
||||
@ -22,13 +22,13 @@
|
||||
|
||||
// VDR's own version number:
|
||||
|
||||
#define VDRVERSION "1.5.9"
|
||||
#define VDRVERSNUM 10509 // Version * 10000 + Major * 100 + Minor
|
||||
#define VDRVERSION "1.5.10"
|
||||
#define VDRVERSNUM 10510 // Version * 10000 + Major * 100 + Minor
|
||||
|
||||
// The plugin API's version number:
|
||||
|
||||
#define APIVERSION "1.5.9"
|
||||
#define APIVERSNUM 10509 // Version * 10000 + Major * 100 + Minor
|
||||
#define APIVERSION "1.5.10"
|
||||
#define APIVERSNUM 10510 // Version * 10000 + Major * 100 + Minor
|
||||
|
||||
// When loading plugins, VDR searches them by their APIVERSION, which
|
||||
// may be smaller than VDRVERSION in case there have been no changes to
|
||||
@ -220,6 +220,10 @@ public:
|
||||
int TimeTransponder;
|
||||
int MarginStart, MarginStop;
|
||||
int AudioLanguages[I18N_MAX_LANGUAGES + 1];
|
||||
int DisplaySubtitles;
|
||||
int SubtitleLanguages[I18N_MAX_LANGUAGES + 1];
|
||||
int SubtitleOffset;
|
||||
int SubtitleFgTransparency, SubtitleBgTransparency;
|
||||
int EPGLanguages[I18N_MAX_LANGUAGES + 1];
|
||||
int EPGScanTimeout;
|
||||
int EPGBugfixLevel;
|
||||
|
178
device.c
178
device.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: device.c 1.142 2007/08/26 11:11:42 kls Exp $
|
||||
* $Id: device.c 1.145 2007/10/14 13:09:19 kls Exp $
|
||||
*/
|
||||
|
||||
#include "device.h"
|
||||
@ -19,6 +19,75 @@
|
||||
#include "status.h"
|
||||
#include "transfer.h"
|
||||
|
||||
// --- cLiveSubtitle ---------------------------------------------------------
|
||||
|
||||
#define LIVESUBTITLEBUFSIZE KILOBYTE(100)
|
||||
|
||||
class cLiveSubtitle : public cReceiver, public cThread {
|
||||
private:
|
||||
cRingBufferLinear *ringBuffer;
|
||||
cRemux *remux;
|
||||
protected:
|
||||
virtual void Activate(bool On);
|
||||
virtual void Receive(uchar *Data, int Length);
|
||||
virtual void Action(void);
|
||||
public:
|
||||
cLiveSubtitle(int SPid);
|
||||
virtual ~cLiveSubtitle();
|
||||
};
|
||||
|
||||
cLiveSubtitle::cLiveSubtitle(int SPid)
|
||||
:cReceiver(tChannelID(), -1, SPid)
|
||||
,cThread("live subtitle")
|
||||
{
|
||||
ringBuffer = new cRingBufferLinear(LIVESUBTITLEBUFSIZE, TS_SIZE * 2, true, "Live Subtitle");
|
||||
int NoPids = 0;
|
||||
int SPids[] = { SPid, 0 };
|
||||
remux = new cRemux(0, &NoPids, &NoPids, SPids);
|
||||
}
|
||||
|
||||
cLiveSubtitle::~cLiveSubtitle()
|
||||
{
|
||||
cReceiver::Detach();
|
||||
delete remux;
|
||||
delete ringBuffer;
|
||||
}
|
||||
|
||||
void cLiveSubtitle::Activate(bool On)
|
||||
{
|
||||
if (On)
|
||||
Start();
|
||||
else
|
||||
Cancel(3);
|
||||
}
|
||||
|
||||
void cLiveSubtitle::Receive(uchar *Data, int Length)
|
||||
{
|
||||
if (Running()) {
|
||||
int p = ringBuffer->Put(Data, Length);
|
||||
if (p != Length && Running())
|
||||
ringBuffer->ReportOverflow(Length - p);
|
||||
}
|
||||
}
|
||||
|
||||
void cLiveSubtitle::Action(void)
|
||||
{
|
||||
while (Running()) {
|
||||
int Count;
|
||||
uchar *b = ringBuffer->Get(Count);
|
||||
if (b) {
|
||||
Count = remux->Put(b, Count);
|
||||
if (Count)
|
||||
ringBuffer->Del(Count);
|
||||
}
|
||||
b = remux->Get(Count);
|
||||
if (b) {
|
||||
Count = cDevice::PrimaryDevice()->PlaySubtitle(b, Count);
|
||||
remux->Del(Count);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// --- cPesAssembler ---------------------------------------------------------
|
||||
|
||||
class cPesAssembler {
|
||||
@ -172,6 +241,10 @@ cDevice::cDevice(void)
|
||||
ClrAvailableTracks();
|
||||
currentAudioTrack = ttNone;
|
||||
currentAudioTrackMissingCount = 0;
|
||||
currentSubtitleTrack = ttNone;
|
||||
liveSubtitle = NULL;
|
||||
dvbSubtitleConverter = NULL;
|
||||
autoSelectPreferredSubtitleLanguage = true;
|
||||
|
||||
for (int i = 0; i < MAXRECEIVERS; i++)
|
||||
receiver[i] = NULL;
|
||||
@ -186,6 +259,8 @@ cDevice::~cDevice()
|
||||
{
|
||||
Detach(player);
|
||||
DetachAllReceivers();
|
||||
delete liveSubtitle;
|
||||
delete dvbSubtitleConverter;
|
||||
delete nitFilter;
|
||||
delete sdtFilter;
|
||||
delete patFilter;
|
||||
@ -251,6 +326,7 @@ bool cDevice::SetPrimaryDevice(int n)
|
||||
primaryDevice = device[n];
|
||||
primaryDevice->MakePrimaryDevice(true);
|
||||
primaryDevice->SetVideoFormat(Setup.VideoFormat);
|
||||
primaryDevice->SetVolumeDevice(Setup.CurrentVolume);
|
||||
return true;
|
||||
}
|
||||
esyslog("ERROR: invalid primary device number: %d", n + 1);
|
||||
@ -576,6 +652,11 @@ int cDevice::OpenFilter(u_short Pid, u_char Tid, u_char Mask)
|
||||
return -1;
|
||||
}
|
||||
|
||||
void cDevice::CloseFilter(int Handle)
|
||||
{
|
||||
close(Handle);
|
||||
}
|
||||
|
||||
void cDevice::AttachFilter(cFilter *Filter)
|
||||
{
|
||||
if (sectionHandler)
|
||||
@ -674,8 +755,11 @@ bool cDevice::SwitchChannel(int Direction)
|
||||
|
||||
eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
|
||||
{
|
||||
if (LiveView)
|
||||
if (LiveView) {
|
||||
StopReplay();
|
||||
DELETENULL(liveSubtitle);
|
||||
DELETENULL(dvbSubtitleConverter);
|
||||
}
|
||||
|
||||
cDevice *Device = (LiveView && IsPrimaryDevice()) ? GetDevice(Channel, 0, LiveView) : this;
|
||||
|
||||
@ -735,8 +819,11 @@ eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
|
||||
for (int i = 0; i < MAXDPIDS; i++)
|
||||
SetAvailableTrack(ttDolby, i, Channel->Dpid(i), Channel->Dlang(i));
|
||||
}
|
||||
for (int i = 0; i < MAXSPIDS; i++)
|
||||
SetAvailableTrack(ttSubtitle, i, Channel->Spid(i), Channel->Slang(i));
|
||||
if (!NeedsTransferMode)
|
||||
EnsureAudioTrack(true);
|
||||
EnsureSubtitleTrack();
|
||||
}
|
||||
cStatus::MsgChannelSwitch(this, Channel->Number()); // only report status if channel switch successfull
|
||||
}
|
||||
@ -848,6 +935,7 @@ void cDevice::ClrAvailableTracks(bool DescriptionsOnly, bool IdsOnly)
|
||||
SetAudioChannel(0); // fall back to stereo
|
||||
currentAudioTrackMissingCount = 0;
|
||||
currentAudioTrack = ttNone;
|
||||
currentSubtitleTrack = ttNone;
|
||||
}
|
||||
}
|
||||
|
||||
@ -855,19 +943,24 @@ bool cDevice::SetAvailableTrack(eTrackType Type, int Index, uint16_t Id, const c
|
||||
{
|
||||
eTrackType t = eTrackType(Type + Index);
|
||||
if (Type == ttAudio && IS_AUDIO_TRACK(t) ||
|
||||
Type == ttDolby && IS_DOLBY_TRACK(t)) {
|
||||
Type == ttDolby && IS_DOLBY_TRACK(t) ||
|
||||
Type == ttSubtitle && IS_SUBTITLE_TRACK(t)) {
|
||||
if (Language)
|
||||
strn0cpy(availableTracks[t].language, Language, sizeof(availableTracks[t].language));
|
||||
if (Description)
|
||||
Utf8Strn0Cpy(availableTracks[t].description, Description, sizeof(availableTracks[t].description));
|
||||
if (Id) {
|
||||
availableTracks[t].id = Id; // setting 'id' last to avoid the need for extensive locking
|
||||
if (Type == ttAudio || Type == ttDolby) {
|
||||
int numAudioTracks = NumAudioTracks();
|
||||
if (!availableTracks[currentAudioTrack].id && numAudioTracks && currentAudioTrackMissingCount++ > numAudioTracks * 10)
|
||||
EnsureAudioTrack();
|
||||
else if (t == currentAudioTrack)
|
||||
currentAudioTrackMissingCount = 0;
|
||||
}
|
||||
else if (Type == ttSubtitle && autoSelectPreferredSubtitleLanguage)
|
||||
EnsureSubtitleTrack();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else
|
||||
@ -880,16 +973,26 @@ const tTrackId *cDevice::GetTrack(eTrackType Type)
|
||||
return (ttNone < Type && Type < ttMaxTrackTypes) ? &availableTracks[Type] : NULL;
|
||||
}
|
||||
|
||||
int cDevice::NumAudioTracks(void) const
|
||||
int cDevice::NumTracks(eTrackType FirstTrack, eTrackType LastTrack) const
|
||||
{
|
||||
int n = 0;
|
||||
for (int i = ttAudioFirst; i <= ttDolbyLast; i++) {
|
||||
for (int i = FirstTrack; i <= LastTrack; i++) {
|
||||
if (availableTracks[i].id)
|
||||
n++;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
int cDevice::NumAudioTracks(void) const
|
||||
{
|
||||
return NumTracks(ttAudioFirst, ttDolbyLast);
|
||||
}
|
||||
|
||||
int cDevice::NumSubtitleTracks(void) const
|
||||
{
|
||||
return NumTracks(ttSubtitleFirst, ttSubtitleLast);
|
||||
}
|
||||
|
||||
bool cDevice::SetCurrentAudioTrack(eTrackType Type)
|
||||
{
|
||||
if (ttNone < Type && Type <= ttDolbyLast) {
|
||||
@ -908,6 +1011,30 @@ bool cDevice::SetCurrentAudioTrack(eTrackType Type)
|
||||
return false;
|
||||
}
|
||||
|
||||
bool cDevice::SetCurrentSubtitleTrack(eTrackType Type, bool Manual)
|
||||
{
|
||||
if (Type == ttNone || IS_SUBTITLE_TRACK(Type)) {
|
||||
currentSubtitleTrack = Type;
|
||||
autoSelectPreferredSubtitleLanguage = !Manual;
|
||||
if (dvbSubtitleConverter)
|
||||
dvbSubtitleConverter->Reset();
|
||||
if (Type == ttNone && dvbSubtitleConverter) {
|
||||
cMutexLock MutexLock(&mutexCurrentSubtitleTrack);
|
||||
DELETENULL(dvbSubtitleConverter);
|
||||
}
|
||||
DELETENULL(liveSubtitle);
|
||||
if (currentSubtitleTrack != ttNone && !Replaying() && !Transferring()) {
|
||||
const tTrackId *TrackId = GetTrack(currentSubtitleTrack);
|
||||
if (TrackId && TrackId->id) {
|
||||
liveSubtitle = new cLiveSubtitle(TrackId->id);
|
||||
AttachReceiver(liveSubtitle);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void cDevice::EnsureAudioTrack(bool Force)
|
||||
{
|
||||
if (Force || !availableTracks[currentAudioTrack].id) {
|
||||
@ -939,6 +1066,25 @@ void cDevice::EnsureAudioTrack(bool Force)
|
||||
}
|
||||
}
|
||||
|
||||
void cDevice::EnsureSubtitleTrack(void)
|
||||
{
|
||||
if (Setup.DisplaySubtitles) {
|
||||
eTrackType PreferredTrack = ttSubtitleFirst;
|
||||
int LanguagePreference = -1;
|
||||
for (int i = ttSubtitleFirst; i <= ttSubtitleLast; i++) {
|
||||
const tTrackId *TrackId = GetTrack(eTrackType(i));
|
||||
if (TrackId && TrackId->id && I18nIsPreferredLanguage(Setup.SubtitleLanguages, TrackId->language, LanguagePreference))
|
||||
PreferredTrack = eTrackType(i);
|
||||
}
|
||||
// Make sure we're set to an available subtitle track:
|
||||
const tTrackId *Track = GetTrack(GetCurrentSubtitleTrack());
|
||||
if (!Track || !Track->id || PreferredTrack != GetCurrentSubtitleTrack())
|
||||
SetCurrentSubtitleTrack(PreferredTrack);
|
||||
}
|
||||
else
|
||||
SetCurrentSubtitleTrack(ttNone);
|
||||
}
|
||||
|
||||
bool cDevice::CanReplay(void) const
|
||||
{
|
||||
return HasDecoder();
|
||||
@ -961,6 +1107,8 @@ void cDevice::TrickSpeed(int Speed)
|
||||
void cDevice::Clear(void)
|
||||
{
|
||||
Audios.ClearAudio();
|
||||
if (dvbSubtitleConverter)
|
||||
dvbSubtitleConverter->Reset();
|
||||
}
|
||||
|
||||
void cDevice::Play(void)
|
||||
@ -1016,6 +1164,9 @@ void cDevice::Detach(cPlayer *Player)
|
||||
player = NULL; // avoids recursive calls to Detach()
|
||||
p->Activate(false);
|
||||
p->device = NULL;
|
||||
cMutexLock MutexLock(&mutexCurrentSubtitleTrack);
|
||||
delete dvbSubtitleConverter;
|
||||
dvbSubtitleConverter = NULL;
|
||||
SetPlayMode(pmNone);
|
||||
SetVideoDisplayFormat(eVideoDisplayFormat(Setup.VideoDisplayFormat));
|
||||
Audios.ClearAudio();
|
||||
@ -1051,6 +1202,13 @@ int cDevice::PlayAudio(const uchar *Data, int Length, uchar Id)
|
||||
return -1;
|
||||
}
|
||||
|
||||
int cDevice::PlaySubtitle(const uchar *Data, int Length)
|
||||
{
|
||||
if (!dvbSubtitleConverter)
|
||||
dvbSubtitleConverter = new cDvbSubtitleConverter;
|
||||
return dvbSubtitleConverter->Convert(Data, Length);
|
||||
}
|
||||
|
||||
int cDevice::PlayPesPacket(const uchar *Data, int Length, bool VideoOnly)
|
||||
{
|
||||
cMutexLock MutexLock(&mutexCurrentAudioTrack);
|
||||
@ -1076,6 +1234,11 @@ int cDevice::PlayPesPacket(const uchar *Data, int Length, bool VideoOnly)
|
||||
break;
|
||||
case 0xBD: { // private stream 1
|
||||
int PayloadOffset = Data[8] + 9;
|
||||
|
||||
// Compatibility mode for old subtitles plugin:
|
||||
if ((Data[PayloadOffset - 3] & 0x81) == 1 && Data[PayloadOffset - 2] == 0x81)
|
||||
PayloadOffset--;
|
||||
|
||||
uchar SubStreamId = Data[PayloadOffset];
|
||||
uchar SubStreamType = SubStreamId & 0xF0;
|
||||
uchar SubStreamIndex = SubStreamId & 0x1F;
|
||||
@ -1090,6 +1253,9 @@ pre_1_3_19_PrivateStreamDeteced:
|
||||
switch (SubStreamType) {
|
||||
case 0x20: // SPU
|
||||
case 0x30: // SPU
|
||||
SetAvailableTrack(ttSubtitle, SubStreamIndex, SubStreamId);
|
||||
if (!VideoOnly && currentSubtitleTrack != ttNone && SubStreamId == availableTracks[currentSubtitleTrack].id)
|
||||
w = PlaySubtitle(Start, d);
|
||||
break;
|
||||
case 0x80: // AC3 & DTS
|
||||
if (Setup.UseDolbyDigital) {
|
||||
@ -1139,6 +1305,8 @@ int cDevice::PlayPes(const uchar *Data, int Length, bool VideoOnly)
|
||||
{
|
||||
if (!Data) {
|
||||
pesAssembler->Reset();
|
||||
if (dvbSubtitleConverter)
|
||||
dvbSubtitleConverter->Reset();
|
||||
return 0;
|
||||
}
|
||||
int Result = 0;
|
||||
|
46
device.h
46
device.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: device.h 1.82 2007/07/22 11:20:13 kls Exp $
|
||||
* $Id: device.h 1.85 2007/10/14 13:09:12 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __DEVICE_H
|
||||
@ -12,6 +12,7 @@
|
||||
|
||||
#include "channels.h"
|
||||
#include "ci.h"
|
||||
#include "dvbsubtitle.h"
|
||||
#include "eit.h"
|
||||
#include "filter.h"
|
||||
#include "nit.h"
|
||||
@ -70,16 +71,15 @@ enum eTrackType { ttNone,
|
||||
ttDolby,
|
||||
ttDolbyFirst = ttDolby,
|
||||
ttDolbyLast = ttDolbyFirst + 15, // MAXDPIDS - 1
|
||||
/* future...
|
||||
ttSubtitle,
|
||||
ttSubtitleFirst = ttSubtitle,
|
||||
ttSubtitleLast = ttSubtitleFirst + 7, // MAXSPIDS - 1
|
||||
*/
|
||||
ttSubtitleLast = ttSubtitleFirst + 31, // MAXSPIDS - 1
|
||||
ttMaxTrackTypes
|
||||
};
|
||||
|
||||
#define IS_AUDIO_TRACK(t) (ttAudioFirst <= (t) && (t) <= ttAudioLast)
|
||||
#define IS_DOLBY_TRACK(t) (ttDolbyFirst <= (t) && (t) <= ttDolbyLast)
|
||||
#define IS_SUBTITLE_TRACK(t) (ttSubtitleFirst <= (t) && (t) <= ttSubtitleLast)
|
||||
|
||||
struct tTrackId {
|
||||
uint16_t id; // The PES packet id or the PID.
|
||||
@ -90,10 +90,12 @@ struct tTrackId {
|
||||
class cPlayer;
|
||||
class cReceiver;
|
||||
class cPesAssembler;
|
||||
class cLiveSubtitle;
|
||||
|
||||
/// The cDevice class is the base from which actual devices can be derived.
|
||||
|
||||
class cDevice : public cThread {
|
||||
friend class cLiveSubtitle;
|
||||
private:
|
||||
static int numDevices;
|
||||
static int useDevice;
|
||||
@ -185,6 +187,9 @@ public:
|
||||
|
||||
// SPU facilities
|
||||
|
||||
private:
|
||||
cLiveSubtitle *liveSubtitle;
|
||||
cDvbSubtitleConverter *dvbSubtitleConverter;
|
||||
public:
|
||||
virtual cSpuDecoder *GetSpuDecoder(void);
|
||||
///< Returns a pointer to the device's SPU decoder (or NULL, if this
|
||||
@ -303,6 +308,11 @@ public:
|
||||
///< Opens a file handle for the given filter data.
|
||||
///< A derived device that provides section data must
|
||||
///< implement this function.
|
||||
virtual void CloseFilter(int Handle);
|
||||
///< Closes a file handle that has previously been opened
|
||||
///< by OpenFilter(). If this is as simple as calling close(Handle),
|
||||
///< a derived class need not implement this function, because this
|
||||
///< is done by the default implementation.
|
||||
void AttachFilter(cFilter *Filter);
|
||||
///< Attaches the given filter to this device.
|
||||
void Detach(cFilter *Filter);
|
||||
@ -362,8 +372,11 @@ public:
|
||||
private:
|
||||
tTrackId availableTracks[ttMaxTrackTypes];
|
||||
eTrackType currentAudioTrack;
|
||||
eTrackType currentSubtitleTrack;
|
||||
cMutex mutexCurrentAudioTrack;
|
||||
cMutex mutexCurrentSubtitleTrack;
|
||||
int currentAudioTrackMissingCount;
|
||||
bool autoSelectPreferredSubtitleLanguage;
|
||||
bool pre_1_3_19_PrivateStream;
|
||||
protected:
|
||||
virtual void SetAudioTrackDevice(eTrackType Type);
|
||||
@ -384,18 +397,33 @@ public:
|
||||
const tTrackId *GetTrack(eTrackType Type);
|
||||
///< Returns a pointer to the given track id, or NULL if Type is not
|
||||
///< less than ttMaxTrackTypes.
|
||||
int NumTracks(eTrackType FirstTrack, eTrackType LastTrack) const;
|
||||
///< Returns the number of tracks in the given range that are currently
|
||||
///< available.
|
||||
int NumAudioTracks(void) const;
|
||||
///< Returns the number of audio tracks that are currently available.
|
||||
///< This is just for information, to quickly find out whether there
|
||||
///< is more than one audio track.
|
||||
int NumSubtitleTracks(void) const;
|
||||
///< Returns the number of subtitle tracks that are currently available.
|
||||
eTrackType GetCurrentAudioTrack(void) { return currentAudioTrack; }
|
||||
bool SetCurrentAudioTrack(eTrackType Type);
|
||||
///< Sets the current audio track to the given Type.
|
||||
///< \return Returns true if Type is a valid audio track, false otherwise.
|
||||
eTrackType GetCurrentSubtitleTrack(void) { return currentSubtitleTrack; }
|
||||
bool SetCurrentSubtitleTrack(eTrackType Type, bool Manual = false);
|
||||
///< Sets the current subtitle track to the given Type.
|
||||
///< IF Manual is true, no automatic preferred subtitle language selection
|
||||
///< will be done for the rest of the current replay session, or until
|
||||
///< the channel is changed.
|
||||
///< \return Returns true if Type is a valid subtitle track, false otherwise.
|
||||
void EnsureAudioTrack(bool Force = false);
|
||||
///< Makes sure an audio track is selected that is actually available.
|
||||
///< If Force is true, the language and Dolby Digital settings will
|
||||
///< be verified even if the current audio track is available.
|
||||
void EnsureSubtitleTrack(void);
|
||||
///< Makes sure one of the preferred language subtitle tracks is selected.
|
||||
///< Only has an effect if Setup.DisplaySubtitles is on.
|
||||
|
||||
// Audio facilities
|
||||
|
||||
@ -454,6 +482,13 @@ protected:
|
||||
///< Length) or not at all (returning 0 or -1 and setting 'errno' to EAGAIN).
|
||||
///< \return Returns the number of bytes actually taken from Data, or -1
|
||||
///< in case of an error.
|
||||
virtual int PlaySubtitle(const uchar *Data, int Length);
|
||||
///< Plays the given data block as a subtitle.
|
||||
///< Data points to exactly one complete PES packet of the given Length.
|
||||
///< PlaySubtitle() shall process the packet either as a whole (returning
|
||||
///< Length) or not at all (returning 0 or -1 and setting 'errno' to EAGAIN).
|
||||
///< \return Returns the number of bytes actually taken from Data, or -1
|
||||
///< in case of an error.
|
||||
virtual int PlayPesPacket(const uchar *Data, int Length, bool VideoOnly = false);
|
||||
///< Plays the single PES packet in Data with the given Length.
|
||||
///< If VideoOnly is true, only the video will be displayed,
|
||||
@ -464,6 +499,9 @@ public:
|
||||
///< Gets the current System Time Counter, which can be used to
|
||||
///< synchronize audio and video. If this device is unable to
|
||||
///< provide the STC, -1 will be returned.
|
||||
virtual bool HasIBPTrickSpeed(void) { return false; }
|
||||
///< Returns true if this device can handle all frames in 'fast forward'
|
||||
///< trick speeds.
|
||||
virtual void TrickSpeed(int Speed);
|
||||
///< Sets the device into a mode where replay is done slower.
|
||||
///< Every single frame shall then be displayed the given number of
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: dvbdevice.c 1.165 2007/08/17 13:37:56 kls Exp $
|
||||
* $Id: dvbdevice.c 1.167 2007/10/14 12:56:03 kls Exp $
|
||||
*/
|
||||
|
||||
#include "dvbdevice.h"
|
||||
@ -483,7 +483,7 @@ bool cDvbDevice::Initialize(void)
|
||||
|
||||
void cDvbDevice::MakePrimaryDevice(bool On)
|
||||
{
|
||||
if (HasDecoder())
|
||||
if (On && HasDecoder())
|
||||
new cDvbOsdProvider(fd_osd);
|
||||
}
|
||||
|
||||
@ -711,6 +711,11 @@ int cDvbDevice::OpenFilter(u_short Pid, u_char Tid, u_char Mask)
|
||||
return -1;
|
||||
}
|
||||
|
||||
void cDvbDevice::CloseFilter(int Handle)
|
||||
{
|
||||
close(Handle);
|
||||
}
|
||||
|
||||
void cDvbDevice::TurnOffLiveMode(bool LiveView)
|
||||
{
|
||||
if (LiveView) {
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: dvbdevice.h 1.44 2007/02/25 12:23:57 kls Exp $
|
||||
* $Id: dvbdevice.h 1.45 2007/10/14 13:01:25 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __DVBDEVICE_H
|
||||
@ -83,6 +83,7 @@ protected:
|
||||
|
||||
protected:
|
||||
virtual int OpenFilter(u_short Pid, u_char Tid, u_char Mask);
|
||||
virtual void CloseFilter(int Handle);
|
||||
|
||||
// Common Interface facilities:
|
||||
|
||||
|
16
dvbosd.c
16
dvbosd.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: dvbosd.c 1.31 2007/08/26 09:39:20 kls Exp $
|
||||
* $Id: dvbosd.c 1.32 2007/09/16 08:55:54 kls Exp $
|
||||
*/
|
||||
|
||||
#include "dvbosd.h"
|
||||
@ -32,6 +32,7 @@ public:
|
||||
cDvbOsd(int Left, int Top, int OsdDev, uint Level);
|
||||
virtual ~cDvbOsd();
|
||||
virtual eOsdError CanHandleAreas(const tArea *Areas, int NumAreas);
|
||||
virtual eOsdError SetAreas(const tArea *Areas, int NumAreas);
|
||||
virtual void Flush(void);
|
||||
};
|
||||
|
||||
@ -106,6 +107,19 @@ eOsdError cDvbOsd::CanHandleAreas(const tArea *Areas, int NumAreas)
|
||||
return Result;
|
||||
}
|
||||
|
||||
eOsdError cDvbOsd::SetAreas(const tArea *Areas, int NumAreas)
|
||||
{
|
||||
if (shown) {
|
||||
cBitmap *Bitmap;
|
||||
for (int i = 0; (Bitmap = GetBitmap(i)) != NULL; i++) {
|
||||
Cmd(OSD_SetWindow, 0, i + 1);
|
||||
Cmd(OSD_Close);
|
||||
}
|
||||
shown = false;
|
||||
}
|
||||
return cOsd::SetAreas(Areas, NumAreas);
|
||||
}
|
||||
|
||||
void cDvbOsd::Cmd(OSD_Command cmd, int color, int x0, int y0, int x1, int y1, const void *data)
|
||||
{
|
||||
if (osdDev >= 0) {
|
||||
|
10
dvbplayer.c
10
dvbplayer.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: dvbplayer.c 1.46 2007/04/28 14:55:22 kls Exp $
|
||||
* $Id: dvbplayer.c 1.47 2007/10/13 12:20:58 kls Exp $
|
||||
*/
|
||||
|
||||
#include "dvbplayer.h"
|
||||
@ -400,7 +400,13 @@ void cDvbPlayer::Action(void)
|
||||
uchar FileNumber;
|
||||
int FileOffset;
|
||||
bool TimeShiftMode = index->IsStillRecording();
|
||||
int Index = index->GetNextIFrame(readIndex, playDir == pdForward, &FileNumber, &FileOffset, &Length, TimeShiftMode);
|
||||
int Index = -1;
|
||||
if (DeviceHasIBPTrickSpeed() && playDir == pdForward) {
|
||||
if (index->Get(readIndex + 1, &FileNumber, &FileOffset, NULL, &Length))
|
||||
Index = readIndex + 1;
|
||||
}
|
||||
else
|
||||
Index = index->GetNextIFrame(readIndex, playDir == pdForward, &FileNumber, &FileOffset, &Length, TimeShiftMode);
|
||||
if (Index >= 0) {
|
||||
if (!NextFile(FileNumber, FileOffset)) {
|
||||
readIndex = Index;
|
||||
|
1029
dvbsubtitle.c
Normal file
1029
dvbsubtitle.c
Normal file
File diff suppressed because it is too large
Load Diff
43
dvbsubtitle.h
Normal file
43
dvbsubtitle.h
Normal file
@ -0,0 +1,43 @@
|
||||
/*
|
||||
* dvbsubtitle.h: DVB subtitles
|
||||
*
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* Original author: Marco Schlüßler <marco@lordzodiac.de>
|
||||
*
|
||||
* $Id: dvbsubtitle.h 1.1 2007/10/14 14:02:46 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __DVBSUBTITLE_H
|
||||
#define __DVBSUBTITLE_H
|
||||
|
||||
#include "osd.h"
|
||||
#include "thread.h"
|
||||
#include "tools.h"
|
||||
|
||||
class cDvbSubtitlePage;
|
||||
class cDvbSubtitleAssembler;
|
||||
class cDvbSubtitleBitmaps;
|
||||
|
||||
class cDvbSubtitleConverter : public cThread {
|
||||
private:
|
||||
static int setupLevel;
|
||||
cDvbSubtitleAssembler *dvbSubtitleAssembler;
|
||||
cOsd *osd;
|
||||
cList<cDvbSubtitlePage> *pages;
|
||||
cList<cDvbSubtitleBitmaps> *bitmaps;
|
||||
tColor yuv2rgb(int Y, int Cb, int Cr);
|
||||
bool AssertOsd(void);
|
||||
int ExtractSegment(const uchar *Data, int Length, int64_t Pts);
|
||||
void FinishPage(cDvbSubtitlePage *Page);
|
||||
public:
|
||||
cDvbSubtitleConverter(void);
|
||||
virtual ~cDvbSubtitleConverter();
|
||||
void Action(void);
|
||||
void Reset(void);
|
||||
int Convert(const uchar *Data, int Length);
|
||||
static void SetupChanged(void);
|
||||
};
|
||||
|
||||
#endif //__DVBSUBTITLE_H
|
6
eit.c
6
eit.c
@ -8,7 +8,7 @@
|
||||
* Robert Schneider <Robert.Schneider@web.de> and Rolf Hakenes <hakenes@hippomi.de>.
|
||||
* Adapted to 'libsi' for VDR 1.3.0 by Marcel Wiesweg <marcel.wiesweg@gmx.de>.
|
||||
*
|
||||
* $Id: eit.c 1.125 2007/07/28 13:16:43 kls Exp $
|
||||
* $Id: eit.c 1.126 2007/08/26 10:56:33 kls Exp $
|
||||
*/
|
||||
|
||||
#include "eit.h"
|
||||
@ -219,11 +219,11 @@ cEIT::cEIT(cSchedules *Schedules, int Source, u_char Tid, const u_char *Data, bo
|
||||
SI::ComponentDescriptor *cd = (SI::ComponentDescriptor *)d;
|
||||
uchar Stream = cd->getStreamContent();
|
||||
uchar Type = cd->getComponentType();
|
||||
if (1 <= Stream && Stream <= 2 && Type != 0) {
|
||||
if (1 <= Stream && Stream <= 3 && Type != 0) { // 1=video, 2=audio, 3=subtitles
|
||||
if (!Components)
|
||||
Components = new cComponents;
|
||||
char buffer[Utf8BufSize(256)];
|
||||
Components->SetComponent(Components->NumComponents(), cd->getStreamContent(), cd->getComponentType(), I18nNormalizeLanguageCode(cd->languageCode), cd->description.getText(buffer, sizeof(buffer)));
|
||||
Components->SetComponent(Components->NumComponents(), Stream, Type, I18nNormalizeLanguageCode(cd->languageCode), cd->description.getText(buffer, sizeof(buffer)));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -10,7 +10,7 @@
|
||||
# See the main source file 'vdr.c' for copyright information and
|
||||
# how to reach the author.
|
||||
#
|
||||
# $Id: i18n-to-gettext.pl 1.4 2007/08/24 13:19:34 kls Exp $
|
||||
# $Id: i18n-to-gettext.pl 1.5 2007/10/14 14:14:22 kls Exp $
|
||||
|
||||
# How to convert an actual plugin:
|
||||
#
|
||||
@ -319,7 +319,7 @@ $(I18Npot): $(wildcard *.c)
|
||||
$(I18Npo): $(I18Npot)
|
||||
msgmerge -U --no-wrap -F --backup=none -q $@ $<
|
||||
|
||||
i18n: $(I18Nmo)
|
||||
i18n: $(I18Npot) $(I18Nmo)
|
||||
@mkdir -p $(LOCALEDIR)
|
||||
for i in $(I18Ndirs); do\
|
||||
mkdir -p $(LOCALEDIR)/$$i/LC_MESSAGES;\
|
||||
|
3
keys.c
3
keys.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: keys.c 1.15 2007/08/11 11:30:18 kls Exp $
|
||||
* $Id: keys.c 1.16 2007/08/26 12:35:21 kls Exp $
|
||||
*/
|
||||
|
||||
#include "keys.h"
|
||||
@ -49,6 +49,7 @@ static tKey keyTable[] = { // "Up" and "Down" must be the first two keys!
|
||||
{ kVolDn, trNOOP("Key$Volume-") },
|
||||
{ kMute, trNOOP("Key$Mute") },
|
||||
{ kAudio, trNOOP("Key$Audio") },
|
||||
{ kSubtitles, trNOOP("Key$Subtitles") },
|
||||
{ kSchedule, trNOOP("Key$Schedule") },
|
||||
{ kChannels, trNOOP("Key$Channels") },
|
||||
{ kTimers, trNOOP("Key$Timers") },
|
||||
|
3
keys.h
3
keys.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: keys.h 1.13 2007/08/24 13:15:48 kls Exp $
|
||||
* $Id: keys.h 1.14 2007/08/26 12:34:50 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __KEYS_H
|
||||
@ -43,6 +43,7 @@ enum eKeys { // "Up" and "Down" must be the first two keys!
|
||||
kVolDn,
|
||||
kMute,
|
||||
kAudio,
|
||||
kSubtitles,
|
||||
kSchedule,
|
||||
kChannels,
|
||||
kTimers,
|
||||
|
156
menu.c
156
menu.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: menu.c 1.461 2007/08/24 13:15:48 kls Exp $
|
||||
* $Id: menu.c 1.463 2007/10/13 10:10:20 kls Exp $
|
||||
*/
|
||||
|
||||
#include "menu.h"
|
||||
@ -260,6 +260,8 @@ void cMenuEditChannel::Setup(void)
|
||||
Add(new cMenuEditIntItem( tr("Apid2"), &data.apids[1], 0, 0x1FFF));
|
||||
Add(new cMenuEditIntItem( tr("Dpid1"), &data.dpids[0], 0, 0x1FFF));
|
||||
Add(new cMenuEditIntItem( tr("Dpid2"), &data.dpids[1], 0, 0x1FFF));
|
||||
Add(new cMenuEditIntItem( tr("Spid1"), &data.spids[0], 0, 0x1FFF));
|
||||
Add(new cMenuEditIntItem( tr("Spid2"), &data.spids[1], 0, 0x1FFF));
|
||||
Add(new cMenuEditIntItem( tr("Tpid"), &data.tpid, 0, 0x1FFF));
|
||||
Add(new cMenuEditCaItem( tr("CA"), &data.caids[0]));
|
||||
Add(new cMenuEditIntItem( tr("Sid"), &data.sid, 1, 0xFFFF));
|
||||
@ -523,6 +525,7 @@ eOSState cMenuChannels::Delete(void)
|
||||
Channels.Del(channel);
|
||||
cOsdMenu::Del(Index);
|
||||
Propagate();
|
||||
Channels.SetModified(true);
|
||||
isyslog("channel %d deleted", DeletedChannel);
|
||||
if (CurrentChannel && CurrentChannel->Number() != CurrentChannelNr) {
|
||||
if (!cDevice::PrimaryDevice()->Replaying() || cDevice::PrimaryDevice()->Transferring())
|
||||
@ -547,6 +550,7 @@ void cMenuChannels::Move(int From, int To)
|
||||
Channels.Move(FromChannel, ToChannel);
|
||||
cOsdMenu::Move(From, To);
|
||||
Propagate();
|
||||
Channels.SetModified(true);
|
||||
isyslog("channel %d moved to %d", FromNumber, ToNumber);
|
||||
if (CurrentChannel && CurrentChannel->Number() != CurrentChannelNr) {
|
||||
if (!cDevice::PrimaryDevice()->Replaying() || cDevice::PrimaryDevice()->Transferring())
|
||||
@ -2400,6 +2404,8 @@ class cMenuSetupDVB : public cMenuSetupBase {
|
||||
private:
|
||||
int originalNumAudioLanguages;
|
||||
int numAudioLanguages;
|
||||
int originalNumSubtitleLanguages;
|
||||
int numSubtitleLanguages;
|
||||
void Setup(void);
|
||||
const char *videoDisplayFormatTexts[3];
|
||||
const char *updateChannelsTexts[6];
|
||||
@ -2412,7 +2418,10 @@ cMenuSetupDVB::cMenuSetupDVB(void)
|
||||
{
|
||||
for (numAudioLanguages = 0; numAudioLanguages < I18nLanguages()->Size() && data.AudioLanguages[numAudioLanguages] >= 0; numAudioLanguages++)
|
||||
;
|
||||
for (numSubtitleLanguages = 0; numSubtitleLanguages < I18nLanguages()->Size() && data.SubtitleLanguages[numSubtitleLanguages] >= 0; numSubtitleLanguages++)
|
||||
;
|
||||
originalNumAudioLanguages = numAudioLanguages;
|
||||
originalNumSubtitleLanguages = numSubtitleLanguages;
|
||||
videoDisplayFormatTexts[0] = tr("pan&scan");
|
||||
videoDisplayFormatTexts[1] = tr("letterbox");
|
||||
videoDisplayFormatTexts[2] = tr("center cut out");
|
||||
@ -2442,6 +2451,15 @@ void cMenuSetupDVB::Setup(void)
|
||||
Add(new cMenuEditIntItem( tr("Setup.DVB$Audio languages"), &numAudioLanguages, 0, I18nLanguages()->Size()));
|
||||
for (int i = 0; i < numAudioLanguages; i++)
|
||||
Add(new cMenuEditStraItem(tr("Setup.DVB$Audio language"), &data.AudioLanguages[i], I18nLanguages()->Size(), &I18nLanguages()->At(0)));
|
||||
Add(new cMenuEditBoolItem(tr("Setup.DVB$Display subtitles"), &data.DisplaySubtitles));
|
||||
if (data.DisplaySubtitles) {
|
||||
Add(new cMenuEditIntItem( tr("Setup.DVB$Subtitle languages"), &numSubtitleLanguages, 0, I18nLanguages()->Size()));
|
||||
for (int i = 0; i < numSubtitleLanguages; i++)
|
||||
Add(new cMenuEditStraItem(tr("Setup.DVB$Subtitle language"), &data.SubtitleLanguages[i], I18nLanguages()->Size(), &I18nLanguages()->At(0)));
|
||||
Add(new cMenuEditIntItem( tr("Setup.DVB$Subtitle offset"), &data.SubtitleOffset, -50, 50));
|
||||
Add(new cMenuEditIntItem( tr("Setup.DVB$Subtitle foreground transparency"), &data.SubtitleFgTransparency, 0, 9));
|
||||
Add(new cMenuEditIntItem( tr("Setup.DVB$Subtitle background transparency"), &data.SubtitleBgTransparency, 0, 10));
|
||||
}
|
||||
|
||||
SetCurrent(Get(current));
|
||||
Display();
|
||||
@ -2453,11 +2471,15 @@ eOSState cMenuSetupDVB::ProcessKey(eKeys Key)
|
||||
int oldVideoDisplayFormat = ::Setup.VideoDisplayFormat;
|
||||
bool oldVideoFormat = ::Setup.VideoFormat;
|
||||
bool newVideoFormat = data.VideoFormat;
|
||||
bool oldDisplaySubtitles = ::Setup.DisplaySubtitles;
|
||||
bool newDisplaySubtitles = data.DisplaySubtitles;
|
||||
int oldnumAudioLanguages = numAudioLanguages;
|
||||
int oldnumSubtitleLanguages = numSubtitleLanguages;
|
||||
eOSState state = cMenuSetupBase::ProcessKey(Key);
|
||||
|
||||
if (Key != kNone) {
|
||||
bool DoSetup = data.VideoFormat != newVideoFormat;
|
||||
DoSetup |= data.DisplaySubtitles != newDisplaySubtitles;
|
||||
if (numAudioLanguages != oldnumAudioLanguages) {
|
||||
for (int i = oldnumAudioLanguages; i < numAudioLanguages; i++) {
|
||||
data.AudioLanguages[i] = 0;
|
||||
@ -2476,6 +2498,24 @@ eOSState cMenuSetupDVB::ProcessKey(eKeys Key)
|
||||
data.AudioLanguages[numAudioLanguages] = -1;
|
||||
DoSetup = true;
|
||||
}
|
||||
if (numSubtitleLanguages != oldnumSubtitleLanguages) {
|
||||
for (int i = oldnumSubtitleLanguages; i < numSubtitleLanguages; i++) {
|
||||
data.SubtitleLanguages[i] = 0;
|
||||
for (int l = 0; l < I18nLanguages()->Size(); l++) {
|
||||
int k;
|
||||
for (k = 0; k < oldnumSubtitleLanguages; k++) {
|
||||
if (data.SubtitleLanguages[k] == l)
|
||||
break;
|
||||
}
|
||||
if (k >= oldnumSubtitleLanguages) {
|
||||
data.SubtitleLanguages[i] = l;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
data.SubtitleLanguages[numSubtitleLanguages] = -1;
|
||||
DoSetup = true;
|
||||
}
|
||||
if (DoSetup)
|
||||
Setup();
|
||||
}
|
||||
@ -2486,6 +2526,9 @@ eOSState cMenuSetupDVB::ProcessKey(eKeys Key)
|
||||
cDevice::PrimaryDevice()->SetVideoDisplayFormat(eVideoDisplayFormat(::Setup.VideoDisplayFormat));
|
||||
if (::Setup.VideoFormat != oldVideoFormat)
|
||||
cDevice::PrimaryDevice()->SetVideoFormat(::Setup.VideoFormat);
|
||||
if (::Setup.DisplaySubtitles != oldDisplaySubtitles)
|
||||
cDevice::PrimaryDevice()->EnsureSubtitleTrack();
|
||||
cDvbSubtitleConverter::SetupChanged();
|
||||
}
|
||||
return state;
|
||||
}
|
||||
@ -3128,13 +3171,17 @@ static void SetTrackDescriptions(int LiveChannel)
|
||||
if (Components) {
|
||||
int indexAudio = 0;
|
||||
int indexDolby = 0;
|
||||
int indexSubtitle = 0;
|
||||
for (int i = 0; i < Components->NumComponents(); i++) {
|
||||
const tComponent *p = Components->Component(i);
|
||||
if (p->stream == 2) {
|
||||
if (p->type == 0x05)
|
||||
switch (p->stream) {
|
||||
case 2: if (p->type == 0x05)
|
||||
cDevice::PrimaryDevice()->SetAvailableTrack(ttDolby, indexDolby++, 0, LiveChannel ? NULL : p->language, p->description);
|
||||
else
|
||||
cDevice::PrimaryDevice()->SetAvailableTrack(ttAudio, indexAudio++, 0, LiveChannel ? NULL : p->language, p->description);
|
||||
break;
|
||||
case 3: cDevice::PrimaryDevice()->SetAvailableTrack(ttSubtitle, indexSubtitle++, 0, LiveChannel ? NULL : p->language, p->description);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3491,7 +3538,7 @@ cDisplayTracks::cDisplayTracks(void)
|
||||
numTracks++;
|
||||
}
|
||||
}
|
||||
descriptions[numTracks] = 0;
|
||||
descriptions[numTracks] = NULL;
|
||||
timeout.Set(TRACKTIMEOUT);
|
||||
displayTracks = Skins.Current()->DisplayTracks(tr("Button$Audio"), numTracks, descriptions);
|
||||
Show();
|
||||
@ -3569,7 +3616,7 @@ eOSState cDisplayTracks::ProcessKey(eKeys Key)
|
||||
timeout.Set(TRACKTIMEOUT);
|
||||
break;
|
||||
case kOk:
|
||||
if (track != cDevice::PrimaryDevice()->GetCurrentAudioTrack())
|
||||
if (types[track] != cDevice::PrimaryDevice()->GetCurrentAudioTrack())
|
||||
oldTrack = -1; // make sure we explicitly switch to that track
|
||||
timeout.Set();
|
||||
break;
|
||||
@ -3588,6 +3635,105 @@ eOSState cDisplayTracks::ProcessKey(eKeys Key)
|
||||
return timeout.TimedOut() ? osEnd : osContinue;
|
||||
}
|
||||
|
||||
// --- cDisplaySubtitleTracks ------------------------------------------------
|
||||
|
||||
cDisplaySubtitleTracks *cDisplaySubtitleTracks::currentDisplayTracks = NULL;
|
||||
|
||||
cDisplaySubtitleTracks::cDisplaySubtitleTracks(void)
|
||||
:cOsdObject(true)
|
||||
{
|
||||
SetTrackDescriptions(!cDevice::PrimaryDevice()->Replaying() || cDevice::PrimaryDevice()->Transferring() ? cDevice::CurrentChannel() : 0);
|
||||
currentDisplayTracks = this;
|
||||
numTracks = track = 0;
|
||||
types[numTracks] = ttNone;
|
||||
descriptions[numTracks] = strdup(tr("No subtitles"));
|
||||
numTracks++;
|
||||
eTrackType CurrentSubtitleTrack = cDevice::PrimaryDevice()->GetCurrentSubtitleTrack();
|
||||
for (int i = ttSubtitleFirst; i <= ttSubtitleLast; i++) {
|
||||
const tTrackId *TrackId = cDevice::PrimaryDevice()->GetTrack(eTrackType(i));
|
||||
if (TrackId && TrackId->id) {
|
||||
types[numTracks] = eTrackType(i);
|
||||
descriptions[numTracks] = strdup(*TrackId->description ? TrackId->description : *TrackId->language ? TrackId->language : *itoa(i));
|
||||
if (i == CurrentSubtitleTrack)
|
||||
track = numTracks;
|
||||
numTracks++;
|
||||
}
|
||||
}
|
||||
descriptions[numTracks] = NULL;
|
||||
timeout.Set(TRACKTIMEOUT);
|
||||
displayTracks = Skins.Current()->DisplayTracks(tr("Button$Subtitles"), numTracks, descriptions);
|
||||
Show();
|
||||
}
|
||||
|
||||
cDisplaySubtitleTracks::~cDisplaySubtitleTracks()
|
||||
{
|
||||
delete displayTracks;
|
||||
currentDisplayTracks = NULL;
|
||||
for (int i = 0; i < numTracks; i++)
|
||||
free(descriptions[i]);
|
||||
cStatus::MsgOsdClear();
|
||||
}
|
||||
|
||||
void cDisplaySubtitleTracks::Show(void)
|
||||
{
|
||||
displayTracks->SetTrack(track, descriptions);
|
||||
displayTracks->Flush();
|
||||
//cStatus::MsgSetSubtitleTrack(track, descriptions); //TODO better make a more general cStatus::MsgSetTrack(tr("Subtitles"), track, descriptions)
|
||||
}
|
||||
|
||||
cDisplaySubtitleTracks *cDisplaySubtitleTracks::Create(void)
|
||||
{
|
||||
if (cDevice::PrimaryDevice()->NumSubtitleTracks() > 0) {
|
||||
if (!currentDisplayTracks)
|
||||
new cDisplaySubtitleTracks;
|
||||
return currentDisplayTracks;
|
||||
}
|
||||
Skins.Message(mtWarning, tr("No subtitles available!"));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void cDisplaySubtitleTracks::Process(eKeys Key)
|
||||
{
|
||||
if (currentDisplayTracks)
|
||||
currentDisplayTracks->ProcessKey(Key);
|
||||
}
|
||||
|
||||
eOSState cDisplaySubtitleTracks::ProcessKey(eKeys Key)
|
||||
{
|
||||
int oldTrack = track;
|
||||
switch (Key) {
|
||||
case kUp|k_Repeat:
|
||||
case kUp:
|
||||
case kDown|k_Repeat:
|
||||
case kDown:
|
||||
if (NORMALKEY(Key) == kUp && track > 0)
|
||||
track--;
|
||||
else if (NORMALKEY(Key) == kDown && track < numTracks - 1)
|
||||
track++;
|
||||
timeout.Set(TRACKTIMEOUT);
|
||||
break;
|
||||
case kSubtitles|k_Repeat:
|
||||
case kSubtitles:
|
||||
if (++track >= numTracks)
|
||||
track = 0;
|
||||
timeout.Set(TRACKTIMEOUT);
|
||||
break;
|
||||
case kOk:
|
||||
if (types[track] != cDevice::PrimaryDevice()->GetCurrentSubtitleTrack())
|
||||
oldTrack = -1; // make sure we explicitly switch to that track
|
||||
timeout.Set();
|
||||
break;
|
||||
case kNone: break;
|
||||
default: if ((Key & k_Release) == 0)
|
||||
return osEnd;
|
||||
}
|
||||
if (track != oldTrack) {
|
||||
Show();
|
||||
cDevice::PrimaryDevice()->SetCurrentSubtitleTrack(types[track], true);
|
||||
}
|
||||
return timeout.TimedOut() ? osEnd : osContinue;
|
||||
}
|
||||
|
||||
// --- cRecordControl --------------------------------------------------------
|
||||
|
||||
cRecordControl::cRecordControl(cDevice *Device, cTimer *Timer, bool Pause)
|
||||
|
20
menu.h
20
menu.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: menu.h 1.88 2007/08/12 10:35:42 kls Exp $
|
||||
* $Id: menu.h 1.89 2007/08/26 14:35:57 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __MENU_H
|
||||
@ -128,6 +128,24 @@ public:
|
||||
eOSState ProcessKey(eKeys Key);
|
||||
};
|
||||
|
||||
class cDisplaySubtitleTracks : public cOsdObject {
|
||||
private:
|
||||
cSkinDisplayTracks *displayTracks;
|
||||
cTimeMs timeout;
|
||||
eTrackType types[ttMaxTrackTypes];
|
||||
char *descriptions[ttMaxTrackTypes + 1]; // list is NULL terminated
|
||||
int numTracks, track;
|
||||
static cDisplaySubtitleTracks *currentDisplayTracks;
|
||||
virtual void Show(void);
|
||||
cDisplaySubtitleTracks(void);
|
||||
public:
|
||||
virtual ~cDisplaySubtitleTracks();
|
||||
static bool IsOpen(void) { return currentDisplayTracks != NULL; }
|
||||
static cDisplaySubtitleTracks *Create(void);
|
||||
static void Process(eKeys Key);
|
||||
eOSState ProcessKey(eKeys Key);
|
||||
};
|
||||
|
||||
cOsdObject *CamControl(void);
|
||||
|
||||
class cMenuRecordingItem;
|
||||
|
10
menuitems.c
10
menuitems.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: menuitems.c 1.51 2007/08/17 13:48:07 kls Exp $
|
||||
* $Id: menuitems.c 1.53 2007/10/13 12:05:37 kls Exp $
|
||||
*/
|
||||
|
||||
#include "menuitems.h"
|
||||
@ -302,11 +302,11 @@ void cMenuEditStrItem::LeaveEditMode(bool SaveValue)
|
||||
stripspace(value);
|
||||
}
|
||||
lengthUtf8 = 0;
|
||||
delete valueUtf8;
|
||||
delete[] valueUtf8;
|
||||
valueUtf8 = NULL;
|
||||
delete allowedUtf8;
|
||||
delete[] allowedUtf8;
|
||||
allowedUtf8 = NULL;
|
||||
delete charMapUtf8;
|
||||
delete[] charMapUtf8;
|
||||
charMapUtf8 = NULL;
|
||||
pos = -1;
|
||||
offset = 0;
|
||||
@ -499,9 +499,9 @@ eOSState cMenuEditStrItem::ProcessKey(eKeys Key)
|
||||
if (!insert || newchar)
|
||||
pos--;
|
||||
newchar = true;
|
||||
}
|
||||
if (!insert && Utf8is(alpha, valueUtf8[pos]))
|
||||
uppercase = Utf8is(upper, valueUtf8[pos]);
|
||||
}
|
||||
break;
|
||||
case kRight|k_Repeat:
|
||||
case kRight: if (InEditMode())
|
||||
|
@ -12,7 +12,7 @@
|
||||
# See the main source file 'vdr.c' for copyright information and
|
||||
# how to reach the author.
|
||||
#
|
||||
# $Id: newplugin 1.36 2007/08/19 14:19:49 kls Exp $
|
||||
# $Id: newplugin 1.38 2007/10/14 09:13:17 kls Exp $
|
||||
|
||||
$PLUGIN_NAME = $ARGV[0] || die "Usage: newplugin <name>\n";
|
||||
|
||||
@ -139,12 +139,12 @@ I18Npot = \$(PODIR)/\$(PLUGIN).pot
|
||||
msgfmt -c -o \$\@ \$<
|
||||
|
||||
\$(I18Npot): \$(wildcard *.c)
|
||||
xgettext -C -cTRANSLATORS --no-wrap -F -k -ktr -ktrNOOP --msgid-bugs-address='<see README>' -o \$\@ \$(wildcard *.c)
|
||||
xgettext -C -cTRANSLATORS --no-wrap --no-location -k -ktr -ktrNOOP --msgid-bugs-address='<see README>' -o \$\@ \$(wildcard *.c)
|
||||
|
||||
\$(I18Npo): \$(I18Npot)
|
||||
msgmerge -U --no-wrap -F --backup=none -q \$\@ \$<
|
||||
msgmerge -U --no-wrap --no-location --backup=none -q \$\@ \$<
|
||||
|
||||
i18n: \$(I18Nmo)
|
||||
i18n: \$(I18Npot) \$(I18Nmo)
|
||||
\@mkdir -p \$(LOCALEDIR)
|
||||
for i in \$(I18Ndirs); do\\
|
||||
mkdir -p \$(LOCALEDIR)/\$\$i/LC_MESSAGES;\\
|
||||
|
92
osd.c
92
osd.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: osd.c 1.74 2007/08/26 09:44:50 kls Exp $
|
||||
* $Id: osd.c 1.75 2007/10/12 12:38:36 kls Exp $
|
||||
*/
|
||||
|
||||
#include "osd.h"
|
||||
@ -82,7 +82,7 @@ void cPalette::SetColor(int Index, tColor Color)
|
||||
}
|
||||
}
|
||||
|
||||
const tColor *cPalette::Colors(int &NumColors)
|
||||
const tColor *cPalette::Colors(int &NumColors) const
|
||||
{
|
||||
NumColors = numColors;
|
||||
return numColors ? color : NULL;
|
||||
@ -112,7 +112,7 @@ void cPalette::Replace(const cPalette &Palette)
|
||||
antiAliasGranularity = Palette.antiAliasGranularity;
|
||||
}
|
||||
|
||||
tColor cPalette::Blend(tColor ColorFg, tColor ColorBg, uint8_t Level)
|
||||
tColor cPalette::Blend(tColor ColorFg, tColor ColorBg, uint8_t Level) const
|
||||
{
|
||||
if (antiAliasGranularity > 0)
|
||||
Level = uint8_t(int(Level / antiAliasGranularity + 0.5) * antiAliasGranularity);
|
||||
@ -131,7 +131,7 @@ tColor cPalette::Blend(tColor ColorFg, tColor ColorBg, uint8_t Level)
|
||||
return (A << 24) | (R << 16) | (G << 8) | B;
|
||||
}
|
||||
|
||||
int cPalette::ClosestColor(tColor Color, int MaxDiff)
|
||||
int cPalette::ClosestColor(tColor Color, int MaxDiff) const
|
||||
{
|
||||
int n = 0;
|
||||
int d = INT_MAX;
|
||||
@ -640,6 +640,79 @@ const tIndex *cBitmap::Data(int x, int y)
|
||||
return &bitmap[y * width + x];
|
||||
}
|
||||
|
||||
void cBitmap::ReduceBpp(const cPalette &Palette)
|
||||
{
|
||||
int NewBpp = Palette.Bpp();
|
||||
if (Bpp() == 4 && NewBpp == 2) {
|
||||
for (int i = width * height; i--; ) {
|
||||
tIndex p = bitmap[i];
|
||||
bitmap[i] = (p >> 2) | ((p & 0x03) != 0);
|
||||
}
|
||||
}
|
||||
else if (Bpp() == 8) {
|
||||
if (NewBpp == 2) {
|
||||
for (int i = width * height; i--; ) {
|
||||
tIndex p = bitmap[i];
|
||||
bitmap[i] = (p >> 6) | ((p & 0x30) != 0);
|
||||
}
|
||||
}
|
||||
else if (NewBpp == 4) {
|
||||
for (int i = width * height; i--; ) {
|
||||
tIndex p = bitmap[i];
|
||||
bitmap[i] = p >> 4;
|
||||
}
|
||||
}
|
||||
else
|
||||
return;
|
||||
}
|
||||
else
|
||||
return;
|
||||
SetBpp(NewBpp);
|
||||
Replace(Palette);
|
||||
}
|
||||
|
||||
void cBitmap::ShrinkBpp(int NewBpp)
|
||||
{
|
||||
int NumOldColors;
|
||||
const tColor *Colors = this->Colors(NumOldColors);
|
||||
if (Colors) {
|
||||
// Find the most frequently used colors and create a map table:
|
||||
int Used[MAXNUMCOLORS] = { 0 };
|
||||
int Map[MAXNUMCOLORS] = { 0 };
|
||||
for (int i = width * height; i--; )
|
||||
Used[bitmap[i]]++;
|
||||
int MaxNewColors = (NewBpp == 4) ? 16 : 4;
|
||||
cPalette NewPalette(NewBpp);
|
||||
for (int i = 0; i < MaxNewColors; i++) {
|
||||
int Max = 0;
|
||||
int Index = -1;
|
||||
for (int n = 0; n < NumOldColors; n++) {
|
||||
if (Used[n] > Max) {
|
||||
Max = Used[n];
|
||||
Index = n;
|
||||
}
|
||||
}
|
||||
if (Index >= 0) {
|
||||
Used[Index] = 0;
|
||||
Map[Index] = i;
|
||||
NewPalette.SetColor(i, Colors[Index]);
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
// Complete the map table for all other colors (will be set to closest match):
|
||||
for (int n = 0; n < NumOldColors; n++) {
|
||||
if (Used[n])
|
||||
Map[n] = NewPalette.Index(Colors[n]);
|
||||
}
|
||||
// Do the actual index mapping:
|
||||
for (int i = width * height; i--; )
|
||||
bitmap[i] = Map[bitmap[i]];
|
||||
SetBpp(NewBpp);
|
||||
Replace(NewPalette);
|
||||
}
|
||||
}
|
||||
|
||||
// --- cOsd ------------------------------------------------------------------
|
||||
|
||||
int cOsd::osdLeft = 0;
|
||||
@ -720,10 +793,10 @@ eOsdError cOsd::CanHandleAreas(const tArea *Areas, int NumAreas)
|
||||
|
||||
eOsdError cOsd::SetAreas(const tArea *Areas, int NumAreas)
|
||||
{
|
||||
eOsdError Result = oeUnknown;
|
||||
if (numBitmaps == 0) {
|
||||
Result = CanHandleAreas(Areas, NumAreas);
|
||||
eOsdError Result = CanHandleAreas(Areas, NumAreas);
|
||||
if (Result == oeOk) {
|
||||
while (numBitmaps)
|
||||
delete bitmaps[--numBitmaps];
|
||||
width = height = 0;
|
||||
for (int i = 0; i < NumAreas; i++) {
|
||||
bitmaps[numBitmaps++] = new cBitmap(Areas[i].Width(), Areas[i].Height(), Areas[i].bpp, Areas[i].x1, Areas[i].y1);
|
||||
@ -731,8 +804,7 @@ eOsdError cOsd::SetAreas(const tArea *Areas, int NumAreas)
|
||||
height = max(height, Areas[i].y2 + 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (Result != oeOk)
|
||||
else
|
||||
esyslog("ERROR: cOsd::SetAreas returned %d", Result);
|
||||
return Result;
|
||||
}
|
||||
@ -818,7 +890,7 @@ cOsdProvider::~cOsdProvider()
|
||||
|
||||
cOsd *cOsdProvider::NewOsd(int Left, int Top, uint Level)
|
||||
{
|
||||
if (Level == 0 && cOsd::IsOpen())
|
||||
if (Level == OSD_LEVEL_DEFAULT && cOsd::IsOpen())
|
||||
esyslog("ERROR: attempt to open OSD while it is already open - using dummy OSD!");
|
||||
else if (osdProvider) {
|
||||
cOsd *ActiveOsd = cOsd::Osds.Size() ? cOsd::Osds[0] : NULL;
|
||||
|
33
osd.h
33
osd.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: osd.h 1.57 2007/08/26 09:45:38 kls Exp $
|
||||
* $Id: osd.h 1.58 2007/10/12 14:28:44 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __OSD_H
|
||||
@ -17,6 +17,9 @@
|
||||
#include "font.h"
|
||||
#include "tools.h"
|
||||
|
||||
#define OSD_LEVEL_DEFAULT 0
|
||||
#define OSD_LEVEL_SUBTITLES 10
|
||||
|
||||
#define MAXNUMCOLORS 256
|
||||
|
||||
enum {
|
||||
@ -69,7 +72,7 @@ public:
|
||||
///< a single color combination, and may not be able to serve all
|
||||
///< requested colors. By default the palette assumes there will be
|
||||
///< 10 fixed colors and 10 color combinations.
|
||||
int Bpp(void) { return bpp; }
|
||||
int Bpp(void) const { return bpp; }
|
||||
void Reset(void);
|
||||
///< Resets the palette, making it contain no colors.
|
||||
int Index(tColor Color);
|
||||
@ -77,7 +80,7 @@ public:
|
||||
///< If Color is not yet contained in this palette, it will be added if
|
||||
///< there is a free slot. If the color can't be added to this palette,
|
||||
///< the closest existing color will be returned.
|
||||
tColor Color(int Index) { return Index < maxColors ? color[Index] : 0; }
|
||||
tColor Color(int Index) const { return Index < maxColors ? color[Index] : 0; }
|
||||
///< Returns the color at the given Index. If Index is outside the valid
|
||||
///< range, 0 will be returned.
|
||||
void SetBpp(int Bpp);
|
||||
@ -87,7 +90,7 @@ public:
|
||||
///< Sets the palette entry at Index to Color. If Index is larger than
|
||||
///< the number of currently used entries in this palette, the entries
|
||||
///< in between will have undefined values.
|
||||
const tColor *Colors(int &NumColors);
|
||||
const tColor *Colors(int &NumColors) const;
|
||||
///< Returns a pointer to the complete color table and stores the
|
||||
///< number of valid entries in NumColors. If no colors have been
|
||||
///< stored yet, NumColors will be set to 0 and the function will
|
||||
@ -102,14 +105,14 @@ public:
|
||||
void Replace(const cPalette &Palette);
|
||||
///< Replaces the colors of this palette with the colors from the given
|
||||
///< palette.
|
||||
tColor Blend(tColor ColorFg, tColor ColorBg, uint8_t Level);
|
||||
tColor Blend(tColor ColorFg, tColor ColorBg, uint8_t Level) const;
|
||||
///< Determines a color that consists of a linear blend between ColorFg
|
||||
///< and ColorBg. If Level is 0, the result is ColorBg, if it is 255,
|
||||
///< the result is ColorFg. If SetAntiAliasGranularity() has been called previously,
|
||||
///< Level will be mapped to a limited range of levels that allow to make best
|
||||
///< use of the palette entries.
|
||||
int ClosestColor(tColor Color, int MaxDiff = INT_MAX);
|
||||
///< Returns the index of a color in this paltte that is closest to the given
|
||||
int ClosestColor(tColor Color, int MaxDiff = INT_MAX) const;
|
||||
///< Returns the index of a color in this palette that is closest to the given
|
||||
///< Color. MaxDiff can be used to control the maximum allowed color difference.
|
||||
///< If no color with a maximum difference of MaxDiff can be found, -1 will
|
||||
///< be returned. With the default value of INT_MAX, there will always be
|
||||
@ -232,6 +235,17 @@ public:
|
||||
///< Returns the address of the index byte at the given coordinates.
|
||||
tColor GetColor(int x, int y) { return Color(*Data(x, y)); }
|
||||
///< Returns the color at the given coordinates.
|
||||
void ReduceBpp(const cPalette &Palette);
|
||||
///< Reduces the color depth of the bitmap to that of the given Palette.
|
||||
///< If Palette's color depth is not smaller than the bitmap's current
|
||||
///< color depth, or if it is not one of 4bpp or 2bpp, nothing happens. After
|
||||
///< reducing the color depth the current palette is replaced with
|
||||
///< the given one.
|
||||
void ShrinkBpp(int NewBpp);
|
||||
///< Shrinks the color depth of the bitmap to NewBpp by keeping only
|
||||
///< the 2^NewBpp most frequently used colors as defined in the current palette.
|
||||
///< If NewBpp is not smaller than the bitmap's current color depth,
|
||||
///< or if it is not one of 4bpp or 2bpp, nothing happens.
|
||||
};
|
||||
|
||||
struct tArea {
|
||||
@ -292,7 +306,7 @@ public:
|
||||
///< This may be useful for plugins that determine the scaling of the
|
||||
///< video image and need to scale the OSD accordingly to fit on the
|
||||
///< screen.
|
||||
static int IsOpen(void) { return Osds.Size() && Osds[0]->level == 0; }
|
||||
static int IsOpen(void) { return Osds.Size() && Osds[0]->level == OSD_LEVEL_DEFAULT; }
|
||||
///< Returns true if there is currently a level 0 OSD open.
|
||||
int Left(void) { return left; }
|
||||
int Top(void) { return top; }
|
||||
@ -327,6 +341,7 @@ public:
|
||||
///< If the OSD has been divided into several sub-areas, all areas that
|
||||
///< are part of the rectangle that surrounds a given drawing operation
|
||||
///< will be drawn into, with the proper offsets.
|
||||
///< A new call overwrites any previous settings
|
||||
virtual void SaveRegion(int x1, int y1, int x2, int y2);
|
||||
///< Saves the region defined by the given coordinates for later restoration
|
||||
///< through RestoreRegion(). Only one saved region can be active at any
|
||||
@ -398,7 +413,7 @@ public:
|
||||
cOsdProvider(void);
|
||||
//XXX maybe parameter to make this one "sticky"??? (frame-buffer etc.)
|
||||
virtual ~cOsdProvider();
|
||||
static cOsd *NewOsd(int Left, int Top, uint Level = 0);
|
||||
static cOsd *NewOsd(int Left, int Top, uint Level = OSD_LEVEL_DEFAULT);
|
||||
///< Returns a pointer to a newly created cOsd object, which will be located
|
||||
///< at the given coordinates. When the cOsd object is no longer needed, the
|
||||
///< caller must delete it. If the OSD is already in use, or there is no OSD
|
||||
|
27
pat.c
27
pat.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: pat.c 1.17 2007/01/05 10:41:55 kls Exp $
|
||||
* $Id: pat.c 1.18 2007/09/02 10:44:19 kls Exp $
|
||||
*/
|
||||
|
||||
#include "pat.h"
|
||||
@ -331,11 +331,14 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
||||
int Ppid = pmt.getPCRPid();
|
||||
int Apids[MAXAPIDS + 1] = { 0 }; // these lists are zero-terminated
|
||||
int Dpids[MAXDPIDS + 1] = { 0 };
|
||||
int Spids[MAXSPIDS + 1] = { 0 };
|
||||
char ALangs[MAXAPIDS][MAXLANGCODE2] = { "" };
|
||||
char DLangs[MAXDPIDS][MAXLANGCODE2] = { "" };
|
||||
char SLangs[MAXSPIDS][MAXLANGCODE2] = { "" };
|
||||
int Tpid = 0;
|
||||
int NumApids = 0;
|
||||
int NumDpids = 0;
|
||||
int NumSpids = 0;
|
||||
for (SI::Loop::Iterator it; pmt.streamLoop.getNext(stream, it); ) {
|
||||
switch (stream.getStreamType()) {
|
||||
case 1: // STREAMTYPE_11172_VIDEO
|
||||
@ -387,6 +390,26 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
||||
case SI::AC3DescriptorTag:
|
||||
dpid = stream.getPid();
|
||||
break;
|
||||
case SI::SubtitlingDescriptorTag:
|
||||
if (NumSpids < MAXSPIDS) {
|
||||
Spids[NumSpids] = stream.getPid();
|
||||
SI::SubtitlingDescriptor *sd = (SI::SubtitlingDescriptor *)d;
|
||||
SI::SubtitlingDescriptor::Subtitling sub;
|
||||
char *s = SLangs[NumSpids];
|
||||
int n = 0;
|
||||
for (SI::Loop::Iterator it; sd->subtitlingLoop.getNext(sub, it); ) {
|
||||
if (sub.languageCode[0]) {
|
||||
if (n > 0)
|
||||
*s++ = '+';
|
||||
strn0cpy(s, I18nNormalizeLanguageCode(sub.languageCode), MAXLANGCODE1);
|
||||
s += strlen(s);
|
||||
if (n++ > 1)
|
||||
break;
|
||||
}
|
||||
}
|
||||
NumSpids++;
|
||||
}
|
||||
break;
|
||||
case SI::TeletextDescriptorTag:
|
||||
Tpid = stream.getPid();
|
||||
break;
|
||||
@ -416,7 +439,7 @@ void cPatFilter::Process(u_short Pid, u_char Tid, const u_char *Data, int Length
|
||||
}
|
||||
}
|
||||
if (Setup.UpdateChannels >= 2) {
|
||||
Channel->SetPids(Vpid, Vpid ? Ppid : 0, Apids, ALangs, Dpids, DLangs, Tpid);
|
||||
Channel->SetPids(Vpid, Vpid ? Ppid : 0, Apids, ALangs, Dpids, DLangs, Spids, SLangs, Tpid);
|
||||
Channel->SetCaIds(CaDescriptors->CaIds());
|
||||
}
|
||||
Channel->SetCaDescriptors(CaDescriptorHandler.AddCaDescriptors(CaDescriptors));
|
||||
|
3
player.h
3
player.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: player.h 1.19 2006/01/06 11:29:27 kls Exp $
|
||||
* $Id: player.h 1.20 2007/10/13 12:18:10 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __PLAYER_H
|
||||
@ -24,6 +24,7 @@ protected:
|
||||
bool DeviceSetCurrentAudioTrack(eTrackType Type) { return device ? device->SetCurrentAudioTrack(Type) : false; }
|
||||
bool DevicePoll(cPoller &Poller, int TimeoutMs = 0) { return device ? device->Poll(Poller, TimeoutMs) : false; }
|
||||
bool DeviceFlush(int TimeoutMs = 0) { return device ? device->Flush(TimeoutMs) : true; }
|
||||
bool DeviceHasIBPTrickSpeed(void) { return device ? device->HasIBPTrickSpeed() : false; }
|
||||
void DeviceTrickSpeed(int Speed) { if (device) device->TrickSpeed(Speed); }
|
||||
void DeviceClear(void) { if (device) device->Clear(); }
|
||||
void DevicePlay(void) { if (device) device->Play(); }
|
||||
|
401
po/ca_ES.po
401
po/ca_ES.po
File diff suppressed because it is too large
Load Diff
399
po/cs_CZ.po
399
po/cs_CZ.po
File diff suppressed because it is too large
Load Diff
399
po/da_DK.po
399
po/da_DK.po
File diff suppressed because it is too large
Load Diff
401
po/de_DE.po
401
po/de_DE.po
File diff suppressed because it is too large
Load Diff
399
po/el_GR.po
399
po/el_GR.po
File diff suppressed because it is too large
Load Diff
399
po/es_ES.po
399
po/es_ES.po
File diff suppressed because it is too large
Load Diff
399
po/et_EE.po
399
po/et_EE.po
File diff suppressed because it is too large
Load Diff
399
po/fi_FI.po
399
po/fi_FI.po
File diff suppressed because it is too large
Load Diff
399
po/fr_FR.po
399
po/fr_FR.po
File diff suppressed because it is too large
Load Diff
399
po/hr_HR.po
399
po/hr_HR.po
File diff suppressed because it is too large
Load Diff
424
po/hu_HU.po
424
po/hu_HU.po
File diff suppressed because it is too large
Load Diff
550
po/it_IT.po
550
po/it_IT.po
File diff suppressed because it is too large
Load Diff
399
po/nl_NL.po
399
po/nl_NL.po
File diff suppressed because it is too large
Load Diff
399
po/nn_NO.po
399
po/nn_NO.po
File diff suppressed because it is too large
Load Diff
399
po/pl_PL.po
399
po/pl_PL.po
File diff suppressed because it is too large
Load Diff
399
po/pt_PT.po
399
po/pt_PT.po
File diff suppressed because it is too large
Load Diff
399
po/ro_RO.po
399
po/ro_RO.po
File diff suppressed because it is too large
Load Diff
399
po/ru_RU.po
399
po/ru_RU.po
File diff suppressed because it is too large
Load Diff
399
po/sl_SI.po
399
po/sl_SI.po
File diff suppressed because it is too large
Load Diff
399
po/sv_SE.po
399
po/sv_SE.po
File diff suppressed because it is too large
Load Diff
399
po/tr_TR.po
399
po/tr_TR.po
File diff suppressed because it is too large
Load Diff
39
recording.c
39
recording.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: recording.c 1.154 2007/06/17 13:10:12 kls Exp $
|
||||
* $Id: recording.c 1.156 2007/10/14 10:21:54 kls Exp $
|
||||
*/
|
||||
|
||||
#include "recording.h"
|
||||
@ -296,6 +296,17 @@ cRecordingInfo::cRecordingInfo(const cChannel *Channel, const cEvent *Event)
|
||||
strn0cpy(Component->language, s, sizeof(Component->language));
|
||||
}
|
||||
}
|
||||
// The same applies to subtitles:
|
||||
for (int i = 0; i < MAXSPIDS; i++) {
|
||||
const char *s = Channel->Slang(i);
|
||||
if (*s) {
|
||||
tComponent *Component = Components->GetComponent(i, 3, 3);
|
||||
if (!Component)
|
||||
Components->SetComponent(Components->NumComponents(), 3, 3, s, NULL);
|
||||
else if (strlen(s) > strlen(Component->language))
|
||||
strn0cpy(Component->language, s, sizeof(Component->language));
|
||||
}
|
||||
}
|
||||
if (Components != event->Components())
|
||||
((cEvent *)event)->SetComponents(Components);
|
||||
}
|
||||
@ -818,6 +829,32 @@ bool cRecording::Remove(void)
|
||||
return RemoveVideoFile(FileName());
|
||||
}
|
||||
|
||||
bool cRecording::Undelete(void)
|
||||
{
|
||||
bool result = true;
|
||||
char *NewName = strdup(FileName());
|
||||
char *ext = strrchr(NewName, '.');
|
||||
if (ext && strcmp(ext, DELEXT) == 0) {
|
||||
strncpy(ext, RECEXT, strlen(ext));
|
||||
if (access(NewName, F_OK) == 0) {
|
||||
// the new name already exists, so let's not remove that one:
|
||||
esyslog("ERROR: attempt to undelete '%s', while recording '%s' exists", FileName(), NewName);
|
||||
result = false;
|
||||
}
|
||||
else {
|
||||
isyslog("undeleting recording '%s'", FileName());
|
||||
if (access(FileName(), F_OK) == 0)
|
||||
result = RenameVideoFile(FileName(), NewName);
|
||||
else {
|
||||
isyslog("deleted recording '%s' vanished", FileName());
|
||||
result = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
free(NewName);
|
||||
return result;
|
||||
}
|
||||
|
||||
void cRecording::ResetResume(void) const
|
||||
{
|
||||
resume = RESUME_NOT_INITIALIZED;
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: recording.h 1.57 2007/06/17 12:53:05 kls Exp $
|
||||
* $Id: recording.h 1.59 2007/10/14 10:11:34 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __RECORDING_H
|
||||
@ -72,6 +72,8 @@ private:
|
||||
mutable char *name;
|
||||
mutable int fileSizeMB;
|
||||
cRecordingInfo *info;
|
||||
cRecording(const cRecording&); // can't copy cRecording
|
||||
cRecording &operator=(const cRecording &); // can't assign cRecording
|
||||
static char *StripEpisodeName(char *s);
|
||||
char *SortName(void) const;
|
||||
int GetResume(void) const;
|
||||
@ -100,6 +102,10 @@ public:
|
||||
bool Remove(void);
|
||||
// Actually removes the file from the disk
|
||||
// Returns false in case of error
|
||||
bool Undelete(void);
|
||||
// Changes the file name so that it will be visible in the "Recordings" menu again and
|
||||
// not processed by cRemoveDeletedRecordingsThread.
|
||||
// Returns false in case of error
|
||||
};
|
||||
|
||||
class cRecordings : public cList<cRecording>, public cThread {
|
||||
|
30
remux.c
30
remux.c
@ -11,7 +11,7 @@
|
||||
* The cRepacker family's code was originally written by Reinhard Nissl <rnissl@gmx.de>,
|
||||
* and adapted to the VDR coding style by Klaus.Schmidinger@cadsoft.de.
|
||||
*
|
||||
* $Id: remux.c 1.58 2007/02/24 16:36:10 kls Exp $
|
||||
* $Id: remux.c 1.59 2007/09/22 12:08:22 kls Exp $
|
||||
*/
|
||||
|
||||
#include "remux.h"
|
||||
@ -1555,6 +1555,13 @@ void cTS2PES::send_ipack(void)
|
||||
buf[7] = 0x00;
|
||||
buf[8] = 0x00;
|
||||
count = 9;
|
||||
if (!repacker && subStreamId) {
|
||||
buf[9] = subStreamId;
|
||||
buf[10] = 1;
|
||||
buf[11] = 0;
|
||||
buf[12] = 1;
|
||||
count = 13;
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
buf[6] = 0x0F;
|
||||
@ -1766,6 +1773,19 @@ void cTS2PES::instant_repack(const uint8_t *Buf, int Count)
|
||||
return;
|
||||
}
|
||||
|
||||
if (!repacker && subStreamId) {
|
||||
while (c < Count && found < (hlength + 9) && found < plength + 6) {
|
||||
write_ipack(Buf + c, 1);
|
||||
c++;
|
||||
found++;
|
||||
}
|
||||
if (found == (hlength + 9)) {
|
||||
uchar sbuf[] = { 0x01, 0x00, 0x00 };
|
||||
write_ipack(&subStreamId, 1);
|
||||
write_ipack(sbuf, 3);
|
||||
}
|
||||
}
|
||||
|
||||
while (c < Count && found < plength + 6) {
|
||||
int l = Count - c;
|
||||
if (l + found > plength + 6)
|
||||
@ -1856,7 +1876,7 @@ void cTS2PES::ts_to_pes(const uint8_t *Buf) // don't need count (=188)
|
||||
cRemux::cRemux(int VPid, const int *APids, const int *DPids, const int *SPids, bool ExitOnFailure)
|
||||
{
|
||||
exitOnFailure = ExitOnFailure;
|
||||
isRadio = VPid == 0 || VPid == 1 || VPid == 0x1FFF;
|
||||
noVideo = VPid == 0 || VPid == 1 || VPid == 0x1FFF;
|
||||
numUPTerrors = 0;
|
||||
synced = false;
|
||||
skipped = 0;
|
||||
@ -1888,13 +1908,11 @@ cRemux::cRemux(int VPid, const int *APids, const int *DPids, const int *SPids, b
|
||||
while (*DPids && numTracks < MAXTRACKS && n < MAXDPIDS)
|
||||
ts2pes[numTracks++] = new cTS2PES(*DPids++, resultBuffer, IPACKS, 0x00, 0x80 + n++, new cDolbyRepacker);
|
||||
}
|
||||
/* future...
|
||||
if (SPids) {
|
||||
int n = 0;
|
||||
while (*SPids && numTracks < MAXTRACKS && n < MAXSPIDS)
|
||||
ts2pes[numTracks++] = new cTS2PES(*SPids++, resultBuffer, IPACKS, 0x00, 0x28 + n++);
|
||||
ts2pes[numTracks++] = new cTS2PES(*SPids++, resultBuffer, IPACKS, 0x00, 0x20 + n++);
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
cRemux::~cRemux()
|
||||
@ -2080,7 +2098,7 @@ uchar *cRemux::Get(int &Count, uchar *PictureType)
|
||||
l = GetPacketLength(data, resultCount, i);
|
||||
if (l < 0)
|
||||
return resultData;
|
||||
if (isRadio) {
|
||||
if (noVideo) {
|
||||
if (!synced) {
|
||||
if (PictureType)
|
||||
*PictureType = I_FRAME;
|
||||
|
4
remux.h
4
remux.h
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: remux.h 1.16 2006/03/25 12:27:30 kls Exp $
|
||||
* $Id: remux.h 1.17 2007/09/02 10:19:06 kls Exp $
|
||||
*/
|
||||
|
||||
#ifndef __REMUX_H
|
||||
@ -37,7 +37,7 @@ class cTS2PES;
|
||||
class cRemux {
|
||||
private:
|
||||
bool exitOnFailure;
|
||||
bool isRadio;
|
||||
bool noVideo;
|
||||
int numUPTerrors;
|
||||
bool synced;
|
||||
int skipped;
|
||||
|
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: sections.c 1.14 2005/09/18 11:30:29 kls Exp $
|
||||
* $Id: sections.c 1.15 2007/10/14 12:52:07 kls Exp $
|
||||
*/
|
||||
|
||||
#include "sections.h"
|
||||
@ -105,7 +105,7 @@ void cSectionHandler::Del(const cFilterData *FilterData)
|
||||
for (fh = filterHandles.First(); fh; fh = filterHandles.Next(fh)) {
|
||||
if (fh->filterData.Is(FilterData->pid, FilterData->tid, FilterData->mask)) {
|
||||
if (--fh->used <= 0) {
|
||||
close(fh->handle);
|
||||
device->CloseFilter(fh->handle);
|
||||
filterHandles.Del(fh);
|
||||
break;
|
||||
}
|
||||
|
4
svdrp.c
4
svdrp.c
@ -10,7 +10,7 @@
|
||||
* and interact with the Video Disk Recorder - or write a full featured
|
||||
* graphical interface that sits on top of an SVDRP connection.
|
||||
*
|
||||
* $Id: svdrp.c 1.103 2007/08/25 09:28:26 kls Exp $
|
||||
* $Id: svdrp.c 1.104 2007/10/13 10:17:48 kls Exp $
|
||||
*/
|
||||
|
||||
#include "svdrp.h"
|
||||
@ -819,7 +819,7 @@ void cSVDRP::CmdHELP(const char *Option)
|
||||
if (*Option) {
|
||||
const char *hp = GetHelpPage(Option, HelpPages);
|
||||
if (hp)
|
||||
Reply(214, "%s", hp);
|
||||
Reply(-214, "%s", hp);
|
||||
else {
|
||||
Reply(504, "HELP topic \"%s\" unknown", Option);
|
||||
return;
|
||||
|
4
tools.c
4
tools.c
@ -4,7 +4,7 @@
|
||||
* See the main source file 'vdr.c' for copyright information and
|
||||
* how to reach the author.
|
||||
*
|
||||
* $Id: tools.c 1.135 2007/08/05 12:18:15 kls Exp $
|
||||
* $Id: tools.c 1.136 2007/10/13 12:00:21 kls Exp $
|
||||
*/
|
||||
|
||||
#include "tools.h"
|
||||
@ -791,7 +791,7 @@ const char *cCharSetConv::Convert(const char *From, char *To, size_t ToLength)
|
||||
size_t d = ToPtr - result;
|
||||
size_t r = length / 2;
|
||||
length += r;
|
||||
result = (char *)realloc(result, length);
|
||||
Converted = result = (char *)realloc(result, length);
|
||||
ToLength += r;
|
||||
ToPtr = result + d;
|
||||
}
|
||||
|
6
vdr.5
6
vdr.5
@ -8,7 +8,7 @@
|
||||
.\" License as specified in the file COPYING that comes with the
|
||||
.\" vdr distribution.
|
||||
.\"
|
||||
.\" $Id: vdr.5 1.63 2007/08/05 12:58:35 kls Exp $
|
||||
.\" $Id: vdr.5 1.64 2007/08/26 10:57:08 kls Exp $
|
||||
.\"
|
||||
.TH vdr 5 "07 Jan 2007" "1.4.5" "Video Disk Recorder Files"
|
||||
.SH NAME
|
||||
@ -557,6 +557,8 @@ a recording is split into several files. The contents of these files is
|
||||
0xC0...0xDF for audio 1...32 (up to 32 audio tracks may occur).
|
||||
Dolby Digital data is stored in packets with ids 0xBD ("Private Stream 1")
|
||||
and substream ids 0x80...0x87.
|
||||
DVB subtitle data is stored in packets with ids 0xBD ("Private Stream 1")
|
||||
and substream ids 0x20...0x27.
|
||||
.SS INDEX
|
||||
The file \fIindex.vdr\fR (if present in a recording directory) contains
|
||||
the (binary) index data into each of the the recording files
|
||||
@ -646,7 +648,7 @@ l l.
|
||||
<title> @is the title of the event
|
||||
<short text> @is the short text of the event (typically the name of the episode etc.)
|
||||
<description> @is the description of the event (any '|' characters will be interpreted as newlines)
|
||||
<stream> @is the stream content (1 = video, 2 = audio)
|
||||
<stream> @is the stream content (1 = video, 2 = audio, 3 = subtitles)
|
||||
<type> @is the stream type according to ETSI EN 300 468
|
||||
<language> @is the three letter language code (optionally two codes, separated by '+')
|
||||
<descr> @is the description of this stream component
|
||||
|
14
vdr.c
14
vdr.c
@ -22,7 +22,7 @@
|
||||
*
|
||||
* The project's page is at http://www.cadsoft.de/vdr
|
||||
*
|
||||
* $Id: vdr.c 1.299 2007/08/25 08:51:13 kls Exp $
|
||||
* $Id: vdr.c 1.300 2007/08/26 14:36:48 kls Exp $
|
||||
*/
|
||||
|
||||
#include <getopt.h>
|
||||
@ -1009,6 +1009,18 @@ int main(int argc, char *argv[])
|
||||
cDisplayTracks::Process(key);
|
||||
key = kNone;
|
||||
break;
|
||||
// Subtitle track control:
|
||||
case kSubtitles:
|
||||
if (cControl::Control())
|
||||
cControl::Control()->Hide();
|
||||
if (!cDisplaySubtitleTracks::IsOpen()) {
|
||||
DELETE_MENU;
|
||||
Menu = cDisplaySubtitleTracks::Create();
|
||||
}
|
||||
else
|
||||
cDisplaySubtitleTracks::Process(key);
|
||||
key = kNone;
|
||||
break;
|
||||
// Pausing live video:
|
||||
case kPause:
|
||||
if (!cControl::Control()) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user