From 55be86915152727c06d0ab135efa69ab3332c928 Mon Sep 17 00:00:00 2001 From: Darren Salt Date: Wed, 11 Jul 2007 15:58:11 +0100 Subject: Update libxine1.pot. --- po/libxine1.pot | 677 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 344 insertions(+), 333 deletions(-) diff --git a/po/libxine1.pot b/po/libxine1.pot index 9a9aebafc..077b48dd7 100644 --- a/po/libxine1.pot +++ b/po/libxine1.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: xine-devel@lists.sourceforge.net\n" -"POT-Creation-Date: 2007-04-06 15:39+0200\n" +"POT-Creation-Date: 2007-07-11 15:56+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -41,117 +41,117 @@ msgstr "" msgid "Unknown error" msgstr "" -#: src/audio_out/audio_alsa_out.c:354 +#: src/audio_out/audio_alsa_out.c:353 #, c-format msgid "audio_alsa_out:Already open...WHY!" msgstr "" -#: src/audio_out/audio_alsa_out.c:382 +#: src/audio_out/audio_alsa_out.c:381 #, c-format msgid "audio_alsa_out: snd_pcm_open() of %s failed: %s\n" msgstr "" -#: src/audio_out/audio_alsa_out.c:384 +#: src/audio_out/audio_alsa_out.c:383 msgid "audio_alsa_out: >>> check if another program already uses PCM <<<\n" msgstr "" -#: src/audio_out/audio_alsa_out.c:397 +#: src/audio_out/audio_alsa_out.c:396 #, c-format msgid "" "audio_alsa_out: broken configuration for this PCM: no configurations " "available: %s\n" msgstr "" -#: src/audio_out/audio_alsa_out.c:1289 +#: src/audio_out/audio_alsa_out.c:1294 msgid "notify changes to the hardware mixer" msgstr "" -#: src/audio_out/audio_alsa_out.c:1290 +#: src/audio_out/audio_alsa_out.c:1295 msgid "" "When the hardware mixer changes, your application will receive a " "notification so that it can update its graphical representation of the mixer " "settings on the fly." msgstr "" -#: src/audio_out/audio_alsa_out.c:1355 +#: src/audio_out/audio_alsa_out.c:1360 #, c-format msgid "snd_lib_error_set_handler() failed: %d" msgstr "" -#: src/audio_out/audio_alsa_out.c:1362 +#: src/audio_out/audio_alsa_out.c:1367 msgid "sound card can do mmap" msgstr "" -#: src/audio_out/audio_alsa_out.c:1363 +#: src/audio_out/audio_alsa_out.c:1368 msgid "" "Enable this, if your sound card and alsa driver support memory mapped IO.\n" "You can try enabling it and check, if everything works. If it does, this " "will increase performance." msgstr "" -#: src/audio_out/audio_alsa_out.c:1372 +#: src/audio_out/audio_alsa_out.c:1377 msgid "device used for mono output" msgstr "" -#: src/audio_out/audio_alsa_out.c:1373 +#: src/audio_out/audio_alsa_out.c:1378 msgid "" "xine will use this alsa device to output mono sound.\n" "See the alsa documentation for information on alsa devices." msgstr "" -#: src/audio_out/audio_alsa_out.c:1381 +#: src/audio_out/audio_alsa_out.c:1386 msgid "device used for stereo output" msgstr "" -#: src/audio_out/audio_alsa_out.c:1382 +#: src/audio_out/audio_alsa_out.c:1387 msgid "" "xine will use this alsa device to output stereo sound.\n" "See the alsa documentation for information on alsa devices." msgstr "" -#: src/audio_out/audio_alsa_out.c:1390 +#: src/audio_out/audio_alsa_out.c:1395 msgid "device used for 4-channel output" msgstr "" -#: src/audio_out/audio_alsa_out.c:1391 +#: src/audio_out/audio_alsa_out.c:1396 msgid "" "xine will use this alsa device to output 4 channel (4.0) surround sound.\n" "See the alsa documentation for information on alsa devices." msgstr "" -#: src/audio_out/audio_alsa_out.c:1400 src/audio_out/audio_alsa_out.c:1410 +#: src/audio_out/audio_alsa_out.c:1405 src/audio_out/audio_alsa_out.c:1415 msgid "device used for 5.1-channel output" msgstr "" -#: src/audio_out/audio_alsa_out.c:1401 +#: src/audio_out/audio_alsa_out.c:1406 msgid "" "xine will use this alsa device to output 5 channel plus LFE (5.1) surround " "sound.\n" "See the alsa documentation for information on alsa devices." msgstr "" -#: src/audio_out/audio_alsa_out.c:1411 +#: src/audio_out/audio_alsa_out.c:1416 msgid "" "xine will use this alsa device to output undecoded digital surround sound. " "This can be used be external surround decoders.\n" "See the alsa documentation for information on alsa devices." msgstr "" -#: src/audio_out/audio_alsa_out.c:1431 +#: src/audio_out/audio_alsa_out.c:1436 #, c-format msgid "snd_pcm_open() failed:%d:%s\n" msgstr "" -#: src/audio_out/audio_alsa_out.c:1433 +#: src/audio_out/audio_alsa_out.c:1438 #, c-format msgid ">>> Check if another program already uses PCM <<<\n" msgstr "" -#: src/audio_out/audio_alsa_out.c:1464 src/audio_out/audio_oss_out.c:929 +#: src/audio_out/audio_alsa_out.c:1469 src/audio_out/audio_oss_out.c:929 msgid "speaker arrangement" msgstr "" -#: src/audio_out/audio_alsa_out.c:1465 src/audio_out/audio_oss_out.c:930 +#: src/audio_out/audio_alsa_out.c:1470 src/audio_out/audio_oss_out.c:930 msgid "" "Select how your speakers are arranged, this determines which speakers xine " "uses for sound output. The individual values are:\n" @@ -183,85 +183,85 @@ msgid "" "formats you want to play to your sound card's digital output." msgstr "" -#: src/audio_out/audio_alsa_out.c:1494 +#: src/audio_out/audio_alsa_out.c:1499 msgid "audio_alsa_out : supported modes are " msgstr "" -#: src/audio_out/audio_alsa_out.c:1497 +#: src/audio_out/audio_alsa_out.c:1502 msgid "8bit " msgstr "" -#: src/audio_out/audio_alsa_out.c:1502 +#: src/audio_out/audio_alsa_out.c:1507 msgid "16bit " msgstr "" -#: src/audio_out/audio_alsa_out.c:1506 +#: src/audio_out/audio_alsa_out.c:1511 msgid "24bit " msgstr "" -#: src/audio_out/audio_alsa_out.c:1510 +#: src/audio_out/audio_alsa_out.c:1515 msgid "32bit " msgstr "" -#: src/audio_out/audio_alsa_out.c:1521 +#: src/audio_out/audio_alsa_out.c:1526 msgid "mono " msgstr "" -#: src/audio_out/audio_alsa_out.c:1525 +#: src/audio_out/audio_alsa_out.c:1530 msgid "stereo " msgstr "" -#: src/audio_out/audio_alsa_out.c:1530 +#: src/audio_out/audio_alsa_out.c:1535 msgid "4-channel " msgstr "" -#: src/audio_out/audio_alsa_out.c:1533 +#: src/audio_out/audio_alsa_out.c:1538 msgid "(4-channel not enabled in xine config) " msgstr "" -#: src/audio_out/audio_alsa_out.c:1538 +#: src/audio_out/audio_alsa_out.c:1543 msgid "4.1-channel " msgstr "" -#: src/audio_out/audio_alsa_out.c:1541 +#: src/audio_out/audio_alsa_out.c:1546 msgid "(4.1-channel not enabled in xine config) " msgstr "" -#: src/audio_out/audio_alsa_out.c:1546 +#: src/audio_out/audio_alsa_out.c:1551 msgid "5-channel " msgstr "" -#: src/audio_out/audio_alsa_out.c:1549 +#: src/audio_out/audio_alsa_out.c:1554 msgid "(5-channel not enabled in xine config) " msgstr "" -#: src/audio_out/audio_alsa_out.c:1554 +#: src/audio_out/audio_alsa_out.c:1559 msgid "5.1-channel " msgstr "" -#: src/audio_out/audio_alsa_out.c:1557 +#: src/audio_out/audio_alsa_out.c:1562 msgid "(5.1-channel not enabled in xine config) " msgstr "" -#: src/audio_out/audio_alsa_out.c:1580 +#: src/audio_out/audio_alsa_out.c:1585 msgid "a/52 and DTS pass-through\n" msgstr "" -#: src/audio_out/audio_alsa_out.c:1583 +#: src/audio_out/audio_alsa_out.c:1588 msgid "(a/52 and DTS pass-through not enabled in xine config)\n" msgstr "" -#: src/audio_out/audio_alsa_out.c:1590 +#: src/audio_out/audio_alsa_out.c:1595 msgid "alsa mixer device" msgstr "" -#: src/audio_out/audio_alsa_out.c:1591 +#: src/audio_out/audio_alsa_out.c:1596 msgid "" "xine will use this alsa mixer device to change the volume.\n" "See the alsa documentation for information on alsa devices." msgstr "" -#: src/audio_out/audio_alsa_out.c:1665 +#: src/audio_out/audio_alsa_out.c:1670 msgid "xine audio output plugin using alsa-compliant audio devices/drivers" msgstr "" @@ -273,201 +273,201 @@ msgstr "" msgid "xine output plugin for Coreaudio/Mac OS X" msgstr "" -#: src/audio_out/audio_directx2_out.c:166 +#: src/audio_out/audio_directx2_out.c:163 msgid "Error" msgstr "" -#: src/audio_out/audio_directx2_out.c:173 +#: src/audio_out/audio_directx2_out.c:170 msgid "success" msgstr "" -#: src/audio_out/audio_directx2_out.c:175 +#: src/audio_out/audio_directx2_out.c:172 msgid "access denied" msgstr "" -#: src/audio_out/audio_directx2_out.c:177 +#: src/audio_out/audio_directx2_out.c:174 msgid "resource is already in use" msgstr "" -#: src/audio_out/audio_directx2_out.c:178 +#: src/audio_out/audio_directx2_out.c:175 msgid "object was already initialized" msgstr "" -#: src/audio_out/audio_directx2_out.c:179 +#: src/audio_out/audio_directx2_out.c:176 msgid "specified wave format is not supported" msgstr "" -#: src/audio_out/audio_directx2_out.c:180 +#: src/audio_out/audio_directx2_out.c:177 msgid "memory buffer has been lost and must be restored" msgstr "" -#: src/audio_out/audio_directx2_out.c:181 +#: src/audio_out/audio_directx2_out.c:178 msgid "requested buffer control is not available" msgstr "" -#: src/audio_out/audio_directx2_out.c:182 +#: src/audio_out/audio_directx2_out.c:179 msgid "undetermined error inside DirectSound subsystem" msgstr "" -#: src/audio_out/audio_directx2_out.c:184 +#: src/audio_out/audio_directx2_out.c:181 msgid "DirectSound hardware device is unavailable" msgstr "" -#: src/audio_out/audio_directx2_out.c:186 +#: src/audio_out/audio_directx2_out.c:183 msgid "function is not valid for the current state of the object" msgstr "" -#: src/audio_out/audio_directx2_out.c:187 +#: src/audio_out/audio_directx2_out.c:184 msgid "invalid parameter was passed" msgstr "" -#: src/audio_out/audio_directx2_out.c:188 +#: src/audio_out/audio_directx2_out.c:185 msgid "object doesn't support aggregation" msgstr "" -#: src/audio_out/audio_directx2_out.c:189 +#: src/audio_out/audio_directx2_out.c:186 msgid "no sound driver available for use" msgstr "" -#: src/audio_out/audio_directx2_out.c:190 +#: src/audio_out/audio_directx2_out.c:187 msgid "requested COM interface not available" msgstr "" -#: src/audio_out/audio_directx2_out.c:191 +#: src/audio_out/audio_directx2_out.c:188 msgid "another application has a higher priority level" msgstr "" -#: src/audio_out/audio_directx2_out.c:192 +#: src/audio_out/audio_directx2_out.c:189 msgid "insufficient memory" msgstr "" -#: src/audio_out/audio_directx2_out.c:193 +#: src/audio_out/audio_directx2_out.c:190 msgid "low priority level for this function" msgstr "" -#: src/audio_out/audio_directx2_out.c:194 +#: src/audio_out/audio_directx2_out.c:191 msgid "DirectSound wasn't initialized" msgstr "" -#: src/audio_out/audio_directx2_out.c:195 +#: src/audio_out/audio_directx2_out.c:192 msgid "function is not supported" msgstr "" -#: src/audio_out/audio_directx2_out.c:196 +#: src/audio_out/audio_directx2_out.c:193 msgid "unknown error" msgstr "" -#: src/audio_out/audio_directx2_out.c:206 +#: src/audio_out/audio_directx2_out.c:203 #, c-format msgid "Unable to create direct sound object." msgstr "" -#: src/audio_out/audio_directx2_out.c:212 +#: src/audio_out/audio_directx2_out.c:209 #, c-format msgid "Could not set direct sound cooperative level." msgstr "" -#: src/audio_out/audio_directx2_out.c:286 +#: src/audio_out/audio_directx2_out.c:283 msgid "Unable to create secondary direct sound buffer" msgstr "" -#: src/audio_out/audio_directx2_out.c:310 +#: src/audio_out/audio_directx2_out.c:307 #, c-format msgid "Unable to create buffer position events." msgstr "" -#: src/audio_out/audio_directx2_out.c:318 +#: src/audio_out/audio_directx2_out.c:315 msgid "Unable to get notification interface" msgstr "" -#: src/audio_out/audio_directx2_out.c:323 +#: src/audio_out/audio_directx2_out.c:320 msgid "Unable to set notification positions" msgstr "" -#: src/audio_out/audio_directx2_out.c:343 +#: src/audio_out/audio_directx2_out.c:340 msgid "Couldn't play sound buffer" msgstr "" -#: src/audio_out/audio_directx2_out.c:355 +#: src/audio_out/audio_directx2_out.c:352 msgid "Couldn't stop sound buffer" msgstr "" -#: src/audio_out/audio_directx2_out.c:368 +#: src/audio_out/audio_directx2_out.c:365 msgid "Can't get buffer position" msgstr "" -#: src/audio_out/audio_directx2_out.c:382 +#: src/audio_out/audio_directx2_out.c:379 msgid "Can't set buffer position" msgstr "" -#: src/audio_out/audio_directx2_out.c:414 +#: src/audio_out/audio_directx2_out.c:411 msgid "Can't set sound volume" msgstr "" -#: src/audio_out/audio_directx2_out.c:432 +#: src/audio_out/audio_directx2_out.c:429 #, c-format msgid ": buffer lost, tryig to restore\n" msgstr "" -#: src/audio_out/audio_directx2_out.c:436 +#: src/audio_out/audio_directx2_out.c:433 msgid "Couldn't lock direct sound buffer" msgstr "" -#: src/audio_out/audio_directx2_out.c:447 +#: src/audio_out/audio_directx2_out.c:444 msgid "Couldn't unlock direct sound buffer" msgstr "" -#: src/audio_out/audio_directx2_out.c:544 +#: src/audio_out/audio_directx2_out.c:541 #, c-format msgid "Unable to create primary direct sound buffer." msgstr "" -#: src/audio_out/audio_directx2_out.c:637 +#: src/audio_out/audio_directx2_out.c:634 #, c-format msgid ": play cursor overran, flushing buffers\n" msgstr "" -#: src/audio_out/audio_directx2_out.c:655 +#: src/audio_out/audio_directx2_out.c:652 #, c-format msgid ": delayed by %ld msec\n" msgstr "" -#: src/audio_out/audio_directx2_out.c:759 +#: src/audio_out/audio_directx2_out.c:756 #, c-format msgid ": can't create pthread condition: %s\n" msgstr "" -#: src/audio_out/audio_directx2_out.c:763 +#: src/audio_out/audio_directx2_out.c:760 #, c-format msgid ": can't create pthread mutex: %s\n" msgstr "" -#: src/audio_out/audio_directx2_out.c:770 +#: src/audio_out/audio_directx2_out.c:767 #, c-format msgid ": can't create buffer pthread: %s\n" msgstr "" -#: src/audio_out/audio_directx2_out.c:877 +#: src/audio_out/audio_directx2_out.c:874 #, c-format msgid ": can't destroy buffer pthread: %s\n" msgstr "" -#: src/audio_out/audio_directx2_out.c:884 +#: src/audio_out/audio_directx2_out.c:881 #, c-format msgid ": can't destroy pthread condition: %s\n" msgstr "" -#: src/audio_out/audio_directx2_out.c:887 +#: src/audio_out/audio_directx2_out.c:884 #, c-format msgid ": can't destroy pthread mutex: %s\n" msgstr "" -#: src/audio_out/audio_directx2_out.c:947 +#: src/audio_out/audio_directx2_out.c:944 #, c-format msgid ": unknown control command %d\n" msgstr "" -#: src/audio_out/audio_directx2_out.c:1003 +#: src/audio_out/audio_directx2_out.c:1000 msgid "second xine audio output plugin using directx" msgstr "" @@ -1319,118 +1319,129 @@ msgid "" "A value of zero here will disable the slowdown." msgstr "" -#: src/input/input_dvb.c:881 +#: src/input/input_dvb.c:895 #, c-format -msgid "input_dvb: failed to open dvb channel file '%s'\n" +msgid "input_dvb: failed to open dvb channel file '%s': %s\n" msgstr "" -#: src/input/input_dvb.c:2082 src/input/input_dvb.c:2910 +#: src/input/input_dvb.c:901 +#, c-format +msgid "input_dvb: dvb channel file '%s' is not a plain file\n" +msgstr "" + +#: src/input/input_dvb.c:2111 src/input/input_dvb.c:2943 msgid "input_dvb: tuner_set_channel failed\n" msgstr "" -#: src/input/input_dvb.c:2710 +#: src/input/input_dvb.c:2743 msgid "input_dvb: cannot open dvb device\n" msgstr "" -#: src/input/input_dvb.c:2734 +#: src/input/input_dvb.c:2767 #, c-format msgid "input_dvb: channel %d out of range, defaulting to 0\n" msgstr "" -#: src/input/input_dvb.c:2745 +#: src/input/input_dvb.c:2778 #, c-format msgid "input_dvb: searching for channel %s\n" msgstr "" -#: src/input/input_dvb.c:2768 +#: src/input/input_dvb.c:2801 #, c-format msgid "input_dvb: exact match for %s not found: trying partial matches\n" msgstr "" -#: src/input/input_dvb.c:2775 +#: src/input/input_dvb.c:2808 #, c-format msgid "input_dvb: found matching channel %s\n" msgstr "" -#: src/input/input_dvb.c:2788 +#: src/input/input_dvb.c:2821 #, c-format msgid "input_dvb: channel %s not found in channels.conf, defaulting.\n" msgstr "" -#: src/input/input_dvb.c:2794 +#: src/input/input_dvb.c:2827 msgid "" "input_dvb: invalid channel specification, defaulting to last viewed " "channel.\n" msgstr "" -#: src/input/input_dvb.c:2800 +#: src/input/input_dvb.c:2833 msgid "input_dvb: invalid channel specification, defaulting to channel 0\n" msgstr "" -#: src/input/input_dvb.c:2812 +#: src/input/input_dvb.c:2845 msgid "" "input_dvb: dvbs mrl specified but the tuner doesn't appear to be QPSK (DVB-" "S)\n" msgstr "" -#: src/input/input_dvb.c:2832 +#: src/input/input_dvb.c:2865 msgid "" "input_dvb: dvbt mrl specified but the tuner doesn't appear to be OFDM (DVB-" "T)\n" msgstr "" -#: src/input/input_dvb.c:2855 src/input/input_dvb.c:2881 +#: src/input/input_dvb.c:2888 msgid "" "input_dvb: dvbc mrl specified but the tuner doesn't appear to be QAM (DVB-" "C)\n" msgstr "" -#: src/input/input_dvb.c:2916 +#: src/input/input_dvb.c:2914 +msgid "" +"input_dvb: dvba mrl specified but the tuner doesn't appear to be ATSC (DVB-" +"A)\n" +msgstr "" + +#: src/input/input_dvb.c:2949 #, c-format msgid "input_dvb: cannot open dvr device '%s'\n" msgstr "" -#: src/input/input_dvb.c:2938 +#: src/input/input_dvb.c:2971 msgid "input_dvb: cannot create EPG updater thread\n" msgstr "" -#: src/input/input_dvb.c:3000 +#: src/input/input_dvb.c:3033 msgid "use DVB 'center cutout' (zoom)" msgstr "" -#: src/input/input_dvb.c:3001 +#: src/input/input_dvb.c:3034 msgid "" "This will allow fullscreen playback of 4:3 content transmitted in a 16:9 " "frame." msgstr "" -#: src/input/input_dvb.c:3094 +#: src/input/input_dvb.c:3127 msgid "DVB (Digital TV) input plugin" msgstr "" -#: src/input/input_dvb.c:3242 +#: src/input/input_dvb.c:3241 msgid "Remember last DVB channel watched" msgstr "" -#: src/input/input_dvb.c:3243 +#: src/input/input_dvb.c:3242 msgid "" "On autoplay, xine will remember and switch to the channel indicated in media." "dvb.last_channel. " msgstr "" -#: src/input/input_dvb.c:3250 +#: src/input/input_dvb.c:3249 msgid "Last DVB channel viewed" msgstr "" -#: src/input/input_dvb.c:3251 +#: src/input/input_dvb.c:3250 msgid "If enabled xine will remember and switch to this channel. " msgstr "" -#: src/input/input_dvb.c:3257 +#: src/input/input_dvb.c:3256 msgid "Number of dvb card to use." msgstr "" -#: src/input/input_dvb.c:3258 +#: src/input/input_dvb.c:3257 msgid "" "Leave this at zero unless you really have more than 1 card in your system." msgstr "" @@ -1444,25 +1455,25 @@ msgstr "" msgid "input_dvd: Error getting next block from DVD (%s)\n" msgstr "" -#: src/input/input_dvd.c:1498 +#: src/input/input_dvd.c:1500 msgid "input_dvd: Error opening DVD device\n" msgstr "" -#: src/input/input_dvd.c:1781 +#: src/input/input_dvd.c:1786 msgid "device used for DVD playback" msgstr "" -#: src/input/input_dvd.c:1782 +#: src/input/input_dvd.c:1787 msgid "" "The path to the device, usually a DVD drive, which you intend to use for " "playing DVDs." msgstr "" -#: src/input/input_dvd.c:1800 +#: src/input/input_dvd.c:1805 msgid "raw device set up for DVD access" msgstr "" -#: src/input/input_dvd.c:1801 +#: src/input/input_dvd.c:1806 msgid "" "If this points to a raw device connected to your DVD device, xine will use " "the raw device for playback. This has the advantage of being slightly faster " @@ -1473,22 +1484,22 @@ msgid "" "See the documentation on raw device setup (man raw) for further information." msgstr "" -#: src/input/input_dvd.c:1814 +#: src/input/input_dvd.c:1819 msgid "CSS decryption method" msgstr "" -#: src/input/input_dvd.c:1815 +#: src/input/input_dvd.c:1820 msgid "" "Selects the decryption method libdvdcss will use to descramble copy " "protected DVDs. Try the various methods, if you have problems playing " "scrambled DVDs." msgstr "" -#: src/input/input_dvd.c:1823 +#: src/input/input_dvd.c:1828 msgid "path to the title key cache" msgstr "" -#: src/input/input_dvd.c:1824 +#: src/input/input_dvd.c:1829 msgid "" "Since cracking the copy protection of scrambled DVDs can be quite time " "consuming, libdvdcss will cache the cracked keys in this directory.\n" @@ -1497,44 +1508,44 @@ msgid "" "used for anything but DVD key caching." msgstr "" -#: src/input/input_dvd.c:1846 +#: src/input/input_dvd.c:1851 msgid "region the DVD player claims to be in (1 to 8)" msgstr "" -#: src/input/input_dvd.c:1847 +#: src/input/input_dvd.c:1852 msgid "" "This only needs to be changed if your DVD jumps to a screen complaining " "about a wrong region code. It has nothing to do with the region code set in " "DVD drives, this is purely software." msgstr "" -#: src/input/input_dvd.c:1853 +#: src/input/input_dvd.c:1858 msgid "default language for DVD playback" msgstr "" -#: src/input/input_dvd.c:1854 +#: src/input/input_dvd.c:1859 msgid "" "xine tries to use this language as a default for DVD playback. As far as the " "DVD supports it, menus and audio tracks will be presented in this language.\n" "The value must be a two character ISO639 language code." msgstr "" -#: src/input/input_dvd.c:1860 +#: src/input/input_dvd.c:1865 msgid "read-ahead caching" msgstr "" -#: src/input/input_dvd.c:1861 +#: src/input/input_dvd.c:1866 msgid "" "xine can use a read ahead cache for DVD drive access.\n" "This may lead to jerky playback on slow drives, but it improves the impact " "of the DVD layer change on faster drives." msgstr "" -#: src/input/input_dvd.c:1867 +#: src/input/input_dvd.c:1872 msgid "unit for the skip action" msgstr "" -#: src/input/input_dvd.c:1868 +#: src/input/input_dvd.c:1873 msgid "" "You can configure the behaviour when issuing a skip command (using the skip " "buttons for example). The individual values mean:\n" @@ -1553,11 +1564,11 @@ msgid "" "features on the DVD" msgstr "" -#: src/input/input_dvd.c:1883 +#: src/input/input_dvd.c:1888 msgid "unit for seeking" msgstr "" -#: src/input/input_dvd.c:1884 +#: src/input/input_dvd.c:1889 msgid "" "You can configure the domain spanned by the seek slider. The individual " "values mean:\n" @@ -1571,11 +1582,11 @@ msgid "" "chapter of the current feature" msgstr "" -#: src/input/input_dvd.c:1895 +#: src/input/input_dvd.c:1900 msgid "play mode when title/chapter is given" msgstr "" -#: src/input/input_dvd.c:1896 +#: src/input/input_dvd.c:1901 msgid "" "You can configure the behaviour when playing a dvd from a given title/" "chapter (eg. using MRL 'dvd:/1.2'). The individual values mean:\n" @@ -1592,38 +1603,38 @@ msgstr "" msgid "input_file: read error (%s)\n" msgstr "" -#: src/input/input_file.c:400 +#: src/input/input_file.c:380 #, c-format msgid "input_file: Permission denied: >%s<\n" msgstr "" -#: src/input/input_file.c:405 +#: src/input/input_file.c:385 #, c-format msgid "input_file: File not found: >%s<\n" msgstr "" -#: src/input/input_file.c:437 src/input/input_gnome_vfs.c:292 +#: src/input/input_file.c:421 src/input/input_gnome_vfs.c:292 #, c-format msgid "input_file: File empty: >%s<\n" msgstr "" -#: src/input/input_file.c:658 +#: src/input/input_file.c:642 msgid "file input plugin" msgstr "" -#: src/input/input_file.c:1027 +#: src/input/input_file.c:1011 msgid "file browsing start location" msgstr "" -#: src/input/input_file.c:1028 +#: src/input/input_file.c:1012 msgid "The browser to select the file to play will start at this location." msgstr "" -#: src/input/input_file.c:1035 +#: src/input/input_file.c:1019 msgid "list hidden files" msgstr "" -#: src/input/input_file.c:1036 +#: src/input/input_file.c:1020 msgid "" "If enabled, the browser to select the file to play will also show hidden " "files." @@ -1633,87 +1644,87 @@ msgstr "" msgid "gnome-vfs input plugin as shipped with xine" msgstr "" -#: src/input/input_http.c:174 +#: src/input/input_http.c:178 #, c-format msgid "input_http: gethostbyname(%s) failed: %s\n" msgstr "" -#: src/input/input_http.c:400 src/input/input_http.c:943 +#: src/input/input_http.c:423 src/input/input_http.c:969 #, c-format msgid "input_http: read error %d\n" msgstr "" -#: src/input/input_http.c:627 +#: src/input/input_http.c:650 msgid "Connecting HTTP server..." msgstr "" -#: src/input/input_http.c:819 +#: src/input/input_http.c:841 #, c-format msgid "input_http: invalid http answer\n" msgstr "" -#: src/input/input_http.c:825 +#: src/input/input_http.c:847 #, c-format msgid "input_http: 3xx redirection: >%d %s<\n" msgstr "" -#: src/input/input_http.c:830 src/input/input_http.c:836 -#: src/input/input_http.c:843 +#: src/input/input_http.c:852 src/input/input_http.c:858 +#: src/input/input_http.c:865 #, c-format msgid "input_http: http status not 2xx: >%d %s<\n" msgstr "" -#: src/input/input_http.c:853 +#: src/input/input_http.c:875 #, c-format msgid "input_http: content length = % bytes\n" msgstr "" -#: src/input/input_http.c:922 +#: src/input/input_http.c:948 #, c-format msgid "input_http: buffer exhausted after %d bytes." msgstr "" -#: src/input/input_http.c:996 +#: src/input/input_http.c:1022 msgid "http input plugin" msgstr "" -#: src/input/input_http.c:1062 +#: src/input/input_http.c:1088 msgid "HTTP proxy host" msgstr "" -#: src/input/input_http.c:1062 +#: src/input/input_http.c:1088 msgid "The hostname of the HTTP proxy." msgstr "" -#: src/input/input_http.c:1066 +#: src/input/input_http.c:1092 msgid "HTTP proxy port" msgstr "" -#: src/input/input_http.c:1066 +#: src/input/input_http.c:1092 msgid "The port number of the HTTP proxy." msgstr "" -#: src/input/input_http.c:1076 +#: src/input/input_http.c:1102 msgid "HTTP proxy username" msgstr "" -#: src/input/input_http.c:1077 +#: src/input/input_http.c:1103 msgid "The user name for the HTTP proxy." msgstr "" -#: src/input/input_http.c:1080 +#: src/input/input_http.c:1106 msgid "HTTP proxy password" msgstr "" -#: src/input/input_http.c:1081 +#: src/input/input_http.c:1107 msgid "The password for the HTTP proxy." msgstr "" -#: src/input/input_http.c:1084 +#: src/input/input_http.c:1110 msgid "Domains for which to ignore the HTTP proxy" msgstr "" -#: src/input/input_http.c:1085 +#: src/input/input_http.c:1111 msgid "" "A comma-separated list of domain names for which the proxy is to be " "ignored.\n" @@ -1919,31 +1930,31 @@ msgstr "" msgid "Adjusting..." msgstr "" -#: src/input/input_v4l.c:660 +#: src/input/input_v4l.c:658 msgid "Tuner name not found\n" msgstr "" -#: src/input/input_v4l.c:1876 +#: src/input/input_v4l.c:1874 msgid "v4l tv input plugin" msgstr "" -#: src/input/input_v4l.c:1880 +#: src/input/input_v4l.c:1878 msgid "v4l radio input plugin" msgstr "" -#: src/input/input_v4l.c:1912 +#: src/input/input_v4l.c:1910 msgid "v4l video device" msgstr "" -#: src/input/input_v4l.c:1913 +#: src/input/input_v4l.c:1911 msgid "The path to your Video4Linux video device." msgstr "" -#: src/input/input_v4l.c:1938 +#: src/input/input_v4l.c:1936 msgid "v4l radio device" msgstr "" -#: src/input/input_v4l.c:1939 +#: src/input/input_v4l.c:1937 msgid "The path to your Video4Linux radio device." msgstr "" @@ -2103,110 +2114,110 @@ msgstr "" msgid "Should have converted this above" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:191 +#: src/input/vcd/xineplug_inp_vcd.c:192 msgid "failed to find a device with a VCD" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:328 +#: src/input/vcd/xineplug_inp_vcd.c:329 msgid "was passed a null class parameter" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:972 +#: src/input/vcd/xineplug_inp_vcd.c:982 msgid "Invalid current entry type" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:996 +#: src/input/vcd/xineplug_inp_vcd.c:1006 msgid "" "Video CD plugin with PBC and support for: (X)VCD, (X)SVCD, HQVCD, CVD ... " msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1097 +#: src/input/vcd/xineplug_inp_vcd.c:1107 msgid "selection has no RETURN entry" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1126 +#: src/input/vcd/xineplug_inp_vcd.c:1136 msgid "DEFAULT selected, but PBC is not on." msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1131 +#: src/input/vcd/xineplug_inp_vcd.c:1141 msgid "selection has no NEXT entry" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1139 +#: src/input/vcd/xineplug_inp_vcd.c:1149 msgid "selection has no PREVIOUS entry" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1146 +#: src/input/vcd/xineplug_inp_vcd.c:1156 msgid "Unknown event type: " msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1446 src/input/vcd/xineplug_inp_vcd.c:1493 +#: src/input/vcd/xineplug_inp_vcd.c:1452 src/input/vcd/xineplug_inp_vcd.c:1499 msgid "The above message had unknown vcdimager log level" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1824 +#: src/input/vcd/xineplug_inp_vcd.c:1830 msgid "VCD default type to use on autoplay" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1825 +#: src/input/vcd/xineplug_inp_vcd.c:1831 msgid "" "The VCD play unit to use when none is specified in an MRL, e.g. vcd:// or " "vcd:///dev/dvd:" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1835 +#: src/input/vcd/xineplug_inp_vcd.c:1841 msgid "CD-ROM drive used for VCD when none given" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1836 +#: src/input/vcd/xineplug_inp_vcd.c:1842 msgid "" "What to use if no drive specified. If the setting is empty, xine will scan " "for CD drives." msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1846 +#: src/input/vcd/xineplug_inp_vcd.c:1852 msgid "VCD position slider range" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1847 +#: src/input/vcd/xineplug_inp_vcd.c:1853 msgid "" "range that the stream playback position slider represents playing a VCD." msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1855 +#: src/input/vcd/xineplug_inp_vcd.c:1861 msgid "VCD read-ahead caching?" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1856 +#: src/input/vcd/xineplug_inp_vcd.c:1862 msgid "Class may lead to jerky playback on low-end machines." msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1866 +#: src/input/vcd/xineplug_inp_vcd.c:1872 msgid "automatically advance VCD track/entry" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1867 +#: src/input/vcd/xineplug_inp_vcd.c:1873 msgid "" "If enabled, we should automatically advance to the next entry or track. Used " "only when playback control (PBC) is disabled." msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1876 +#: src/input/vcd/xineplug_inp_vcd.c:1882 msgid "show 'rejected' VCD LIDs" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1877 +#: src/input/vcd/xineplug_inp_vcd.c:1883 msgid "" "Some playback list IDs (LIDs) are marked not showable, but you can see them " "in the MRL list if this is set. Rejected entries are marked with an asterisk " "(*) appended to the MRL." msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1888 +#: src/input/vcd/xineplug_inp_vcd.c:1894 msgid "VCD format string for display banner" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1889 +#: src/input/vcd/xineplug_inp_vcd.c:1895 msgid "" "VCD format used in the GUI Title. Similar to the Unix date command. Format " "specifiers start with a percent sign. Specifiers are:\n" @@ -2227,11 +2238,11 @@ msgid "" " %% : a %\n" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1914 +#: src/input/vcd/xineplug_inp_vcd.c:1920 msgid "VCD format string for stream comment field" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1915 +#: src/input/vcd/xineplug_inp_vcd.c:1921 msgid "" "VCD format used in the GUI Title. Similar to the Unix date command. Format " "specifiers start with a percent sign. Specifiers are %A, %C, %c, %F, %I, %L, " @@ -2239,11 +2250,11 @@ msgid "" "See the help for the title_format for the meanings of these." msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1927 +#: src/input/vcd/xineplug_inp_vcd.c:1933 msgid "VCD debug flag mask" msgstr "" -#: src/input/vcd/xineplug_inp_vcd.c:1928 +#: src/input/vcd/xineplug_inp_vcd.c:1934 msgid "" "For tracking down bugs in the VCD plugin. Mask values are:\n" " 1: Meta information\n" @@ -2260,7 +2271,7 @@ msgid "" "2048: Debugging from VCDINFO\n" msgstr "" -#: src/liba52/xine_a52_decoder.c:742 src/libdts/xine_dts_decoder.c:546 +#: src/liba52/xine_a52_decoder.c:742 src/libdts/xine_dts_decoder.c:551 msgid "HELP! a mono-only audio driver?!\n" msgstr "" @@ -2342,29 +2353,29 @@ msgstr "" msgid "ffmpeg_video_dec: unsupported frame dimensions, DR1 disabled.\n" msgstr "" -#: src/libffmpeg/ff_video_decoder.c:335 +#: src/libffmpeg/ff_video_decoder.c:336 #, c-format msgid "ffmpeg_video_dec: couldn't find ffmpeg decoder for buf type 0x%X\n" msgstr "" -#: src/libffmpeg/ff_video_decoder.c:364 +#: src/libffmpeg/ff_video_decoder.c:365 msgid "ffmpeg_video_dec: couldn't open decoder\n" msgstr "" -#: src/libffmpeg/ff_video_decoder.c:399 +#: src/libffmpeg/ff_video_decoder.c:400 msgid "ffmpeg_video_dec: direct rendering enabled\n" msgstr "" -#: src/libffmpeg/ff_video_decoder.c:818 +#: src/libffmpeg/ff_video_decoder.c:819 #, c-format msgid "ffmpeg_video_dec: increasing buffer to %d to avoid overflow.\n" msgstr "" -#: src/libffmpeg/ff_video_decoder.c:1516 +#: src/libffmpeg/ff_video_decoder.c:1522 msgid "MPEG-4 postprocessing quality" msgstr "" -#: src/libffmpeg/ff_video_decoder.c:1517 +#: src/libffmpeg/ff_video_decoder.c:1523 msgid "" "You can adjust the amount of post processing applied to MPEG-4 video.\n" "Higher values result in better quality, but need more CPU. Lower values may " @@ -3121,7 +3132,7 @@ msgid "Select the video output layer by its id." msgstr "" #: src/video_out/video_out_directfb.c:1804 -#: src/video_out/video_out_directfb.c:2013 +#: src/video_out/video_out_directfb.c:2014 #, c-format msgid "video_out_directfb: using display layer #%d.\n" msgstr "" @@ -3130,11 +3141,11 @@ msgstr "" msgid "xine video output plugin using DirectFB." msgstr "" -#: src/video_out/video_out_directfb.c:2006 +#: src/video_out/video_out_directfb.c:2007 msgid "video_out_directfb: no usable display layer was found!\n" msgstr "" -#: src/video_out/video_out_directfb.c:2095 +#: src/video_out/video_out_directfb.c:2096 msgid "xine video output plugin using DirectFB under XDirectFB." msgstr "" @@ -3142,18 +3153,18 @@ msgstr "" msgid "xine video output plugin for win32 using directx" msgstr "" -#: src/video_out/video_out_fb.c:792 +#: src/video_out/video_out_fb.c:760 #, c-format msgid "" "video_out_fb: only packed truecolor/directcolor is supported (%d).\n" " Check 'fbset -i' or try 'fbset -depth 16'.\n" msgstr "" -#: src/video_out/video_out_fb.c:852 src/video_out/video_out_vidix.c:1239 +#: src/video_out/video_out_fb.c:820 src/video_out/video_out_vidix.c:1239 msgid "framebuffer device name" msgstr "" -#: src/video_out/video_out_fb.c:853 src/video_out/video_out_vidix.c:1240 +#: src/video_out/video_out_fb.c:821 src/video_out/video_out_vidix.c:1240 msgid "" "Specifies the file name for the framebuffer device to be used.\n" "This setting is security critical, because when changed to a different file, " @@ -3161,16 +3172,16 @@ msgid "" "careful that the value you enter really is a proper framebuffer device." msgstr "" -#: src/video_out/video_out_fb.c:927 +#: src/video_out/video_out_fb.c:895 msgid "video_out_fb: Your video mode was not recognized, sorry.\n" msgstr "" -#: src/video_out/video_out_fb.c:984 +#: src/video_out/video_out_fb.c:952 #, c-format msgid "video_out_fb: %d video RAM buffers are available.\n" msgstr "" -#: src/video_out/video_out_fb.c:990 +#: src/video_out/video_out_fb.c:958 #, c-format msgid "" "WARNING: video_out_fb: Zero copy buffers are DISABLED because only %d " @@ -3179,13 +3190,13 @@ msgid "" " the frame buffer resolution might help.\n" msgstr "" -#: src/video_out/video_out_fb.c:1001 +#: src/video_out/video_out_fb.c:969 msgid "" "WARNING: video_out_fb: Zero copy buffers are DISABLED because kernel driver\n" " do not support screen panning (used for frame flips).\n" msgstr "" -#: src/video_out/video_out_fb.c:1070 +#: src/video_out/video_out_fb.c:1038 #, c-format msgid "" "WARNING: video_out_fb: current display depth is %d. For better performance\n" @@ -3193,7 +3204,7 @@ msgid "" "\n" msgstr "" -#: src/video_out/video_out_fb.c:1101 +#: src/video_out/video_out_fb.c:1069 msgid "Xine video output plugin using the Linux frame buffer device" msgstr "" @@ -3245,8 +3256,8 @@ msgid "" msgstr "" #: src/video_out/video_out_opengl.c:1918 src/video_out/video_out_vidix.c:1015 -#: src/video_out/video_out_xcbxv.c:1472 src/video_out/video_out_xv.c:1486 -#: src/video_out/video_out_xvmc.c:1461 src/video_out/video_out_xxmc.c:2468 +#: src/video_out/video_out_xcbxv.c:1472 src/video_out/video_out_xv.c:1530 +#: src/video_out/video_out_xvmc.c:1461 src/video_out/video_out_xxmc.c:2534 msgid "enable double buffering" msgstr "" @@ -3322,8 +3333,8 @@ msgid "video_out_pgx64: Error: ioctl failed (FBIOGATTR)\n" msgstr "" #: src/video_out/video_out_pgx64.c:1464 src/video_out/video_out_xcbxv.c:1439 -#: src/video_out/video_out_xv.c:1453 src/video_out/video_out_xvmc.c:1446 -#: src/video_out/video_out_xxmc.c:2435 +#: src/video_out/video_out_xv.c:1497 src/video_out/video_out_xvmc.c:1446 +#: src/video_out/video_out_xxmc.c:2501 msgid "video overlay colour key" msgstr "" @@ -3474,8 +3485,8 @@ msgid "The intensity of the blue colour components." msgstr "" #: src/video_out/video_out_vidix.c:1016 src/video_out/video_out_xcbxv.c:1473 -#: src/video_out/video_out_xv.c:1487 src/video_out/video_out_xvmc.c:1462 -#: src/video_out/video_out_xxmc.c:2469 +#: src/video_out/video_out_xv.c:1531 src/video_out/video_out_xvmc.c:1462 +#: src/video_out/video_out_xxmc.c:2535 msgid "" "Double buffering will synchronize the update of the video image to the " "repainting of the entire screen (\"vertical retrace\"). This eliminates " @@ -3509,8 +3520,8 @@ msgstr "" #: src/video_out/video_out_vidix.c:1159 src/video_out/video_out_vidix.c:1166 #: src/video_out/video_out_vidix.c:1173 src/video_out/video_out_xcbxv.c:1440 -#: src/video_out/video_out_xv.c:1454 src/video_out/video_out_xvmc.c:1447 -#: src/video_out/video_out_xxmc.c:2436 +#: src/video_out/video_out_xv.c:1498 src/video_out/video_out_xvmc.c:1447 +#: src/video_out/video_out_xxmc.c:2502 msgid "" "The colour key is used to tell the graphics card where to overlay the video " "image. Try different values, if you experience windows becoming transparent." @@ -3574,20 +3585,20 @@ msgstr "" msgid "xine video output plugin using the MIT X shared memory extension" msgstr "" -#: src/video_out/video_out_xcbxv.c:272 +#: src/video_out/video_out_xcbxv.c:270 msgid "" "video_out_xcbxv: XvShmCreateImage returned a zero size\n" "video_out_xcbxv: => not using MIT Shared Memory extension.\n" msgstr "" -#: src/video_out/video_out_xcbxv.c:281 +#: src/video_out/video_out_xcbxv.c:279 #, c-format msgid "" "video_out_xcbxv: shared memory error in shmget: %s\n" "video_out_xcbxv: => not using MIT Shared Memory extension.\n" msgstr "" -#: src/video_out/video_out_xcbxv.c:300 +#: src/video_out/video_out_xcbxv.c:298 msgid "" "video_out_xcbxv: x11 error during shared memory XImage creation\n" "video_out_xcbxv: => not using MIT Shared Memory extension.\n" @@ -3612,23 +3623,23 @@ msgid "" "conversion and scaling.\n" msgstr "" -#: src/video_out/video_out_xcbxv.c:1448 src/video_out/video_out_xv.c:1462 -#: src/video_out/video_out_xvmc.c:1455 src/video_out/video_out_xxmc.c:2444 +#: src/video_out/video_out_xcbxv.c:1448 src/video_out/video_out_xv.c:1506 +#: src/video_out/video_out_xvmc.c:1455 src/video_out/video_out_xxmc.c:2510 msgid "autopaint colour key" msgstr "" -#: src/video_out/video_out_xcbxv.c:1449 src/video_out/video_out_xv.c:1463 -#: src/video_out/video_out_xvmc.c:1456 src/video_out/video_out_xxmc.c:2445 +#: src/video_out/video_out_xcbxv.c:1449 src/video_out/video_out_xv.c:1507 +#: src/video_out/video_out_xvmc.c:1456 src/video_out/video_out_xxmc.c:2511 msgid "Make Xv autopaint its colorkey." msgstr "" -#: src/video_out/video_out_xcbxv.c:1456 src/video_out/video_out_xv.c:1470 -#: src/video_out/video_out_xxmc.c:2452 +#: src/video_out/video_out_xcbxv.c:1456 src/video_out/video_out_xv.c:1514 +#: src/video_out/video_out_xxmc.c:2518 msgid "bilinear scaling mode" msgstr "" -#: src/video_out/video_out_xcbxv.c:1457 src/video_out/video_out_xv.c:1471 -#: src/video_out/video_out_xxmc.c:2453 +#: src/video_out/video_out_xcbxv.c:1457 src/video_out/video_out_xv.c:1515 +#: src/video_out/video_out_xxmc.c:2519 msgid "" "Selects the bilinear scaling mode for Permedia cards. The individual values " "are:\n" @@ -3651,22 +3662,22 @@ msgstr "" msgid "video_out_xcbxv: this adaptor supports the yuy2 format.\n" msgstr "" -#: src/video_out/video_out_xcbxv.c:1522 src/video_out/video_out_xv.c:1547 -#: src/video_out/video_out_xxmc.c:2537 +#: src/video_out/video_out_xcbxv.c:1522 src/video_out/video_out_xv.c:1591 +#: src/video_out/video_out_xxmc.c:2603 msgid "pitch alignment workaround" msgstr "" -#: src/video_out/video_out_xcbxv.c:1523 src/video_out/video_out_xv.c:1548 -#: src/video_out/video_out_xxmc.c:2538 +#: src/video_out/video_out_xcbxv.c:1523 src/video_out/video_out_xv.c:1592 +#: src/video_out/video_out_xxmc.c:2604 msgid "Some buggy video drivers need a workaround to function properly." msgstr "" -#: src/video_out/video_out_xcbxv.c:1529 src/video_out/video_out_xv.c:1554 +#: src/video_out/video_out_xcbxv.c:1529 src/video_out/video_out_xv.c:1598 #: src/video_out/video_out_xvmc.c:1524 msgid "deinterlace method (deprecated)" msgstr "" -#: src/video_out/video_out_xcbxv.c:1530 src/video_out/video_out_xv.c:1555 +#: src/video_out/video_out_xcbxv.c:1530 src/video_out/video_out_xv.c:1599 #: src/video_out/video_out_xvmc.c:1525 msgid "" "This config setting is deprecated. You should use the new deinterlacing post " @@ -3705,8 +3716,8 @@ msgid "" "with medium CPU usage." msgstr "" -#: src/video_out/video_out_xcbxv.c:1584 src/video_out/video_out_xv.c:1628 -#: src/video_out/video_out_xxmc.c:2618 +#: src/video_out/video_out_xcbxv.c:1584 src/video_out/video_out_xv.c:1672 +#: src/video_out/video_out_xxmc.c:2684 msgid "xine video output plugin using the MIT X video extension" msgstr "" @@ -3743,54 +3754,54 @@ msgstr "" msgid "video_out_xshm: your video mode was not recognized, sorry :-(\n" msgstr "" -#: src/video_out/video_out_xv.c:296 +#: src/video_out/video_out_xv.c:298 msgid "" "video_out_xv: XvShmCreateImage failed\n" "video_out_xv: => not using MIT Shared Memory extension.\n" msgstr "" -#: src/video_out/video_out_xv.c:306 +#: src/video_out/video_out_xv.c:324 msgid "" "video_out_xv: XvShmCreateImage returned a zero size\n" "video_out_xv: => not using MIT Shared Memory extension.\n" msgstr "" -#: src/video_out/video_out_xv.c:314 +#: src/video_out/video_out_xv.c:332 #, c-format msgid "" "video_out_xv: shared memory error in shmget: %s\n" "video_out_xv: => not using MIT Shared Memory extension.\n" msgstr "" -#: src/video_out/video_out_xv.c:346 +#: src/video_out/video_out_xv.c:364 msgid "" "video_out_xv: x11 error during shared memory XImage creation\n" "video_out_xv: => not using MIT Shared Memory extension.\n" msgstr "" -#: src/video_out/video_out_xv.c:1299 +#: src/video_out/video_out_xv.c:1343 msgid "video_out_xv: Xv extension not present.\n" msgstr "" -#: src/video_out/video_out_xv.c:1336 +#: src/video_out/video_out_xv.c:1380 msgid "" "video_out_xv: Xv extension is present but I couldn't find a usable yuv12 " "port.\n" " Looks like your graphics hardware driver doesn't support Xv?!\n" msgstr "" -#: src/video_out/video_out_xv.c:1345 +#: src/video_out/video_out_xv.c:1389 #, c-format msgid "" "video_out_xv: using Xv port %ld from adaptor %s for hardware colorspace " "conversion and scaling.\n" msgstr "" -#: src/video_out/video_out_xv.c:1520 +#: src/video_out/video_out_xv.c:1564 msgid "video_out_xv: this adaptor supports the yv12 format.\n" msgstr "" -#: src/video_out/video_out_xv.c:1525 +#: src/video_out/video_out_xv.c:1569 msgid "video_out_xv: this adaptor supports the yuy2 format.\n" msgstr "" @@ -3857,69 +3868,69 @@ msgid "" "video_out_xxmc: => not using MIT Shared Memory extension.\n" msgstr "" -#: src/video_out/video_out_xxmc.c:2287 +#: src/video_out/video_out_xxmc.c:2353 msgid "video_out_xxmc: Xv extension not present.\n" msgstr "" -#: src/video_out/video_out_xxmc.c:2324 +#: src/video_out/video_out_xxmc.c:2390 msgid "" "video_out_xxmc: Xv extension is present but I couldn't find a usable yuv12 " "port.\n" " Looks like your graphics hardware driver doesn't support Xv?!\n" msgstr "" -#: src/video_out/video_out_xxmc.c:2333 +#: src/video_out/video_out_xxmc.c:2399 #, c-format msgid "" "video_out_xxmc: using Xv port %ld from adaptor %s for hardware colorspace " "conversion and scaling.\n" msgstr "" -#: src/video_out/video_out_xxmc.c:2509 +#: src/video_out/video_out_xxmc.c:2575 msgid "video_out_xxmc: this adaptor supports the yv12 format.\n" msgstr "" -#: src/video_out/video_out_xxmc.c:2514 +#: src/video_out/video_out_xxmc.c:2580 msgid "video_out_xxmc: this adaptor supports the yuy2 format.\n" msgstr "" -#: src/video_out/video_out_xxmc.c:2543 +#: src/video_out/video_out_xxmc.c:2609 msgid "Make XvMC allocate more frames for better buffering." msgstr "" -#: src/video_out/video_out_xxmc.c:2544 +#: src/video_out/video_out_xxmc.c:2610 msgid "" "Some XvMC implementations allow more than 8 frames.\n" "This option, when turned on, makes the driver try to\n" "allocate 15 frames. A must for unichrome and live VDR.\n" msgstr "" -#: src/video_out/video_out_xxmc.c:2550 +#: src/video_out/video_out_xxmc.c:2616 msgid "Unichrome cpu save" msgstr "" -#: src/video_out/video_out_xxmc.c:2551 +#: src/video_out/video_out_xxmc.c:2617 msgid "" "Saves CPU time by sleeping while decoder works.\n" "Only for Linux kernel 2.6 series or 2.4 with multimedia patch.\n" "Experimental.\n" msgstr "" -#: src/video_out/video_out_xxmc.c:2557 +#: src/video_out/video_out_xxmc.c:2623 msgid "Fix buggy NVIDIA XvMC subpicture colors" msgstr "" -#: src/video_out/video_out_xxmc.c:2558 +#: src/video_out/video_out_xxmc.c:2624 msgid "" "There's a bug in NVIDIA's XvMC lib that makes red OSD colors\n" "look blue and vice versa. This option provides a workaround.\n" msgstr "" -#: src/video_out/video_out_xxmc.c:2563 +#: src/video_out/video_out_xxmc.c:2629 msgid "Use bob as accelerated deinterlace method." msgstr "" -#: src/video_out/video_out_xxmc.c:2564 +#: src/video_out/video_out_xxmc.c:2630 msgid "" "When interlacing is enabled for hardware accelerated frames,\n" "Alternate between top and bottom field at double the frame rate.\n" @@ -3943,11 +3954,11 @@ msgstr "" msgid "x11osd: unscaled overlay created (%s mode).\n" msgstr "" -#: src/xine-engine/alphablend.c:2123 +#: src/xine-engine/alphablend.c:2146 msgid "disable exact alpha blending of overlays" msgstr "" -#: src/xine-engine/alphablend.c:2124 +#: src/xine-engine/alphablend.c:2147 msgid "" "If you experience a performance impact when an On Screen Display or other " "overlays like DVD subtitles are active, then you might want to enable this " @@ -3982,27 +3993,27 @@ msgid "" "audio_out: delay calculation impossible with an unavailable audio device\n" msgstr "" -#: src/xine-engine/audio_out.c:1220 -msgid "write to sound card failed. Was a USB device unplugged ?\n" +#: src/xine-engine/audio_out.c:1215 +msgid "write to sound card failed. Assuming the device was unplugged.\n" msgstr "" -#: src/xine-engine/audio_out.c:1373 +#: src/xine-engine/audio_out.c:1387 msgid "8 bits not supported by driver, converting to 16 bits.\n" msgstr "" -#: src/xine-engine/audio_out.c:1381 +#: src/xine-engine/audio_out.c:1395 msgid "mono not supported by driver, converting to stereo.\n" msgstr "" -#: src/xine-engine/audio_out.c:1387 +#: src/xine-engine/audio_out.c:1401 msgid "stereo not supported by driver, converting to mono.\n" msgstr "" -#: src/xine-engine/audio_out.c:2041 +#: src/xine-engine/audio_out.c:2055 msgid "method to sync audio and video" msgstr "" -#: src/xine-engine/audio_out.c:2042 +#: src/xine-engine/audio_out.c:2056 msgid "" "When playing audio and video, there are at least two clocks involved: The " "system clock, to which video frames are synchronized and the clock in your " @@ -4025,11 +4036,11 @@ msgid "" "form." msgstr "" -#: src/xine-engine/audio_out.c:2070 +#: src/xine-engine/audio_out.c:2084 msgid "enable resampling" msgstr "" -#: src/xine-engine/audio_out.c:2071 +#: src/xine-engine/audio_out.c:2085 msgid "" "When the sample rate of the decoded audio does not match the capabilities of " "your sound hardware, an adaptation called \"resampling\" is required. Here " @@ -4037,33 +4048,33 @@ msgid "" "automatically when necessary." msgstr "" -#: src/xine-engine/audio_out.c:2078 +#: src/xine-engine/audio_out.c:2092 msgid "always resample to this rate (0 to disable)" msgstr "" -#: src/xine-engine/audio_out.c:2079 +#: src/xine-engine/audio_out.c:2093 msgid "" "Some audio drivers do not correctly announce the capabilities of the audio " "hardware. By setting a value other than zero here, you can force the audio " "stream to be resampled to the given rate." msgstr "" -#: src/xine-engine/audio_out.c:2088 +#: src/xine-engine/audio_out.c:2102 msgid "offset for digital passthrough" msgstr "" -#: src/xine-engine/audio_out.c:2089 +#: src/xine-engine/audio_out.c:2103 msgid "" "If you use an external surround decoder and audio is ahead or behind video, " "you can enter a fixed offset here to compensate.\n" "The unit of the value is one PTS tick, which is the 90000th part of a second." msgstr "" -#: src/xine-engine/audio_out.c:2098 +#: src/xine-engine/audio_out.c:2112 msgid "play audio even on slow/fast speeds" msgstr "" -#: src/xine-engine/audio_out.c:2099 +#: src/xine-engine/audio_out.c:2113 msgid "" "If you enable this option, the audio will be heard even when playback speed " "is different than 1X. Of course, it will sound distorted (lower/higher " @@ -4071,23 +4082,23 @@ msgid "" "audio post plugin instead." msgstr "" -#: src/xine-engine/audio_out.c:2170 +#: src/xine-engine/audio_out.c:2184 msgid "startup audio volume" msgstr "" -#: src/xine-engine/audio_out.c:2171 +#: src/xine-engine/audio_out.c:2185 msgid "The overall audio volume set at xine startup." msgstr "" -#: src/xine-engine/audio_out.c:2174 +#: src/xine-engine/audio_out.c:2188 msgid "restore volume level at startup" msgstr "" -#: src/xine-engine/audio_out.c:2175 +#: src/xine-engine/audio_out.c:2189 msgid "If disabled, xine will not modify any mixer settings at startup." msgstr "" -#: src/xine-engine/audio_out.c:2205 +#: src/xine-engine/audio_out.c:2219 msgid "audio_out: sorry, this should not happen. please restart xine.\n" msgstr "" @@ -4140,12 +4151,12 @@ msgid "" "info_helper: unsupported conversion %s -> UTF-8, no conversion performed\n" msgstr "" -#: src/xine-engine/input_cache.c:167 +#: src/xine-engine/input_cache.c:171 #, c-format msgid ": open() function should never be called\n" msgstr "" -#: src/xine-engine/input_cache.c:349 +#: src/xine-engine/input_cache.c:353 #, c-format msgid ": input plugin not defined!\n" msgstr "" @@ -4367,18 +4378,18 @@ msgstr "" msgid "load_plugins: using demuxer '%s'\n" msgstr "" -#: src/xine-engine/load_plugins.c:1726 +#: src/xine-engine/load_plugins.c:1711 src/xine-engine/load_plugins.c:1758 #, c-format msgid "load_plugins: failed to load audio output plugin <%s>\n" msgstr "" -#: src/xine-engine/load_plugins.c:1729 +#: src/xine-engine/load_plugins.c:1761 msgid "" "load_plugins: audio output auto-probing didn't find any usable audio " "driver.\n" msgstr "" -#: src/xine-engine/load_plugins.c:2033 +#: src/xine-engine/load_plugins.c:2065 #, c-format msgid "" "load_plugins: cannot unload plugin lib %s:\n" @@ -4582,127 +4593,127 @@ msgid "" "accelerated, this can dramatically reduce CPU usage." msgstr "" -#: src/xine-engine/xine.c:704 src/xine-engine/xine.c:811 -#: src/xine-engine/xine.c:850 src/xine-engine/xine.c:886 -#: src/xine-engine/xine.c:898 src/xine-engine/xine.c:911 -#: src/xine-engine/xine.c:924 src/xine-engine/xine.c:937 -#: src/xine-engine/xine.c:963 src/xine-engine/xine.c:988 -#: src/xine-engine/xine.c:1023 +#: src/xine-engine/xine.c:733 src/xine-engine/xine.c:840 +#: src/xine-engine/xine.c:879 src/xine-engine/xine.c:915 +#: src/xine-engine/xine.c:927 src/xine-engine/xine.c:940 +#: src/xine-engine/xine.c:953 src/xine-engine/xine.c:966 +#: src/xine-engine/xine.c:992 src/xine-engine/xine.c:1017 +#: src/xine-engine/xine.c:1052 msgid "xine: error while parsing mrl\n" msgstr "" -#: src/xine-engine/xine.c:740 +#: src/xine-engine/xine.c:769 #, c-format msgid "xine: found input plugin : %s\n" msgstr "" -#: src/xine-engine/xine.c:758 +#: src/xine-engine/xine.c:787 #, c-format msgid "xine: input plugin cannot open MRL [%s]\n" msgstr "" -#: src/xine-engine/xine.c:774 +#: src/xine-engine/xine.c:803 #, c-format msgid "xine: cannot find input plugin for MRL [%s]\n" msgstr "" -#: src/xine-engine/xine.c:800 +#: src/xine-engine/xine.c:829 #, c-format msgid "xine: specified demuxer %s failed to start\n" msgstr "" -#: src/xine-engine/xine.c:836 +#: src/xine-engine/xine.c:865 #, c-format msgid "xine: join rip input plugin\n" msgstr "" -#: src/xine-engine/xine.c:843 +#: src/xine-engine/xine.c:872 msgid "xine: error opening rip input plugin instance\n" msgstr "" -#: src/xine-engine/xine.c:874 +#: src/xine-engine/xine.c:903 #, c-format msgid "xine: last_probed demuxer %s failed to start\n" msgstr "" -#: src/xine-engine/xine.c:903 +#: src/xine-engine/xine.c:932 msgid "ignoring video\n" msgstr "" -#: src/xine-engine/xine.c:916 +#: src/xine-engine/xine.c:945 msgid "ignoring audio\n" msgstr "" -#: src/xine-engine/xine.c:929 +#: src/xine-engine/xine.c:958 msgid "ignoring subpicture\n" msgstr "" -#: src/xine-engine/xine.c:942 +#: src/xine-engine/xine.c:971 msgid "input cache plugin disabled\n" msgstr "" -#: src/xine-engine/xine.c:1013 +#: src/xine-engine/xine.c:1042 #, c-format msgid "subtitle mrl opened '%s'\n" msgstr "" -#: src/xine-engine/xine.c:1017 +#: src/xine-engine/xine.c:1046 msgid "xine: error opening subtitle mrl\n" msgstr "" -#: src/xine-engine/xine.c:1049 +#: src/xine-engine/xine.c:1078 #, c-format msgid "xine: error while parsing MRL\n" msgstr "" -#: src/xine-engine/xine.c:1056 +#: src/xine-engine/xine.c:1085 #, c-format msgid "xine: changing option '%s' from MRL isn't permitted\n" msgstr "" -#: src/xine-engine/xine.c:1076 +#: src/xine-engine/xine.c:1105 #, c-format msgid "xine: couldn't find demux for >%s<\n" msgstr "" -#: src/xine-engine/xine.c:1092 +#: src/xine-engine/xine.c:1121 #, c-format msgid "xine: found demuxer plugin: %s\n" msgstr "" -#: src/xine-engine/xine.c:1112 +#: src/xine-engine/xine.c:1141 #, c-format msgid "xine: demuxer failed to start\n" msgstr "" -#: src/xine-engine/xine.c:1177 +#: src/xine-engine/xine.c:1206 #, c-format msgid "xine_play: no demux available\n" msgstr "" -#: src/xine-engine/xine.c:1247 +#: src/xine-engine/xine.c:1276 #, c-format msgid "xine_play: demux failed to start\n" msgstr "" -#: src/xine-engine/xine.c:1523 +#: src/xine-engine/xine.c:1552 #, c-format msgid "xine: The specified save_dir \"%s\" might be a security risk.\n" msgstr "" -#: src/xine-engine/xine.c:1528 +#: src/xine-engine/xine.c:1557 msgid "The specified save_dir might be a security risk." msgstr "" -#: src/xine-engine/xine.c:1554 +#: src/xine-engine/xine.c:1583 msgid "xine: locale not supported by C library\n" msgstr "" -#: src/xine-engine/xine.c:1563 +#: src/xine-engine/xine.c:1592 msgid "media format detection strategy" msgstr "" -#: src/xine-engine/xine.c:1564 +#: src/xine-engine/xine.c:1593 msgid "" "xine offers various methods to detect the media format of input to play. The " "individual values are:\n" @@ -4720,11 +4731,11 @@ msgid "" "Detect by file name extension only.\n" msgstr "" -#: src/xine-engine/xine.c:1582 +#: src/xine-engine/xine.c:1611 msgid "directory for saving streams" msgstr "" -#: src/xine-engine/xine.c:1583 +#: src/xine-engine/xine.c:1612 msgid "" "When using the stream save feature, files will be written only into this " "directory.\n" @@ -4734,11 +4745,11 @@ msgid "" "content in any file." msgstr "" -#: src/xine-engine/xine.c:1594 +#: src/xine-engine/xine.c:1623 msgid "allow implicit changes to the configuration (e.g. by MRL)" msgstr "" -#: src/xine-engine/xine.c:1595 +#: src/xine-engine/xine.c:1624 msgid "" "If enabled, you allow xine to change your configuration without explicit " "actions from your side. For example configuration changes demanded by MRLs " @@ -4748,26 +4759,26 @@ msgid "" "configuration, you might end with a totally messed up xine." msgstr "" -#: src/xine-engine/xine.c:1609 +#: src/xine-engine/xine.c:1638 msgid "Timeout for network stream reading (in seconds)" msgstr "" -#: src/xine-engine/xine.c:1610 +#: src/xine-engine/xine.c:1639 msgid "" "Specifies the timeout when reading from network streams, in seconds. Too low " "values might stop streaming when the source is slow or the bandwidth is " "occupied, too high values will freeze the player if the connection is lost." msgstr "" -#: src/xine-engine/xine.c:1962 +#: src/xine-engine/xine.c:1991 msgid "messages" msgstr "" -#: src/xine-engine/xine.c:1963 +#: src/xine-engine/xine.c:1992 msgid "plugin" msgstr "" -#: src/xine-engine/xine.c:1964 +#: src/xine-engine/xine.c:1993 msgid "trace" msgstr "" -- cgit v1.2.3 From 1e39505760d7c54d3a435a47b1ffb05e204f8057 Mon Sep 17 00:00:00 2001 From: Darren Salt Date: Fri, 13 Jul 2007 18:09:10 +0100 Subject: Add XCB build-deps with fallbacks for building on etch. --- debian/control | 1 + 1 file changed, 1 insertion(+) diff --git a/debian/control b/debian/control index 48d0ada09..059d22d57 100644 --- a/debian/control +++ b/debian/control @@ -5,6 +5,7 @@ Maintainer: Siggi Langauf Uploaders: Philipp Matthias Hahn , Reinhard Tartler Build-Depends: debhelper (>= 5.0.1), binutils (>= 2.12.90.0.9), pkg-config, automake1.9, autoconf, libtool, + libxcb-xinerama0-dev | libxv-dev (<< 1.0.3), libxcb-xv0-dev | libxv-dev (<< 1.0.3), libxcb-xvmc0-dev | libxv-dev (<< 1.0.3), libxcb-shm0-dev | libxv-dev (<< 1.0.3), libxcb-shape0-dev | libxv-dev (<< 1.0.3), libxinerama-dev, libxv-dev, libxvmc-dev, libxt-dev, libdirectfb-dev (>= 0.9.22), libasound2-dev [!kfreebsd-i386 !kfreebsd-amd64 !hurd-i386], -- cgit v1.2.3 From c29f5163db85b1b4097a791ca1ba96f2b52f1f04 Mon Sep 17 00:00:00 2001 From: Simon Farnsworth Date: Fri, 13 Jul 2007 15:41:12 +0100 Subject: Prevent ticket system deadlock when using DVB subtitles When using DVB subtitles on an SMP machine, we see occasional lockups, which appear to be caused by one thread acquiring the same ticket twice. Fix this, by preventing acquire() and release() from blocking if the current thread has already acquired the ticket. Code sequences like the following can still block in all acquires and releases: ticket->acquire(...) /* Do something */ ticket->release(...) However, code sequences like the following, which used to deadlock if ticket was revoked at just the wrong moment, now succeed: ticket->acquire(...) /* Do something */ ticket->acquire(...) /* This acquire cannot block */ /* Do something */ ticket->release(...) /* This release cannot block */ /* Do something */ ticket->release(...) Without this patch, the inner acquire() and release() calls could block if ticket was revoked at the wrong time. revoke() would not unblock the blocking acquire until there have been as many release()s as acquire()s, which cannot happen. --- src/xine-engine/xine.c | 63 +++++++++++++++++++++++++++++++++++++++-- src/xine-engine/xine_internal.h | 6 ++++ 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/src/xine-engine/xine.c b/src/xine-engine/xine.c index 254d596b1..00f1dc41c 100644 --- a/src/xine-engine/xine.c +++ b/src/xine-engine/xine.c @@ -127,17 +127,54 @@ void _x_extra_info_merge( extra_info_t *dst, extra_info_t *src ) { } } +static int acquire_allowed_to_block(xine_ticket_t *this) { + pthread_t own_id = pthread_self(); + unsigned entry; + unsigned new_size; + + for(entry = 0; entry < this->holder_thread_count; ++entry) { + if(this->holder_threads[entry].holder == own_id) { + /* This thread may already hold this ticket */ + this->holder_threads[entry].count++; + return (this->holder_threads[entry].count == 1); + } + } + /* If we get this far, this thread hasn't claimed this ticket before. + We need to give it a new entry in the list, then return true */ + for(entry = 0; entry < this->holder_thread_count; ++entry) { + if(this->holder_threads[entry].count == 0) { + this->holder_threads[entry].holder = own_id; + this->holder_threads[entry].count = 1; + return 1; + } + } + /* List too small. Realloc to larger size */ + new_size = this->holder_thread_count * 2; + lprintf("Reallocing from %d to %d entries\n", this->holder_thread_count, new_size); + + this->holder_threads = realloc(this->holder_threads, sizeof(*this->holder_threads) * new_size); + memset(this->holder_threads + this->holder_thread_count, 0, this->holder_thread_count); + + /* Old size is equivalent to index of first newly allocated entry*/ + this->holder_threads[this->holder_thread_count].count = 1; + this->holder_threads[this->holder_thread_count].holder = own_id; + this->holder_thread_count = new_size; + + return 1; +} + static int ticket_acquire_internal(xine_ticket_t *this, int irrevocable, int nonblocking) { int must_wait = 0; pthread_mutex_lock(&this->lock); + int allowed_to_block = acquire_allowed_to_block(this); if (this->ticket_revoked && !this->irrevocable_tickets) must_wait = !nonblocking; else if (this->atomic_revoke && !pthread_equal(this->atomic_revoker_thread, pthread_self())) must_wait = 1; - if (must_wait) { + if (must_wait && allowed_to_block) { if (nonblocking) { pthread_mutex_unlock(&this->lock); return 0; @@ -162,9 +199,25 @@ static void ticket_acquire(xine_ticket_t *this, int irrevocable) { ticket_acquire_internal(this, irrevocable, 0); } +static int release_allowed_to_block(xine_ticket_t *this) { + pthread_t own_id = pthread_self(); + unsigned entry; + + for(entry = 0; entry < this->holder_thread_count; ++entry) { + if(this->holder_threads[entry].holder == own_id) { + this->holder_threads[entry].count--; + return this->holder_threads[entry].count == 0; + } + } + lprintf("BUG! Ticket 0x%p released by a thread that never took it! Allowing code to continue\n", this); + _x_assert(0); + return 1; +} + static void ticket_release_internal(xine_ticket_t *this, int irrevocable, int nonblocking) { pthread_mutex_lock(&this->lock); + int allowed_to_block = release_allowed_to_block(this); this->tickets_granted--; if (irrevocable) @@ -172,8 +225,10 @@ static void ticket_release_internal(xine_ticket_t *this, int irrevocable, int no if (this->ticket_revoked && !this->tickets_granted) pthread_cond_broadcast(&this->revoked); - if (this->ticket_revoked && !this->irrevocable_tickets && !nonblocking) - pthread_cond_wait(&this->issued, &this->lock); + if (allowed_to_block) { + if (this->ticket_revoked && !this->irrevocable_tickets && !nonblocking) + pthread_cond_wait(&this->issued, &this->lock); + } pthread_mutex_unlock(&this->lock); } @@ -262,6 +317,8 @@ static xine_ticket_t *ticket_init(void) { port_ticket->issue = ticket_issue; port_ticket->revoke = ticket_revoke; port_ticket->dispose = ticket_dispose; + port_ticket->holder_thread_count = XINE_MAX_TICKET_HOLDER_THREADS; + port_ticket->holder_threads = calloc(XINE_MAX_TICKET_HOLDER_THREADS,sizeof(*port_ticket->holder_threads)); pthread_mutex_init(&port_ticket->lock, NULL); pthread_mutex_init(&port_ticket->revoke_lock, NULL); diff --git a/src/xine-engine/xine_internal.h b/src/xine-engine/xine_internal.h index 5f9a82f97..5523001ca 100644 --- a/src/xine-engine/xine_internal.h +++ b/src/xine-engine/xine_internal.h @@ -75,6 +75,7 @@ extern "C" { #define XINE_MAX_EVENT_LISTENERS 50 #define XINE_MAX_EVENT_TYPES 100 +#define XINE_MAX_TICKET_HOLDER_THREADS 64 /* used by plugin loader */ #define XINE_VERSION_CODE XINE_MAJOR_VERSION*10000+XINE_MINOR_VERSION*100+XINE_SUB_VERSION @@ -179,6 +180,11 @@ struct xine_ticket_s { int pending_revocations; int atomic_revoke; pthread_t atomic_revoker_thread; + struct { + int count; + pthread_t holder; + } *holder_threads; + unsigned holder_thread_count; #endif }; -- cgit v1.2.3 From 7cb04769574d9ef849ca7a7bd4da45671639eb77 Mon Sep 17 00:00:00 2001 From: Simon Farnsworth Date: Thu, 12 Jul 2007 11:30:14 +0100 Subject: Fix memory leak in video_overlay.c When running DVB subtitles for a long period of time (over 24 hours), we noticed a slow leak of memory. This patch removes one cause of leakage for us. --- src/xine-engine/video_overlay.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/xine-engine/video_overlay.c b/src/xine-engine/video_overlay.c index 231aa5a70..574f42ac3 100644 --- a/src/xine-engine/video_overlay.c +++ b/src/xine-engine/video_overlay.c @@ -395,6 +395,8 @@ static int video_overlay_event( video_overlay_t *this, int64_t vpts ) { #endif /* free any overlay associated with this event */ if (this->events[this_event].event->object.overlay != NULL) { + if( this->events[this_event].event->object.overlay->rle != NULL ) + free( this->events[this_event].event->object.overlay->rle ); free(this->events[this_event].event->object.overlay); this->events[this_event].event->object.overlay = NULL; } @@ -406,9 +408,11 @@ static int video_overlay_event( video_overlay_t *this, int64_t vpts ) { printf ("video_overlay: FREE SPU NOW\n"); #endif /* free any overlay associated with this event */ - if (this->events[this_event].event->object.overlay != NULL) { + if( this->events[this_event].event->object.overlay != NULL) { + if( this->events[this_event].event->object.overlay->rle != NULL ) + free( this->events[this_event].event->object.overlay->rle ); free(this->events[this_event].event->object.overlay); - this->events[this_event].event->object.overlay = NULL; + this->events[this_event].event->object.overlay = NULL; } /* this avoid removing this_event from the queue * (it will be removed at the end of this loop) */ -- cgit v1.2.3 From 33d32c6238d0d5d9ae00a2fee6bba2c987ff0f21 Mon Sep 17 00:00:00 2001 From: Simon Farnsworth Date: Thu, 12 Jul 2007 11:29:42 +0100 Subject: Fix thread leak in DVB subtitles, and enhance spec compliance When leaving xine playing DVB with subtitles for a long period of time, I noticed a gradual increase in memory use, caused by it creating more and more timeout threads. In addition, the existing thread was not safe w.r.t destruction of the decoder, and would occasionally segfault xine. Further, EN 300 743 states that the timeout should be sent by the broadcaster; the existing thread had a constant 6 second timeout, whereas (e.g.) BBC NEWS 24 subtitles are broadcast with a 15 second timeout. In theory, this could result in subtitles being hidden in error. This rework changes the thread to pick up a timeout set by draw_subtitles; in addition, it uses pthread condition variables to avoid any need to kill and recreate the thread. --- src/libspudvb/xine_spudvb_decoder.c | 139 ++++++++++++++++++++---------------- 1 file changed, 76 insertions(+), 63 deletions(-) diff --git a/src/libspudvb/xine_spudvb_decoder.c b/src/libspudvb/xine_spudvb_decoder.c index f2fcfe182..339d66b2e 100644 --- a/src/libspudvb/xine_spudvb_decoder.c +++ b/src/libspudvb/xine_spudvb_decoder.c @@ -28,15 +28,11 @@ */ #include "pthread.h" +#include #include "xine_internal.h" #include "osd.h" #define MAX_REGIONS 7 -/* check every DVBSUB_TIMER_DELAY seconds */ -#define DVBSUB_TIMER_DELAY 1 -/* hide subs after n counts of the delay */ -#define SUB_TIMEOUT 6 - typedef struct { int x, y; unsigned char is_visible; @@ -90,6 +86,9 @@ typedef struct dvb_spu_decoder_s { spu_dvb_descriptor_t *spu_descriptor; + /* dvbsub_osd_mutex should be locked around all calls to this->osd_renderer->show() + and this->osd_renderer->hide() */ + pthread_mutex_t dvbsub_osd_mutex; osd_object_t *osd; char *bitmap; @@ -101,11 +100,9 @@ typedef struct dvb_spu_decoder_s { uint64_t vpts; uint64_t end_vpts; - pthread_mutex_t dvbsub_timer_mutex; - /* This is set to non-zero if the timer thread is wanted to stop. */ - int dvbsub_timer_stop; pthread_t dvbsub_timer_thread; - unsigned int dvbsub_timer_tcount; + struct timespec dvbsub_hide_timeout; + pthread_cond_t dvbsub_restart_timeout; dvbsub_func_t *dvbsub; int show; } dvb_spu_decoder_t; @@ -544,43 +541,58 @@ void process_object_data_segment (dvb_spu_decoder_t * this) } } - -/* Sleep routine for pthread */ -static void dvbsub_pthread_sleep(int seconds) { - pthread_mutex_t dummy_mutex; - pthread_cond_t dummy_cond; - struct timespec timeout; - - /* Create a dummy mutex which doesn't unlock for sure while waiting. */ - pthread_mutex_init(&dummy_mutex, NULL); - pthread_mutex_lock(&dummy_mutex); - - /* Create a dummy condition variable. */ - pthread_cond_init(&dummy_cond, NULL); - - timeout.tv_sec = time(NULL) + seconds; - timeout.tv_nsec = 0; - - pthread_cond_timedwait(&dummy_cond, &dummy_mutex, &timeout); - - pthread_cond_destroy(&dummy_cond); - pthread_mutex_unlock(&dummy_mutex); - pthread_mutex_destroy(&dummy_mutex); +static void unlock_mutex_cancellation_func(void *mutex_gen) +{ + pthread_mutex_t *mutex = (pthread_mutex_t*) mutex_gen; + pthread_mutex_unlock(mutex); } +/* Thread routine that checks for subtitle timeout periodically. + To avoid unexpected subtitle hiding, calls to this->stream->osd_renderer->show() + should be in blocks like: -/* Thread routine that checks for subtitle timeout periodically. */ -static void* dvbsub_timer_func(void *this_gen) { - dvb_spu_decoder_t *this = (dvb_spu_decoder_t *) this_gen; + pthread_mutex_lock(&this->dvbsub_osd_mutex); + this->stream->osd_renderer->show(...); + this->dvbsub_hide_timeout.tv_sec = time(NULL) + timeout value; + pthread_cond_signal(&this->dvbsub_restart_timeout); + pthread_mutex_unlock(&this->dvbsub_osd_mutex); - while (!this->dvbsub_timer_stop) { - pthread_mutex_lock(&this->dvbsub_timer_mutex); - if(this->dvbsub_timer_tcount++ > SUB_TIMEOUT) - this->stream->osd_renderer->hide (this->osd, 0); - pthread_mutex_unlock(&this->dvbsub_timer_mutex); - dvbsub_pthread_sleep(DVBSUB_TIMER_DELAY); + This ensures that the timeout is changed with the lock held, and + that the thread is signalled to pick up the new timeout. +*/ +static void* dvbsub_timer_func(void *this_gen) +{ + dvb_spu_decoder_t *this = (dvb_spu_decoder_t *) this_gen; + pthread_mutex_lock(&this->dvbsub_osd_mutex); + + /* If we're cancelled via pthread_cancel, unlock the mutex */ + pthread_cleanup_push(unlock_mutex_cancellation_func, &this->dvbsub_osd_mutex); + + while(1) + { + /* Record the current timeout, and wait - note that pthread_cond_timedwait + will unlock the mutex on entry, and lock it on exit */ + struct timespec timeout = this->dvbsub_hide_timeout; + int result = pthread_cond_timedwait(&this->dvbsub_restart_timeout, + &this->dvbsub_osd_mutex, + &this->dvbsub_hide_timeout); + if(result == ETIMEDOUT && + timeout.tv_sec == this->dvbsub_hide_timeout.tv_sec && + timeout.tv_nsec == this->dvbsub_hide_timeout.tv_nsec) + { + /* We timed out, and no-one changed the timeout underneath us. + Hide the OSD, then wait until we're signalled. */ + if(this && this->stream && this->stream->osd_renderer && this->osd) + { + lprintf("Hiding OSD in emergency thread\n"); + this->stream->osd_renderer->hide(this->osd, 0); + } + pthread_cond_wait(&this->dvbsub_restart_timeout, &this->dvbsub_osd_mutex); } - return NULL; + } + + pthread_cleanup_pop(1); + return NULL; } void draw_subtitles (dvb_spu_decoder_t * this) @@ -614,23 +626,17 @@ void draw_subtitles (dvb_spu_decoder_t * this) if(display){ - /* start timer thread if stopped */ - if(this->dvbsub_timer_stop){ - this->dvbsub_timer_stop=0; - if (pthread_create(&this->dvbsub_timer_thread, NULL, dvbsub_timer_func, this) != 0) { - xprintf(this->class->xine, XINE_VERBOSITY_DEBUG, _("dvbsub: cannot create timer thread\n")); - } - } - /* display immediately at requested PTS*/ this->stream->osd_renderer->set_palette(this->osd,(uint32_t *)this->dvbsub->colours,this->dvbsub->trans); this->stream->osd_renderer->draw_bitmap (this->osd,this->bitmap, 1,1,720,576,NULL); - pthread_mutex_lock(&this->dvbsub_timer_mutex); + pthread_mutex_lock(&this->dvbsub_osd_mutex); this->stream->osd_renderer->show (this->osd, this->vpts); - /* reset the timer thread */ - this->dvbsub_timer_tcount=0; - pthread_mutex_unlock(&this->dvbsub_timer_mutex); + this->dvbsub_hide_timeout.tv_nsec = 0; + this->dvbsub_hide_timeout.tv_sec = time(NULL) + this->dvbsub->page.page_time_out; + lprintf("page_time_out %d\n",this->dvbsub->page.page_time_out); + pthread_cond_signal(&this->dvbsub_restart_timeout); + pthread_mutex_unlock(&this->dvbsub_osd_mutex); } } @@ -651,8 +657,10 @@ static void spudec_decode_data (spu_decoder_t * this_gen, buf_element_t * buf) if (buf->decoder_flags & BUF_FLAG_SPECIAL) { if (buf->decoder_info[1] == BUF_SPECIAL_SPU_DVB_DESCRIPTOR) { if (buf->decoder_info[2] == 0) { - this->dvbsub_timer_stop=1; - this->stream->osd_renderer->hide (this->osd, 0); + /* Hide the osd - note that if the timeout thread times out, it'll rehide, which is harmless */ + pthread_mutex_lock(&this->dvbsub_osd_mutex); + this->stream->osd_renderer->hide(this->osd, 0); + pthread_mutex_unlock(&this->dvbsub_osd_mutex); } else { xine_fast_memcpy (this->spu_descriptor, buf->decoder_info_ptr[2], buf->decoder_info[2]); @@ -746,8 +754,10 @@ static void spudec_reset (spu_decoder_t * this_gen) { dvb_spu_decoder_t *this = (dvb_spu_decoder_t *) this_gen; - if (this->osd) - this->stream->osd_renderer->hide (this->osd, 0); + /* Hide the osd - if the timeout thread times out, it'll rehide harmlessly */ + pthread_mutex_lock(&this->dvbsub_osd_mutex); + this->stream->osd_renderer->hide(this->osd, 0); + pthread_mutex_unlock(&this->dvbsub_osd_mutex); } @@ -760,9 +770,10 @@ static void spudec_dispose (spu_decoder_t * this_gen) { dvb_spu_decoder_t *this = (dvb_spu_decoder_t *) this_gen; - if(!this->dvbsub_timer_stop){ - this->dvbsub_timer_stop=1; - } + pthread_cancel(this->dvbsub_timer_thread); + pthread_join(this->dvbsub_timer_thread, NULL); + pthread_mutex_destroy(&this->dvbsub_osd_mutex); + pthread_cond_destroy(&this->dvbsub_restart_timeout); if(this->spu_descriptor){ free(this->spu_descriptor); @@ -822,9 +833,11 @@ static spu_decoder_t *dvb_spu_class_open_plugin (spu_decoder_class_t * class_gen this->stream->osd_renderer->set_encoding (this->osd, NULL); this->stream->osd_renderer->set_text_palette (this->osd, TEXTPALETTE_YELLOW_BLACK_TRANSPARENT, OSD_TEXT1); - - /* subtitle timer thread. */ - this->dvbsub_timer_stop = 1; + pthread_mutex_init(&this->dvbsub_osd_mutex, NULL); + pthread_cond_init(&this->dvbsub_restart_timeout, NULL); + this->dvbsub_hide_timeout.tv_nsec = 0; + this->dvbsub_hide_timeout.tv_sec = time(NULL); + pthread_create(&this->dvbsub_timer_thread, NULL, dvbsub_timer_func, this); return (spu_decoder_t *) this; } -- cgit v1.2.3 From 198fa979f89ba74743a301816d38b46a73770856 Mon Sep 17 00:00:00 2001 From: Simon Farnsworth Date: Thu, 12 Jul 2007 11:28:43 +0100 Subject: Remove realloc from osd.c to prevent memory leak due to fragmentation show() in osd.c uses realloc in an effort to minimise the amount of memory actually used for rle objects. In practice, this caused xine to fragment memory, and gradually use more and more RAM (measured over a period of 24 to 72 hours). Change osd.c to allocate the maximum amount of memory it could need; because it touches this memory in a linear fashion, lazy page allocation will ensure that most of the memory used is needed. Further, because this makes the per-drawing allocations the same size, it avoids virtual address space fragmentation. --- src/xine-engine/osd.c | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/src/xine-engine/osd.c b/src/xine-engine/osd.c index c4709c8ab..ebc12300b 100644 --- a/src/xine-engine/osd.c +++ b/src/xine-engine/osd.c @@ -197,7 +197,7 @@ static int _osd_show (osd_object_t *osd, int64_t vpts, int unscaled ) { osd_renderer_t *this = osd->renderer; video_overlay_manager_t *ovl_manager; rle_elem_t rle, *rle_p=0; - int x, y, required; + int x, y; uint8_t *c; lprintf("osd=%p vpts=%"PRId64"\n", osd, vpts); @@ -251,11 +251,11 @@ static int _osd_show (osd_object_t *osd, int64_t vpts, int unscaled ) { this->event.object.overlay->hili_right = this->event.object.overlay->width; /* there will be at least that many rle objects (one for each row) */ - required = osd->y2 - osd->y1; this->event.object.overlay->num_rle = 0; - this->event.object.overlay->data_size = 1024; - while (required > this->event.object.overlay->data_size) - this->event.object.overlay->data_size += 1024; + /* We will never need more rle objects than columns in any row + Rely on lazy page allocation to avoid us actually taking up + this much RAM */ + this->event.object.overlay->data_size = osd->width * osd->height; rle_p = this->event.object.overlay->rle = malloc(this->event.object.overlay->data_size * sizeof(rle_elem_t) ); @@ -272,14 +272,6 @@ static int _osd_show (osd_object_t *osd, int64_t vpts, int unscaled ) { /* loop over the remaining pixels in the row */ for( x = osd->x1 + rle.len; x < osd->x2; x++, c++ ) { if( rle.color != *c ) { - if( (this->event.object.overlay->num_rle + required) > - this->event.object.overlay->data_size ) { - this->event.object.overlay->data_size += 1024; - rle_p = this->event.object.overlay->rle = - realloc( this->event.object.overlay->rle, - this->event.object.overlay->data_size * sizeof(rle_elem_t) ); - rle_p += this->event.object.overlay->num_rle; - } #ifdef DEBUG_RLE lprintf("(%d, %d), ", rle.len, rle.color); #endif @@ -297,8 +289,6 @@ static int _osd_show (osd_object_t *osd, int64_t vpts, int unscaled ) { #endif *rle_p++ = rle; this->event.object.overlay->num_rle++; - /* another row done */ - required--; } #ifdef DEBUG_RLE lprintf("osd_show %p rle ends\n", osd); -- cgit v1.2.3 From 7aa6fcf6f8947faa67e095c8decff779673de17f Mon Sep 17 00:00:00 2001 From: Simon Farnsworth Date: Thu, 12 Jul 2007 11:24:27 +0100 Subject: Simplify input_rtp locking We have seen input_rtp lock up in use, and traced the problem to the separate tail/head locks on the input buffer. Reduce to a single lock, increasing lock contention between the reader and the writer, but removing the previous deadlock risk. Also use select() before recv(), to ensure that we never wait forever for packets (e.g. if we're trying to receive a multicast stream, but an administrator has blocked all multicast packets to the device - iptables -A INPUT --dst 224.0.0.0/4 -j DROP induces this failure for testing). --- src/input/input_rtp.c | 193 ++++++++++++++++++++++++++++---------------------- 1 file changed, 108 insertions(+), 85 deletions(-) diff --git a/src/input/input_rtp.c b/src/input/input_rtp.c index d4ba804c6..681bced0f 100644 --- a/src/input/input_rtp.c +++ b/src/input/input_rtp.c @@ -79,6 +79,7 @@ #include #include #include +#include #if defined (__SVR4) && defined (__sun) # include @@ -125,11 +126,9 @@ typedef struct { int fh; unsigned char *buffer; /* circular buffer */ - unsigned char *buffer_tail; /* tail pointer used by reader */ - unsigned char *buffer_head; /* head pointer used by writer */ + unsigned char *buffer_get_ptr; /* get pointer used by reader */ + unsigned char *buffer_put_ptr; /* put pointer used by writer */ long buffer_count; /* number of bytes in the buffer */ - pthread_mutex_t buffer_mutex; /* only used for locking the - * the buffer count variable */ unsigned char packet_buffer[65536]; @@ -143,13 +142,12 @@ typedef struct { char preview[MAX_PREVIEW_SIZE]; int preview_size; + int preview_read_done; /* boolean true after attempt to read input stream for preview */ nbc_t *nbc; - pthread_mutex_t writer_mut; + pthread_mutex_t buffer_ring_mut; pthread_cond_t writer_cond; - - pthread_mutex_t reader_mut; pthread_cond_t reader_cond; } rtp_input_plugin_t; @@ -198,7 +196,7 @@ static int host_connect_attempt(struct in_addr ia, int port, /* Try to increase receive buffer to 1MB to avoid dropping packets */ - optval = 1024 * 1024; + optval = BUFFER_SIZE; if ((setsockopt(s, SOL_SOCKET, SO_RCVBUF, &optval, sizeof(optval))) < 0) { LOG_MSG(xine, _("setsockopt(SO_RCVBUF): %s.\n"), strerror(errno)); @@ -298,6 +296,7 @@ static void * input_plugin_read_loop(void *arg) { rtp_input_plugin_t *this = (rtp_input_plugin_t *) arg; unsigned char *data; long length; + fd_set read_fds; while (1) { @@ -308,8 +307,28 @@ static void * input_plugin_read_loop(void *arg) { */ pthread_testcancel(); - length = recv(this->fh, this->packet_buffer, - sizeof(this->packet_buffer), 0); + { + struct timeval recv_timeout; + int rc; + + recv_timeout.tv_sec = 2; + recv_timeout.tv_usec = 0; + + FD_ZERO( &read_fds ); + FD_SET( this->fh, &read_fds ); + + /* wait for a packet to arrive - but do not hang! */ + rc = select( this->fh+1, &read_fds, NULL, NULL, &recv_timeout ); + if( rc > 0 ) + { + length = recv(this->fh, this->packet_buffer, + sizeof(this->packet_buffer), 0); + } + else if( rc == 0 ) + length = 0; + else + length = -1; + } pthread_testcancel(); if (length < 0) { @@ -362,28 +381,31 @@ static void * input_plugin_read_loop(void *arg) { } /* insert data into cyclic buffer */ - while (length > 0) { - - /* work with a copy of buffer count, while the variable can - * be updated by the reader - */ - - long buffer_count = this->buffer_count; - long n; + if (length > 0) { /* * if the buffer is full, wait for the reader * to signal */ - if(buffer_count >= BUFFER_SIZE) { - pthread_mutex_lock(&this->writer_mut); - pthread_cond_wait(&this->writer_cond, &this->writer_mut); - pthread_mutex_unlock(&this->writer_mut); - /* update the buffer count again */ - buffer_count = this->buffer_count; - } - + pthread_mutex_lock(&this->buffer_ring_mut); + /* wait for enough space to write the whole of the recv'ed data */ + while( (BUFFER_SIZE - this->buffer_count) < length ) + { + struct timeval tv; + struct timespec timeout; + + gettimeofday(&tv, NULL); + + timeout.tv_nsec = tv.tv_usec * 1000; + timeout.tv_sec = tv.tv_sec + 2; + + if( pthread_cond_timedwait(&this->writer_cond, &this->buffer_ring_mut, &timeout) != 0 ) + { + fprintf( stdout, "input_rtp: buffer ring not read within 2 seconds!\n" ); + } + } + /* Now there's enough space to write some bytes into the buffer * determine how many bytes can be written. If the buffer wraps * around, write in two pieces: from the head pointer to the @@ -391,37 +413,29 @@ static void * input_plugin_read_loop(void *arg) { * of bytes. */ - if(length > (BUFFER_SIZE - buffer_count)) { - n = BUFFER_SIZE - buffer_count; - } - else { - n = length; - } - - if(((this->buffer_head - this->buffer) + n) > BUFFER_SIZE) { - n = BUFFER_SIZE - (this->buffer_head - this->buffer); - } - - /* The actual write... */ - memcpy(this->buffer_head, data, n); + { + long buffer_space_remaining = BUFFER_SIZE - (this->buffer_put_ptr - this->buffer); + + if( buffer_space_remaining >= length ) + { + /* data fits inside the buffer */ + memcpy(this->buffer_put_ptr, data, length); + this->buffer_put_ptr += length; + } + else + { + /* data wrapped around the end of the buffer */ + memcpy(this->buffer_put_ptr, data, buffer_space_remaining); + memcpy(this->buffer, &data[buffer_space_remaining], length - buffer_space_remaining); + this->buffer_put_ptr = &this->buffer[ length - buffer_space_remaining ]; + } + } - data += n; - length -= n; - - /* update head pointer; and check for wrap around */ - this->buffer_head += n; - if(this->buffer_head - this->buffer >= BUFFER_SIZE) - this->buffer_head = this->buffer; - - /* lock the mutex; for updating the count */ - pthread_mutex_lock(&this->buffer_mutex); - this->buffer_count += n; - pthread_mutex_unlock(&this->buffer_mutex); + this->buffer_count += length; /* signal the reader that there is new data */ - pthread_mutex_lock(&this->reader_mut); pthread_cond_signal(&this->reader_cond); - pthread_mutex_unlock(&this->reader_mut); + pthread_mutex_unlock(&this->buffer_ring_mut); } } } @@ -443,33 +457,25 @@ static off_t rtp_plugin_read (input_plugin_t *this_gen, off_t n; - /* work with a copy of the buffer count, while the variable can - * be updated by the writer - */ + pthread_mutex_lock(&this->buffer_ring_mut); - long buffer_count = this->buffer_count; - /* * if nothing in the buffer, wait for data for 5 seconds. If * no data is received within this timeout, return the number * of bytes already received (which is likely to be 0) */ - if(buffer_count == 0) { + if(this->buffer_count == 0) { gettimeofday(&tv, NULL); timeout.tv_nsec = tv.tv_usec * 1000; timeout.tv_sec = tv.tv_sec + 5; - pthread_mutex_lock(&this->reader_mut); - if(pthread_cond_timedwait(&this->reader_cond, &this->reader_mut, &timeout) != 0) + if(pthread_cond_timedwait(&this->reader_cond, &this->buffer_ring_mut, &timeout) != 0) { /* we timed out, no data available */ - pthread_mutex_unlock(&this->reader_mut); + pthread_mutex_unlock(&this->buffer_ring_mut); return copied; } - pthread_mutex_unlock(&this->reader_mut); - /* update the local buffer count variable again */ - buffer_count = this->buffer_count; } /* Now determine how many bytes can be read. If the buffer @@ -478,38 +484,34 @@ static off_t rtp_plugin_read (input_plugin_t *this_gen, * update the buffer count. Finally read the second piece * from the base to the remaining count */ - if(length > buffer_count) { - n = buffer_count; + if(length > this->buffer_count) { + n = this->buffer_count; } else { n = length; } - if(((this->buffer_tail - this->buffer) + n) > BUFFER_SIZE) { - n = BUFFER_SIZE - (this->buffer_tail - this->buffer); + if(((this->buffer_get_ptr - this->buffer) + n) > BUFFER_SIZE) { + n = BUFFER_SIZE - (this->buffer_get_ptr - this->buffer); } /* the actual read */ - memcpy(buf, this->buffer_tail, n); + memcpy(buf, this->buffer_get_ptr, n); buf += n; copied += n; length -= n; /* update the tail pointer, watch for wrap arounds */ - this->buffer_tail += n; - if(this->buffer_tail - this->buffer >= BUFFER_SIZE) - this->buffer_tail = this->buffer; + this->buffer_get_ptr += n; + if(this->buffer_get_ptr - this->buffer >= BUFFER_SIZE) + this->buffer_get_ptr = this->buffer; - /* lock the buffer, for updating the count */ - pthread_mutex_lock(&this->buffer_mutex); this->buffer_count -= n; - pthread_mutex_unlock(&this->buffer_mutex); /* signal the writer that there's space in the buffer again */ - pthread_mutex_lock(&this->writer_mut); pthread_cond_signal(&this->writer_cond); - pthread_mutex_unlock(&this->writer_mut); + pthread_mutex_unlock(&this->buffer_ring_mut); } this->curpos += copied; @@ -517,6 +519,27 @@ static off_t rtp_plugin_read (input_plugin_t *this_gen, return copied; } +static buf_element_t *rtp_plugin_read_block (input_plugin_t *this_gen, + fifo_buffer_t *fifo, off_t todo) { + buf_element_t *buf = fifo->buffer_pool_alloc (fifo); + int total_bytes; + + + buf->content = buf->mem; + buf->type = BUF_DEMUX_BLOCK; + + total_bytes = rtp_plugin_read (this_gen, buf->content, todo); + + if (total_bytes != todo) { + buf->free_buffer (buf); + return NULL; + } + + buf->size = total_bytes; + + return buf; +} + /* * */ @@ -584,9 +607,11 @@ static int rtp_plugin_get_optional_data (input_plugin_t *this_gen, */ if (data_type == INPUT_OPTIONAL_DATA_PREVIEW) { - if (this->preview_size == 0) { + if (!this->preview_read_done) { this->preview_size = rtp_plugin_read(this_gen, this->preview, MAX_PREVIEW_SIZE); lprintf("Preview data length = %d\n", this->preview_size); + + this->preview_read_done = 1; } memcpy(data, this->preview, this->preview_size); return this->preview_size; @@ -705,23 +730,21 @@ static input_plugin_t *rtp_class_get_instance (input_class_t *cls_gen, if (iptr) this->interface = iptr; - pthread_mutex_init(&this->buffer_mutex, NULL); - pthread_mutex_init(&this->reader_mut, NULL); - pthread_mutex_init(&this->writer_mut, NULL); + pthread_mutex_init(&this->buffer_ring_mut, NULL); pthread_cond_init(&this->reader_cond, NULL); pthread_cond_init(&this->writer_cond, NULL); this->buffer = malloc(BUFFER_SIZE); - this->buffer_head = this->buffer; - this->buffer_tail = this->buffer; + this->buffer_put_ptr = this->buffer; + this->buffer_get_ptr = this->buffer; this->buffer_count = 0; this->curpos = 0; this->input_plugin.open = rtp_plugin_open; this->input_plugin.get_capabilities = rtp_plugin_get_capabilities; this->input_plugin.read = rtp_plugin_read; - this->input_plugin.read_block = NULL; + this->input_plugin.read_block = rtp_plugin_read_block; this->input_plugin.seek = rtp_plugin_seek; this->input_plugin.get_current_pos = rtp_plugin_get_current_pos; this->input_plugin.get_length = rtp_plugin_get_length; -- cgit v1.2.3 From d7008b1c096a1d537313f95f872808460f9ffada Mon Sep 17 00:00:00 2001 From: Simon Farnsworth Date: Thu, 12 Jul 2007 11:18:15 +0100 Subject: Allow input_dvb to timeout on no signal If there's no signal, the tuner never goes to FE_TIMEDOUT. Add a separate timeout, to prevent xine waiting forever in these situations. --- src/input/input_dvb.c | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/src/input/input_dvb.c b/src/input/input_dvb.c index 98b343b44..5b3f0b086 100644 --- a/src/input/input_dvb.c +++ b/src/input/input_dvb.c @@ -1001,6 +1001,9 @@ static int tuner_tune_it (tuner_t *this, struct dvb_frontend_parameters struct dvb_frontend_event event; unsigned int strength; struct pollfd pfd[1]; + xine_cfg_entry_t config_tuning_timeout; + struct timeval time_now; + struct timeval tuning_timeout; /* discard stale events */ while (ioctl(this->fd_frontend, FE_GET_EVENT, &event) != -1); @@ -1028,6 +1031,19 @@ static int tuner_tune_it (tuner_t *this, struct dvb_frontend_parameters return 0; } } + + xine_config_lookup_entry(this->xine, "media.dvb.tuning_timeout", &config_tuning_timeout); + xprintf(this->xine, XINE_VERBOSITY_DEBUG, "input_dvb: media.dvb.tuning_timeout is %d\n", config_tuning_timeout.num_value ); + + if( config_tuning_timeout.num_value != 0 ) { + gettimeofday( &tuning_timeout, NULL ); + if( config_tuning_timeout.num_value < 5 ) + tuning_timeout.tv_sec += 5; + else + tuning_timeout.tv_sec += config_tuning_timeout.num_value; + } + + xprintf(this->xine, XINE_VERBOSITY_DEBUG, "input_dvb: tuner_tune_it - waiting for lock...\n" ); do { status = 0; @@ -1040,8 +1056,20 @@ static int tuner_tune_it (tuner_t *this, struct dvb_frontend_parameters if (status & FE_HAS_LOCK) { break; } - usleep(500000); - print_error("Trying to get lock..."); + + /* FE_TIMEDOUT does not happen in a no signal condition. + * Use the tuning_timeout config to prevent a hang in this loop + */ + if( config_tuning_timeout.num_value != 0 ) { + gettimeofday( &time_now, NULL ); + if( time_now.tv_sec > tuning_timeout.tv_sec ) { + xprintf(this->xine, XINE_VERBOSITY_DEBUG, "input_dvb: No FE_HAS_LOCK before timeout\n"); + break; + } + } + + usleep(10000); + xprintf(this->xine, XINE_VERBOSITY_DEBUG, "Trying to get lock..."); } while (!(status & FE_TIMEDOUT)); /* inform the user of frontend status */ @@ -3250,6 +3278,12 @@ static void *init_class (xine_t *xine, void *data) { _("If enabled xine will remember and switch to this channel. "), 21, NULL, NULL); + config->register_num(config, "media.dvb.tuning_timeout", + 0, + _("Number of seconds until tuning times out."), + _("Leave at 0 means try forever. " + "Greater then 0 means wait that many seconds to get a lock. Minimum is 5 seconds."), + 0, NULL, (void *) this); config->register_num(config, "media.dvb.adapter", 0, -- cgit v1.2.3 From 11a62668b3a6e83574470ada57ed150bcee66d88 Mon Sep 17 00:00:00 2001 From: Darren Salt Date: Fri, 13 Jul 2007 20:32:38 +0100 Subject: Fix a spelling error in the media.dvb.tuning_timeout description. --- src/input/input_dvb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/input/input_dvb.c b/src/input/input_dvb.c index 5b3f0b086..b3a399ce4 100644 --- a/src/input/input_dvb.c +++ b/src/input/input_dvb.c @@ -3282,7 +3282,7 @@ static void *init_class (xine_t *xine, void *data) { 0, _("Number of seconds until tuning times out."), _("Leave at 0 means try forever. " - "Greater then 0 means wait that many seconds to get a lock. Minimum is 5 seconds."), + "Greater than 0 means wait that many seconds to get a lock. Minimum is 5 seconds."), 0, NULL, (void *) this); config->register_num(config, "media.dvb.adapter", -- cgit v1.2.3 From b417806ce02dcc44352610e6898f6287677b13e1 Mon Sep 17 00:00:00 2001 From: Darren Salt Date: Fri, 13 Jul 2007 21:19:37 +0100 Subject: "debuild clean" should be removing include/configure.h.in, not config.h.in. --- debian/rules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/debian/rules b/debian/rules index d6c917315..75dd344ea 100755 --- a/debian/rules +++ b/debian/rules @@ -102,7 +102,7 @@ clean: # remove more cruft leftover by autohell rm -f doc/faq/faq.html doc/faq/faq.txt doc/hackersguide/hackersguide.html m4/caca.m4 -test -f .noauto || find . -name Makefile.in -print | xargs -r rm - test -f .noauto || rm -rf compile config.guess configure depcomp install-sh ltmain.sh missing aclocal.m4 config.h.in + test -f .noauto || rm -rf compile config.guess configure depcomp install-sh ltmain.sh missing aclocal.m4 include/configure.h.in dh_clean install: build -- cgit v1.2.3