summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDarren Salt <linux@youmustbejoking.demon.co.uk>2008-04-09 18:28:49 +0100
committerDarren Salt <linux@youmustbejoking.demon.co.uk>2008-04-09 18:28:49 +0100
commit39939c95eff90545285a9a8f761d9fa6e9349358 (patch)
treeb8ea1fa3f2ddf1627eeecbd889f47226b01a45d8
parent19357940a57c565ebe319729bd08d6e4800aff5d (diff)
parent628c4cbd9d023e74a7c6805d7ec0f163f2c172d1 (diff)
downloadxine-lib-39939c95eff90545285a9a8f761d9fa6e9349358.tar.gz
xine-lib-39939c95eff90545285a9a8f761d9fa6e9349358.tar.bz2
Merge from 1.2 main.
-rw-r--r--.hgignore2
-rw-r--r--.hgsigs2
-rw-r--r--.hgtags6
-rw-r--r--ChangeLog53
-rw-r--r--configure.ac6
-rw-r--r--debian/libxine2.install1
-rwxr-xr-xdebian/rules2
-rw-r--r--doc/faq/faq.docbook5
-rw-r--r--doc/man/en/Makefile.am12
-rw-r--r--doc/man/en/xine-config.145
-rw-r--r--doc/man/en/xine-list.1.in40
-rw-r--r--doc/man/en/xine.523
-rw-r--r--include/Makefile.am3
-rw-r--r--include/xine.h26
-rw-r--r--include/xine/audio_decoder.h2
-rw-r--r--include/xine/audio_out.h2
-rw-r--r--include/xine/buffer.h1
-rw-r--r--include/xine/demux.h2
-rw-r--r--include/xine/input_plugin.h2
-rw-r--r--include/xine/post.h2
-rw-r--r--include/xine/spu_decoder.h2
-rw-r--r--include/xine/vdr.h3
-rw-r--r--include/xine/video_decoder.h2
-rw-r--r--include/xine/video_out.h2
-rw-r--r--include/xine/xine_internal.h1
-rw-r--r--m4/decoders.m42
-rw-r--r--m4/getopt_long.m434
-rw-r--r--misc/Makefile.am4
-rw-r--r--misc/libxine.pc.in3
-rw-r--r--misc/xine-config.in7
-rw-r--r--misc/xine-list.c159
-rw-r--r--po/es.po628
-rw-r--r--po/libxine2.pot936
-rw-r--r--src/audio_dec/xine_dts_decoder.c32
-rw-r--r--src/audio_dec/xine_lpcm_decoder.c26
-rw-r--r--src/audio_dec/xine_mad_decoder.c2
-rw-r--r--src/audio_out/audio_oss_out.c27
-rw-r--r--src/audio_out/audio_pulse_out.c742
-rw-r--r--src/combined/ffmpeg/ff_audio_decoder.c81
-rw-r--r--src/combined/ffmpeg/ff_video_decoder.c26
-rw-r--r--src/combined/ffmpeg/ffmpeg_decoder.h6
-rw-r--r--src/combined/wavpack_combined.c2
-rw-r--r--src/combined/wavpack_demuxer.c4
-rw-r--r--src/combined/xine_ogg_demuxer.c5
-rw-r--r--src/demuxers/Makefile.am2
-rw-r--r--src/demuxers/asfheader.c14
-rw-r--r--src/demuxers/demux_4xm.c2
-rw-r--r--src/demuxers/demux_aiff.c35
-rw-r--r--src/demuxers/demux_avi.c10
-rw-r--r--src/demuxers/demux_dts.c72
-rw-r--r--src/demuxers/demux_film.c5
-rw-r--r--src/demuxers/demux_flac.c2
-rw-r--r--src/demuxers/demux_flv.c16
-rw-r--r--src/demuxers/demux_iff.c10
-rw-r--r--src/demuxers/demux_ipmovie.c5
-rw-r--r--src/demuxers/demux_matroska.c21
-rw-r--r--src/demuxers/demux_qt.c53
-rw-r--r--src/demuxers/demux_real.c157
-rw-r--r--src/demuxers/demux_realaudio.c90
-rw-r--r--src/demuxers/demux_vmd.c2
-rw-r--r--src/demuxers/demux_wav.c89
-rw-r--r--src/demuxers/demux_wc3movie.c11
-rw-r--r--src/demuxers/ebml.c24
-rw-r--r--src/demuxers/ebml.h4
-rw-r--r--src/demuxers/real_common.h56
-rw-r--r--src/input/libdvdnav/dvd_reader.c24
-rw-r--r--src/input/libdvdnav/dvd_reader.h2
-rw-r--r--src/input/libdvdnav/ifo_read.c6
-rw-r--r--src/input/libreal/sdpplin.c23
-rw-r--r--src/input/libreal/sdpplin.h4
-rw-r--r--src/libreal/xine_real_audio_decoder.c166
-rw-r--r--src/libreal/xine_real_video_decoder.c46
-rw-r--r--src/vdr/input_vdr.c223
-rw-r--r--src/video_dec/libmpeg2/decode.c7
-rw-r--r--src/video_out/video_out_macosx.m12
-rw-r--r--src/video_out/video_out_xcbxv.c23
-rw-r--r--src/video_out/video_out_xv.c22
-rw-r--r--src/video_out/video_out_xxmc.c21
-rw-r--r--src/video_out/xv_common.h11
-rw-r--r--src/xine-engine/buffer_types.c8
-rw-r--r--src/xine-engine/configfile.c2
-rw-r--r--src/xine-engine/demux.c15
-rw-r--r--src/xine-engine/load_plugins.c19
-rw-r--r--src/xine-engine/xine.c141
-rw-r--r--src/xine-utils/Makefile.am4
-rw-r--r--src/xine-utils/xmllexer.c2
-rw-r--r--src/xine-utils/xmlparser.c70
-rwxr-xr-xversion.sh3
88 files changed, 2991 insertions, 1516 deletions
diff --git a/.hgignore b/.hgignore
index d4ec3bb85..db78c4d49 100644
--- a/.hgignore
+++ b/.hgignore
@@ -64,6 +64,7 @@ doc/faq/faq.html
doc/faq/faq.txt
doc/hackersguide/*.png
doc/hackersguide/hackersguide.html
+doc/man/*/xine-list-*.1
doc/Doxyfile
include/xine/version.h
@@ -75,6 +76,7 @@ misc/relchk.sh
misc/xine-config
misc/xine-lib.spec
misc/xine-fontconv
+misc/xine-list-*
misc/cdda_server
po/POTFILES
diff --git a/.hgsigs b/.hgsigs
index 367ce4851..b6c252df8 100644
--- a/.hgsigs
+++ b/.hgsigs
@@ -3,3 +3,5 @@
1dbf784bebc791266fcca02e917ee63034ac2e0b 0 iD8DBQBHgQ2mzbwfTn7RbcARArl9AKCslqZDrrm0GiU3IbBvcQVbOdSXlwCgyEMuHY2y/+T6WEeB2CXvCTs5ulI=
b591d00fcd386cdd3779378c34b2d42b7504afc4 0 iD8DBQBHh5UfsBKtjPGfWZ8RAgvMAJ9xwnDNifmaobFYe2nR7+rJlLTkEQCgguGMqwqRZY68HWQXhEx918hp4Yg=
ae1e23df14223cdacf83df75b28b223895d658c2 0 iD8DBQBHm6SjsBKtjPGfWZ8RAi8HAKDAHmmLu8rwN5XJJPhfEofE7BTpsgCfTyNzku+v/PhqXgl4kQnRiB6nUSE=
+d912bda42df43a6ec24a4d479e202c327a733a42 0 iD8DBQBH4R2HsBKtjPGfWZ8RAr/IAJ46ypOhqO0EiSDrZYhumvpFYtrPQwCbBz/SXSDNuJNaKlR70Ep+THmhFIk=
+92dad3eca733ff0daecd6b1a539f8b077ea071cb 0 iD8DBQBH76CDsBKtjPGfWZ8RAnQUAJ9ARudZye68h9JIKe10wIsWm6OQEwCgvjS+c6o48SjNrb5l7i8KisKG89o=
diff --git a/.hgtags b/.hgtags
index bf92adc12..52e1e426a 100644
--- a/.hgtags
+++ b/.hgtags
@@ -67,3 +67,9 @@ b6be674453e922114b55d4613cb197c77d19f094 xine-lib-1_1_9-release
9438947f88ad2bed1832385301c6b4e62709625a xine-lib-1_1_9_1-release
7f1232425c6d715c404e6df1292075b33ecb8305 xine-lib-1_1_10-release
0e9e4df266f639ac7ba9e0c204f205686b56d5f9 xine-lib-1_1_10_1-release
+0735b106d018658f72be4a0648b4031c34c7f1e1 vdr-xine-version-711
+af8d20ae15d8c619ce0e215817d4b8fdba814407 vdr-xine-version-801
+c3a5e9ba6dfc694408275a54114d571d68acbd25 vdr-xine-version-712
+ffe7962edb79c2ed967b82a82ccfb2ac7eb148a2 vdr-xine-version-802
+10a6bc10e58f45f6cb79f634bdb6b7daa3167742 xine-lib-1_1_11-release
+2a2cc543b27b64a6587dfaef4f1d986eb2f2710a xine-lib-1_1_11_1-release
diff --git a/ChangeLog b/ChangeLog
index 57a8342f7..09853ee7c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -59,29 +59,70 @@ xine-lib (1.1.90) (Unreleased)
* Remove SyncFB video output plugin, the kernel module needed is no more
active and thus it's no more usable. If you were using SyncFB somehow,
please use DirectFB or VIDIX instead.
- * The Xv and XxMC video output plugins now support Xv port selection.
- (XvMC does not, at present.)
+ * The Xv and XxMC video output plugins now support Xv port selection via
+ two methods: port number and port type (currently "any", "overlay" and
+ "textured video"). Port number takes precedence; the plugins will fall
+ back on another port of the same type (if a type was specified) then on
+ whatever they can find.
+ XvMC does not support port selection at present.
* Report more video output capabilities via (port)->get_capabilities():
colour controls, zooming, colour keying.
-xine-lib (1.1.11) unreleased
+xine-lib (1.1.12) 2008-??-??
+ * Fixed and improved the PulseAudio driver.
+ * Fixed a regression in 1.1.11.1 which broke Quicktime container handling.
+ * And another, this time in the Matroska demuxer.
+ * Added a tool to assist with generating front ends' desktop files. It
+ lists MIME types & filename extensions known to the installed xine-lib.
+ * Various Real codec improvements, including:
+ - RV20 no longer causes segfaults (observed on amd64);
+ - Cook is now handled by ffmpeg.
+
+xine-lib (1.1.11.1) 2008-03-30
+ * Security fixes:
+ - Integer overflows in FLV, Qt, Real, WC3Movie, Matroska and FILM
+ demuxers, allowing remote attackers to trigger heap overflows and
+ possibly execute arbitrary code. (CVE-2008-1482)
+ * Added a few more memory allocation checks to the above demuxers.
+ * WAV file playback fix: don't assume that the first chunk is "fmt ".
+ * Don't try to play partial 24-bit AIFF frames (decoder would lose data).
+ * Fixed AIFF comment chunk handling and sample rate reading.
+ * LPCM fixes: input over-reading, conversion of 24-bit samples.
+
+xine-lib (1.1.11) 2008-03-19
+ * Security fixes:
+ - Array Indexing Vulnerability in sdpplin_parse(). (CVE-2008-0073)
* Reworked the plugin directory naming so that external plugins don't have
to be rebuilt for every release. We now use a naming scheme based on the
API/ABI versioning, checking older directories - with this release, the
- plugin directory name is 1.19, and if this gets bumped to 1.20 in a
- future release, 1.19 will still be available for external plugins.
+ plugin directory name is 1.20, and if this gets bumped to 1.21 in a
+ future release, 1.20 will still be available for external plugins.
(Any directories not 1.* won't be looked in.)
* Made the version parsing much more reliable; it wasn't properly coping
with four-part version numbers. This affects any program whose build
scripts use xine-lib's automake macros.
* Fixed an off-by-one in the FLAC security fix patch. This breakage was
causing failure to play some files.
+ * Support 16-bit big-endian DTS audio.
+ * Improved frame snapshot API. (ABI extension.)
+ * Re-add support for # (stream parameter separator) in raw filenames,
+ without the bugs found in the original implementation.
+ (This is a convenience feature for users only. Front ends which rely on
+ it for functions like subtitle file detection must instead use file://
+ MRLs; if they don't, we consider them to be buggy.)
+ * Fixed long delay when closing stream on dual core systems [Bug #33]
+ * DVD playback improvement: don't trust the file sizes.
+ * Build fixes for use with recent ffmpeg.
xine-lib (1.1.10.1) 2008-02-07
* Security fixes:
- Array index vulnerability which may allow remote attackers to execute
arbitrary code via a crafted FLAC tag, causing a stack buffer overflow.
(CVE-2008-0486)
+ - Buffer overflow in the Matroska demuxer (demuxers/demux_matroska.c)
+ which may allow remote attackers to cause a denial of service (crash)
+ or possibly execute arbitrary code via a Matroska file with invalid
+ frame sizes. (CVE-2008-1161)
* Fix a RealPlayer codec detection bug.
* Improve detection of MP3 streams with ID3v2 tags. Don't trust the tag
size.
@@ -90,7 +131,7 @@ xine-lib (1.1.10) 2008-01-26
* Security fixes:
- Buffer overflow which allows a remote attacker to execute arbitrary
code or crash the client program via a crafted ASF header.
- (Related to CVE-2006-1664)
+ (CVE-2008-1110, related to CVE-2006-1664)
* Update Ogg and Annodex mimetypes and extensions.
* Change the default v4l device paths to /dev/video0 and /dev/radio0.
* Fix support for subtitles with schemes (e.g. http://), partly broken
diff --git a/configure.ac b/configure.ac
index 8d2674e59..2a92ade01 100644
--- a/configure.ac
+++ b/configure.ac
@@ -66,6 +66,8 @@ AC_DEFINE_UNQUOTED([XINE_SUB], [$XINE_SUB], [xine sub version number])
XINE_PATCH=XINE_VERSION_PATCH
AC_SUBST(XINE_PATCH)
AC_DEFINE_UNQUOTED([XINE_PATCH], [$XINE_PATCH], [xine patch version number])
+XINE_SERIES=XINE_VERSION_SERIES
+AC_SUBST(XINE_SERIES)
XINE_LT_CURRENT=__XINE_LT_CURRENT
AC_SUBST(XINE_LT_CURRENT)
@@ -575,6 +577,9 @@ fi
CC_CHECK_CFLAGS([-ffast-math], [optflags="$optflags -ffast-math"])
CC_CHECK_CFLAGS([-fexpensive-optimizations], [optflags="$optflags -fexpensive-optimizations"])
+dnl initialize arch_86 as it is later tested for != "no"
+arch_x86=no
+
case "$host_or_hostalias" in
alphaev56-*) cpuflags="-mcpu=ev56 -mieee $cpuflags" ;;
alpha*) cpuflags="-mieee $cpuflags" ;;
@@ -895,6 +900,7 @@ AC_CHECK_FUNCS([pthread_mutex_timedlock],
[AC_LIBOBJ([timedlock])])
LIBS="$ac_save_LIBS"
+AC_GETOPT_LONG
dnl --------------------------
dnl checks for system services
diff --git a/debian/libxine2.install b/debian/libxine2.install
index 8c97ee196..980d1ed4a 100644
--- a/debian/libxine2.install
+++ b/debian/libxine2.install
@@ -1,3 +1,4 @@
+usr/bin/xine-list*
usr/lib/libxine*.so.*
usr/lib/xine/plugins/*/post/*.so
usr/lib/xine/plugins/*/*.so
diff --git a/debian/rules b/debian/rules
index 76b0a6c63..96dce1aa0 100755
--- a/debian/rules
+++ b/debian/rules
@@ -134,7 +134,7 @@ binary-arch: build install
dh_strip --dbg-package=libxine2
dh_compress
dh_fixperms
- dh_makeshlibs -V 'libxine2 (>= 1.2.0~)'
+ dh_makeshlibs -V 'libxine2 (>= 1.1.90)'
dh_installdeb
chmod +x debian/shlibdeps.sh
debian/shlibdeps.sh libxine${major}
diff --git a/doc/faq/faq.docbook b/doc/faq/faq.docbook
index 8d09441e1..acbb4c016 100644
--- a/doc/faq/faq.docbook
+++ b/doc/faq/faq.docbook
@@ -2223,7 +2223,7 @@
OK, yes, that shouldn't happen and you're upset. We can understand that.
But, to help you and of course to fix this, we need some information.
So, let's go through the checklist and maybe prepare a nice bug report
- for the xine-user mailing list:
+ for the <ulink url="http://bugs.xine-project.org/">xine bug tracker</ulink>:
<itemizedlist>
<listitem>
<para>
@@ -2269,8 +2269,7 @@
still under heavy development (nice excuse, isn't it? *grin*).
</para>
<para>
- If you write to the xine user mailing list
- <email>xine-user@lists.sourceforge.net</email>
+ If you write to the <ulink url="http://bugs.xine-project.org/">xine bug tracker</ulink>
make sure you include a the above information (when applicable)
and also some information about your machine (operating system, cpu type and
speed, gfx card, sound card, ...) and please use a meaningfull subject
diff --git a/doc/man/en/Makefile.am b/doc/man/en/Makefile.am
index ee0296033..9fe87cc11 100644
--- a/doc/man/en/Makefile.am
+++ b/doc/man/en/Makefile.am
@@ -1,5 +1,13 @@
include $(top_srcdir)/misc/Makefile.common
-man_MANS = xine-config.1 xine.5
+STATICMANS = xine-config.1 xine.5
+DYNAMICMANS = xine-list-@XINE_SERIES@.1
-EXTRA_DIST = $(man_MANS)
+man_MANS = $(STATICMANS) $(DYNAMICMANS)
+
+BUILT_SOURCES = $(DYNAMICMANS)
+DISTCLEANFILES = $(DYNAMICMANS)
+EXTRA_DIST = $(STATICMANS) xine-list.1.in
+
+xine-list-@XINE_SERIES@.1: xine-list.1.in
+ (echo '.ds xl xine\-list\-@XINE_SERIES@'; cat $<) >$@
diff --git a/doc/man/en/xine-config.1 b/doc/man/en/xine-config.1
index c43e3890a..034cd405c 100644
--- a/doc/man/en/xine-config.1
+++ b/doc/man/en/xine-config.1
@@ -1,9 +1,16 @@
+.de TQ
+.br
+.ns
+.TP \\$1
+..
.TH XINE 1 2001-08-28 "The xine project"
.SH NAME
-xine-config - script to get information about the installed version of libxine
+xine\-config - script to get information about the installed version of libxine
.SH SYNOPSIS
-.B xine-config
-[\-\-prefix\fI[=DIR]\fP] [\-\-exec\-prefix\fI[=DIR]\fP] [\-\-version] [\-\-libs] [\-\-cflags] [\-\-plugindir] [\-\-skindir]
+.B xine\-config
+[\-\-prefix\fI[=DIR]\fP] [\-\-exec\-prefix\fI[=DIR]\fP] [\-\-version]
+[\-\-libs] [\-\-cflags] [\-\-objcflags]
+[\-\-plugindir] [\-\-datadir] [\-\-scriptdir] [\-\-localedir]
.SH DESCRIPTION
.PP
\fIxine\-config is DEPRECATED. Use pkg\-config instead.\fP
@@ -14,19 +21,37 @@ and link programs that use \fIlibxine\fP. It can also be used to determine
the directories where \fIlibxine\fP expects plugins.
.SH OPTIONS
.l
-\fIxine-config\fP accepts the following options, passing them on (possibly
-modified) to \fIpkg-config libxine\fP:
+\fIxine\-config\fP accepts the following options, passing them on (possibly
+modified) to \fIpkg\-config libxine\fP:
.TP 8
.B \-\-version
\-\-modversion
+.br
+Print the currently installed version of \fIlibxine\fP on the standard output.
.TP 8
-.B \-\-libs \fP&\fB \-\-cflags
+.B \-\-libs
+.TQ 8
+.B \-\-cflags
+.TQ 8
+.B \-\-objcflags
Passed on unmodified.
+.br
+Print the compiler flags (for C and Objective C, respectively) that are
+necessary to compile a program that uses \fIlibxine\fP.
.TP 8
+.B \-\-bindir
+.TQ 8
.B \-\-plugindir
-\-\-variable=plugindir
+.TQ 8
+.B \-\-datadir
+.TQ 8
+.B \-\-scriptdir
+.TQ 8
+.B \-\-localedir
+\-\-variable=...
.br
-Print the directory where \fIlibxine\fP plugins are stored/expected.
+Print the directory where, respectively, \fIlibxine\fP binaries, plugins,
+data files, scripts and locale data are stored/expected.
.TP 8
.B \-\-prefix=PREFIX
\-\-define\-variable=prefix=PREFIX
@@ -45,8 +70,8 @@ If specified, use PREFIX instead of the installation exec prefix that
.BR xine-lib (3),
.BR xine (1)
.SH COPYRIGHT
-Copyright \(co 2001 Siggi Langauf, \(co 2001-2007 the xine project. Based on
-the man page for gtk-config, \(co 1998 Owen Taylor
+Copyright \(co 2001 Siggi Langauf, \(co 2001-2008 the xine project.
+Based on the man page for gtk-config, \(co 1998 Owen Taylor.
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted,
diff --git a/doc/man/en/xine-list.1.in b/doc/man/en/xine-list.1.in
new file mode 100644
index 000000000..e159852c8
--- /dev/null
+++ b/doc/man/en/xine-list.1.in
@@ -0,0 +1,40 @@
+.TH XINE 1 2001-08-28 "The xine project"
+.SH NAME
+\*(xl - get supported filetype information from xine-lib
+.SH SYNOPSIS
+.B \*(xl
+[\fPoptions...\fI]
+.SH DESCRIPTION
+.PP
+\fI\*(xl\fP is a tool that is used to list the MIME type and filename
+extension information known and supported by the installed \fIxine-lib\fP.
+It is of use in filling in MIME information in front ends' desktop files.
+.
+.SH OPTIONS
+.l
+\fIxine\-list\fP accepts the following options:
+.TP 8
+.B \-m
+.B \-\-mime\-types
+List the MIME types known to \fIxine-lib\fP. (This is the default action.)
+.TP 8
+.B \-e
+.B \-\-extensions
+List the file types (filename extensions) known to \fIxine-lib\fP.
+.TP 8
+.B \-a
+.B \-\-all
+List the MIME types known to \fIxine-lib\fP, along with their filename
+extensions and descriptions.
+.TP 8
+.B \-p
+.B \-\-pretty\-print
+Add line feeds; print each item on a line of its own.
+.SH COPYRIGHT
+Copyright \(co 2008 the xine project.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted, provided
+that the above copyright notice appear in all copies and that both that
+copyright notice and this permission notice appear in supporting
+documentation.
diff --git a/doc/man/en/xine.5 b/doc/man/en/xine.5
index 2c267f5d3..3d3975ec4 100644
--- a/doc/man/en/xine.5
+++ b/doc/man/en/xine.5
@@ -257,6 +257,23 @@ audio program ID
.TP 20
.B service-id
service ID (needed for now/next information etc.)
+.PP
+The following keyboard & mouse inputs may be accepted:
+.TP 24
+.B Menu 2
+Start/stop recording
+.TP 24
+.B Menu 3
+Toggle zoom
+.TP 24
+.B Menu 7
+Toggle now/next display
+.TP 24
+.B Previous/Next Chapter
+Previous/next channel
+.TP 24
+.B Mouse wheel & button 1
+Scroll through channel list & select the highlighted channel
.SH SUBTITLE
.B external subtitle files (any mrl)
.br
@@ -266,7 +283,7 @@ Text subtitle files may be appended to the MRL:.
This is the normal way to define the subtitle file to use. The frontend will
not take any notice of the subtitle file. For example:
.br
-.I file://home/user/wibble.mpg#subtitles:/home/user/wibble.sub
+.I file://home/user/wibble.mpg#subtitle:/home/user/wibble.sub
.br
(Note that some front ends can detect subtitles files where the name differs
as shown in the example.)
@@ -296,6 +313,10 @@ Set audio dynamic range compression.
.BI <config\ entry> : <config\ value>
Assign a new value to any config entry.
.TP
+.BI save: <file>
+Save the stream (if allowed) to the named file, relative to the directory
+given by the option "media.capture.save_dir".
+.TP
.B change configuration option 'on the fly':
.br
You can change a configuration option at any time, using the special
diff --git a/include/Makefile.am b/include/Makefile.am
index 7f569f498..aa26094a6 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -46,7 +46,8 @@ nobase_include_HEADERS = xine.h \
xine/xmllexer.h \
xine/xmlparser.h
-noinst_HEADERS = config.h configure.h
+noinst_HEADERS = config.h
+nodist_noinst_HEADERS = configure.h
nodist_include_HEADERS = $(inttypes_h)
diff --git a/include/xine.h b/include/xine.h
index 17b8cfbf6..035f4ef7f 100644
--- a/include/xine.h
+++ b/include/xine.h
@@ -401,14 +401,38 @@ int xine_get_param (xine_stream_t *stream, int param) XINE_PROTECTED;
* image format can be YUV 4:2:0 or 4:2:2
* will copy the image data into memory that <img> points to
* (interleaved for yuv 4:2:2 or planary for 4:2:0)
+ *
+ * xine_get_current_frame() requires that <img> must be able
+ * to hold the image data. Use a NULL pointer to retrieve the
+ * necessary parameters for calculating the buffer size. Be
+ * aware that the image can change between two successive calls
+ * so you better pause the stream.
+ *
+ * xine_get_current_frame_s() requires to specify the buffer
+ * size and it returns the needed / used size. It won't copy
+ * image data into a too small buffer.
+ *
+ * xine_get_current_frame_alloc() takes care of allocating
+ * a buffer on it's own, so image data can be retrieved by
+ * a single call without the need to pause the stream.
*
- * returns 1 on success, 0 failure.
+ * all functions return 1 on success, 0 failure.
*/
int xine_get_current_frame (xine_stream_t *stream,
int *width, int *height,
int *ratio_code, int *format,
uint8_t *img) XINE_PROTECTED;
+int xine_get_current_frame_s (xine_stream_t *stream,
+ int *width, int *height,
+ int *ratio_code, int *format,
+ uint8_t *img, int *size) XINE_PROTECTED;
+
+int xine_get_current_frame_alloc (xine_stream_t *stream,
+ int *width, int *height,
+ int *ratio_code, int *format,
+ uint8_t **img, int *size) XINE_PROTECTED;
+
/* xine image formats */
#define XINE_IMGFMT_YV12 (('2'<<24)|('1'<<16)|('V'<<8)|'Y')
#define XINE_IMGFMT_YUY2 (('2'<<24)|('Y'<<16)|('U'<<8)|'Y')
diff --git a/include/xine/audio_decoder.h b/include/xine/audio_decoder.h
index 49194e290..05d29823d 100644
--- a/include/xine/audio_decoder.h
+++ b/include/xine/audio_decoder.h
@@ -61,7 +61,7 @@ struct audio_decoder_class_s {
/**
* @brief Optional non-standard catalog to use with dgettext() for description.
*/
- const char *textdomain;
+ const char *text_domain;
/*
* free all class-related resources
diff --git a/include/xine/audio_out.h b/include/xine/audio_out.h
index b720110bf..25e5deb68 100644
--- a/include/xine/audio_out.h
+++ b/include/xine/audio_out.h
@@ -258,7 +258,7 @@ struct audio_driver_class_s {
/**
* @brief Optional non-standard catalog to use with dgettext() for description.
*/
- const char *textdomain;
+ const char *text_domain;
/*
* free all class-related resources
diff --git a/include/xine/buffer.h b/include/xine/buffer.h
index 9401f8852..a53b99db3 100644
--- a/include/xine/buffer.h
+++ b/include/xine/buffer.h
@@ -264,6 +264,7 @@ extern "C" {
#define BUF_AUDIO_SMACKER 0x033B0000
#define BUF_AUDIO_FLVADPCM 0x033C0000
#define BUF_AUDIO_WAVPACK 0x033D0000
+#define BUF_AUDIO_MP3ADU 0x033E0000
/*@}*/
/**
diff --git a/include/xine/demux.h b/include/xine/demux.h
index 35a5c9a82..72808f76d 100644
--- a/include/xine/demux.h
+++ b/include/xine/demux.h
@@ -66,7 +66,7 @@ struct demux_class_s {
/**
* @brief Optional non-standard catalog to use with dgettext() for description.
*/
- const char *textdomain;
+ const char *text_domain;
/**
* @brief MIME types supported for this plugin
diff --git a/include/xine/input_plugin.h b/include/xine/input_plugin.h
index e434dc5a8..95fc65c4e 100644
--- a/include/xine/input_plugin.h
+++ b/include/xine/input_plugin.h
@@ -60,7 +60,7 @@ struct input_class_s {
/**
* @brief Optional non-standard catalog to use with dgettext() for description.
*/
- const char *textdomain;
+ const char *text_domain;
/*
* ls function, optional: may be NULL
diff --git a/include/xine/post.h b/include/xine/post.h
index 10844d03a..a8f721a9a 100644
--- a/include/xine/post.h
+++ b/include/xine/post.h
@@ -65,7 +65,7 @@ struct post_class_s {
/**
* @brief Optional non-standard catalog to use with dgettext() for description.
*/
- const char *textdomain;
+ const char *text_domain;
/*
* free all class-related resources
diff --git a/include/xine/spu_decoder.h b/include/xine/spu_decoder.h
index d36b5b691..1833a22b4 100644
--- a/include/xine/spu_decoder.h
+++ b/include/xine/spu_decoder.h
@@ -62,7 +62,7 @@ struct spu_decoder_class_s {
/**
* @brief Optional non-standard catalog to use with dgettext() for description.
*/
- const char *textdomain;
+ const char *text_domain;
/*
* free all class-related resources
diff --git a/include/xine/vdr.h b/include/xine/vdr.h
index 5102d7f77..a2a3e800f 100644
--- a/include/xine/vdr.h
+++ b/include/xine/vdr.h
@@ -22,7 +22,7 @@
#define __VDR_H
-#define XINE_VDR_VERSION 801
+#define XINE_VDR_VERSION 802
enum funcs
@@ -270,6 +270,7 @@ typedef struct __attribute__((packed)) data_clear_s
int32_t n;
int8_t s;
+ uint8_t i;
}
data_clear_t;
diff --git a/include/xine/video_decoder.h b/include/xine/video_decoder.h
index 916cfe68b..022c2af33 100644
--- a/include/xine/video_decoder.h
+++ b/include/xine/video_decoder.h
@@ -62,7 +62,7 @@ struct video_decoder_class_s {
/**
* @brief Optional non-standard catalog to use with dgettext() for description.
*/
- const char *textdomain;
+ const char *text_domain;
/*
* free all class-related resources
diff --git a/include/xine/video_out.h b/include/xine/video_out.h
index 02eff3cac..0bdd0f557 100644
--- a/include/xine/video_out.h
+++ b/include/xine/video_out.h
@@ -403,7 +403,7 @@ struct video_driver_class_s {
/**
* @brief Optional non-standard catalog to use with dgettext() for description.
*/
- const char *textdomain;
+ const char *text_domain;
/*
* free all class-related resources
diff --git a/include/xine/xine_internal.h b/include/xine/xine_internal.h
index 20bf6a9c8..805c569a3 100644
--- a/include/xine/xine_internal.h
+++ b/include/xine/xine_internal.h
@@ -325,6 +325,7 @@ struct xine_stream_s {
/* demux thread stuff */
pthread_t demux_thread;
pthread_mutex_t demux_lock;
+ pthread_cond_t demux_resume;
pthread_mutex_t demux_mutex; /* used in _x_demux_... functions to synchronize order of pairwise A/V buffer operations */
extra_info_t *current_extra_info;
diff --git a/m4/decoders.m4 b/m4/decoders.m4
index a6c53f5fc..27c202c55 100644
--- a/m4/decoders.m4
+++ b/m4/decoders.m4
@@ -92,7 +92,7 @@ AC_DEFUN([XINE_DECODER_PLUGINS], [
dnl Check presence of ffmpeg/avutil.h to see if it's old or new
dnl style for headers. The new style would be preferred actually...
- AC_CHECK_HEADER([ffmpeg/avutil.h])
+ AC_CHECK_HEADERS([ffmpeg/avutil.h])
dnl gdk-pixbuf (optional; enabled by default)
AC_ARG_ENABLE([gdkpixbuf],
diff --git a/m4/getopt_long.m4 b/m4/getopt_long.m4
new file mode 100644
index 000000000..39f41ffc2
--- /dev/null
+++ b/m4/getopt_long.m4
@@ -0,0 +1,34 @@
+dnl ---------------------------------------------
+dnl Check for GNU getopt_long()
+dnl ---------------------------------------------
+
+AC_DEFUN([AC_GETOPT_LONG], [
+ AC_MSG_CHECKING(for GNU getopt_long)
+ AC_RUN_IFELSE([AC_LANG_SOURCE([[
+#include <stdio.h>
+#include <stdlib.h>
+#include <getopt.h>
+
+static struct option long_options[] = {
+ {"help" , no_argument, 0, 1 },
+ {"version" , no_argument, 0, 2 },
+ {0 , no_argument, 0, 0 }
+};
+
+int main (int argc, char **argv) {
+ int option_index = 0;
+ int c;
+ opterr = 0;
+ while ((c = getopt_long (argc, argv, "?hv",
+ long_options, &option_index)) != EOF)
+ ;
+ return 0;
+}
+ ]])],
+ [AC_MSG_RESULT(yes);
+ ac_getopt_long=yes;
+ AC_DEFINE(HAVE_GETOPT_LONG,,[Define this if you have GNU getopt_long() implemented])],
+ [AC_MSG_RESULT(no); ac_getopt_long=no],
+ [AC_MSG_RESULT(no); ac_getopt_long=no])
+ AM_CONDITIONAL(HAVE_GETOPT_LONG, test x"$ac_getopt_long" = "xyes")
+])
diff --git a/misc/Makefile.am b/misc/Makefile.am
index cd013b752..783f269f7 100644
--- a/misc/Makefile.am
+++ b/misc/Makefile.am
@@ -13,9 +13,13 @@ EXTRA_DIST = build_rpms.sh \
fonts/cetus.ttf
bin_SCRIPTS = xine-config
+bin_PROGRAMS = xine-list-@XINE_SERIES@
pkgconfig_DATA=libxine.pc
+xine_list_@XINE_SERIES@_SOURCES = xine-list.c
+xine_list_@XINE_SERIES@_LDADD = $(XINE_LIB)
+
fontdir = $(pkgdatadir)/fonts
dist_font_DATA = \
fonts/cetus-16.xinefont.gz \
diff --git a/misc/libxine.pc.in b/misc/libxine.pc.in
index a6565bad0..754acc5ca 100644
--- a/misc/libxine.pc.in
+++ b/misc/libxine.pc.in
@@ -1,5 +1,6 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
+bindir=@bindir@
libdir=@libdir@
includedir=@includedir@
@@ -15,6 +16,8 @@ scriptdir=@XINE_SCRIPTPATH@
localedir=@XINE_LOCALEDIR@
objcflags=@OBJCFLAGS@
+xine_list=${bindir}/xine-list-@XINE_SERIES@
+
Name: libxine
Description: The xine engine library
Version: @XINE_MAJOR@.@XINE_MINOR@.@XINE_SUB@@XINE_PATCH@
diff --git a/misc/xine-config.in b/misc/xine-config.in
index 1492d739b..e1192cf46 100644
--- a/misc/xine-config.in
+++ b/misc/xine-config.in
@@ -23,10 +23,12 @@ Options:
[--libs]
[--acflags]
[--cflags]
+ [--bindir]
[--plugindir]
[--datadir]
[--scriptdir]
[--localedir]
+ [--xine-list]
[--objcflags]
EOF
exit $1
@@ -58,9 +60,12 @@ while test $# -gt 0; do
--cflags|--libs)
args="$args${args+ }$1"
;;
- --prefix|--acflags|--plugindir|--datadir|--scriptdir|--localedir|--objcflags)
+ --prefix|--acflags|--bindir|--plugindir|--datadir|--scriptdir|--localedir|--objcflags)
args="$args${args+ }--variable=${1#--}"
;;
+ --xine-list)
+ args="$args${args+ }--variable=xine_list"
+ ;;
--exec-prefix)
args="$args${args+ }--variable=exec_prefix"
;;
diff --git a/misc/xine-list.c b/misc/xine-list.c
new file mode 100644
index 000000000..ec7b7f694
--- /dev/null
+++ b/misc/xine-list.c
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2008 the xine-project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
+ * USA
+ */
+
+#include <xine.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <getopt.h>
+
+#define XINE_LIST_VERSION_N(x,y) #x"."#y
+#define XINE_LIST_VERSION XINE_LIST_VERSION_N(XINE_MAJOR_VERSION,XINE_MINOR_VERSION)
+
+int main (int argc, char *argv[])
+{
+ int optstate = 0;
+ int which = 'm';
+ int lf = 0;
+
+ for (;;)
+ {
+#define OPTS "hvaemp"
+#ifdef HAVE_GETOPT_LONG
+ static const struct option longopts[] = {
+ { "help", no_argument, NULL, 'h' },
+ { "version", no_argument, NULL, 'v' },
+ { "mime-types", no_argument, NULL, 'm' },
+ { "extensions", no_argument, NULL, 'e' },
+ { "all", no_argument, NULL, 'a' },
+ { NULL }
+ };
+ int index = 0;
+ int opt = getopt_long (argc, argv, OPTS, longopts, &index);
+#else
+ int opt = getopt(argc, argv, OPTS);
+#endif
+ if (opt == -1)
+ break;
+
+ switch (opt)
+ {
+ case 'h':
+ optstate |= 1;
+ break;
+ case 'v':
+ optstate |= 4;
+ break;
+ case 'a':
+ case 'e':
+ case 'm':
+ which = opt;
+ break;
+ case 'p':
+ lf = 1;
+ break;
+ default:
+ optstate |= 2;
+ break;
+ }
+ }
+
+ if (optstate & 1)
+ printf ("\
+xine-list-"XINE_LIST_VERSION" %s\n\
+using xine-lib %s\n\
+usage: %s [options]\n\
+options:\n\
+ -h, --help this help text\n\
+ -m, --mime-types list just the supported MIME types\n\
+ -e, --extensions list just the recognised filename extensions\n\
+ -a, --all list everything\n\
+ -p, --pretty-print add line feeds\n\
+\n", XINE_VERSION, xine_get_version_string (), argv[0]);
+ else if (optstate & 4)
+ printf ("\
+xine-list %s\n\
+using xine-lib %s\n\
+(c) 2008 the xine project team\n\
+This is free software; see the source for copying conditions. There is NO\n\
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n\
+to the extent permitted by law.\n",
+ XINE_VERSION, xine_get_version_string ());
+
+ if (optstate & 2)
+ {
+ fputs ("xine-list: invalid option (try -h or --help)\n", stderr);
+ return 1;
+ }
+
+ if (optstate)
+ return 0;
+
+ xine_t *xine = xine_new ();
+ xine_init (xine);
+
+ char *text = NULL;
+ char *sep, *sep2;
+ switch (which)
+ {
+ case 'a':
+ case 'm':
+ text = xine_get_mime_types (xine);
+ if (!text || !*text)
+ goto read_fail;
+ sep = sep2 = text - 1;
+ for (;;)
+ {
+ text = sep + 1;
+ sep = strchr (text, ';') ? : text + strlen (text);
+ sep2 = which == 'a' ? sep : strchr (text, ':') ? : sep;
+ if (!*sep)
+ break;
+ if (printf ("%.*s;", (int)(sep2 - text), text) < 0 || (lf && puts ("") < 0))
+ goto write_fail;
+ }
+ break;
+
+ case 'e':
+ text = xine_get_file_extensions (xine);
+ if (!text || !*text)
+ goto read_fail;
+ sep = text - 1;
+ do
+ {
+ text = sep + 1;
+ sep = strchr (text, ' ') ? : text + strlen (text);
+ if (sep[-1] != '/' &&
+ printf ("%.*s%s", (int)(sep - text), text, lf ? "\n" : *sep ? " " : "") < 0)
+ goto write_fail;
+ } while (*sep);
+ break;
+ }
+
+ return 0;
+
+ read_fail:
+ fputs ("xine-list: failed to read types info\n", stderr);
+ return 1;
+
+ write_fail:
+ perror ("xine-list");
+ return 1;
+}
diff --git a/po/es.po b/po/es.po
index 0b4c99fbe..00eced5c1 100644
--- a/po/es.po
+++ b/po/es.po
@@ -1,17 +1,18 @@
# translation of xine-lib-1.2.hg.po to Spanish
# Spanish .po file for xine-lib.
+# Copyright (C) YEAR Copyright (C) 2000-2006 the xine project
# Copyright (C) 2002, 2006, 2007, 2008 Free Software Foundation, Inc.
#
# Juan Manuel García Molina <juanma_gm@wanadoo.es>, 2002.
-# Carlos E. Robinson M. <carloser@users.sourceforge.net>, 2006, 2007, 2008.
+# Carlos E. R M. <carloser@users.sourceforge.net>, 2006, 2007, 2008.
# Cer: <<== marcas de revision.
msgid ""
msgstr ""
"Project-Id-Version: xine-lib-1.2.hg\n"
"Report-Msgid-Bugs-To: xine-devel@lists.sourceforge.net\n"
-"POT-Creation-Date: 2008-02-01 01:17+0000\n"
-"PO-Revision-Date: 2008-01-31 14:30+0100\n"
-"Last-Translator: Carlos E. Robinson M. <carloser@users.sourceforge.net>\n"
+"POT-Creation-Date: 2008-04-02 01:33+0100\n"
+"PO-Revision-Date: 2008-04-02 01:24+0200\n"
+"Last-Translator: Carlos E. R M. <carloser@users.sourceforge.net>\n"
"Language-Team: Spanish <none>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -175,11 +176,11 @@ msgstr "snd_pcm_open() falló:%d:%s\n"
msgid ">>> Check if another program already uses PCM <<<\n"
msgstr ">>> Comprobar si otro programa está ya usando PCM <<<\n"
-#: src/audio_out/audio_alsa_out.c:1470 src/audio_out/audio_oss_out.c:926
+#: src/audio_out/audio_alsa_out.c:1470 src/audio_out/audio_oss_out.c:931
msgid "speaker arrangement"
msgstr "disposición de altavoces"
-#: src/audio_out/audio_alsa_out.c:1471 src/audio_out/audio_oss_out.c:927
+#: src/audio_out/audio_alsa_out.c:1471 src/audio_out/audio_oss_out.c:932
msgid ""
"Select how your speakers are arranged, this determines which speakers xine "
"uses for sound output. The individual values are:\n"
@@ -554,7 +555,7 @@ msgstr "audio_esd_out: no puedo conectar al servidor ESD %s: %s\n"
msgid "esd audio output latency (adjust a/v sync)"
msgstr "latencia de salida de audio esd (ajustar sincronismo a/v)"
-#: src/audio_out/audio_esd_out.c:540 src/audio_out/audio_oss_out.c:864
+#: src/audio_out/audio_esd_out.c:540 src/audio_out/audio_oss_out.c:869
msgid ""
"If you experience audio being not in sync with the video, you can enter a "
"fixed offset here to compensate.\n"
@@ -620,11 +621,11 @@ msgstr ""
"audio_oss_out: tasa de audio: %d solicitada, %d proporcionada por el "
"dispositivo\n"
-#: src/audio_out/audio_oss_out.c:743
+#: src/audio_out/audio_oss_out.c:745
msgid "OSS audio device name"
msgstr "nombre del dispositivo de audio OSS"
-#: src/audio_out/audio_oss_out.c:744
+#: src/audio_out/audio_oss_out.c:746
msgid ""
"Specifies the base part of the audio device name, to which the OSS device "
"number is appended to get the full device name.\n"
@@ -635,11 +636,11 @@ msgstr ""
"dispositivo.\n"
"Seleccione \"auto\" si desea que xine auto detecte el parámetro correcto."
-#: src/audio_out/audio_oss_out.c:751
+#: src/audio_out/audio_oss_out.c:753
msgid "OSS audio device number, -1 for none"
msgstr "número de dispositivo audio OSS, -1 para ninguno"
-#: src/audio_out/audio_oss_out.c:752
+#: src/audio_out/audio_oss_out.c:754
msgid ""
"The full audio device name is created by concatenating the OSS device name "
"and the audio device number.\n"
@@ -655,20 +656,20 @@ msgstr ""
"El rango de este valor es -1 o 0-15. Éste parámetro se ignora cuando el "
"nombre del dispositivo audio OSS está puesto a \"auto\"."
-#: src/audio_out/audio_oss_out.c:761
+#: src/audio_out/audio_oss_out.c:763
msgid "audio_oss_out: audio.device.oss_device_name = auto, probing devs\n"
msgstr "audio_oss_out: audio.device.oss_device_name = auto, sondeando devs\n"
-#: src/audio_out/audio_oss_out.c:764
+#: src/audio_out/audio_oss_out.c:766
msgid "audio_oss_out: Auto probe for audio device failed\n"
msgstr "audio_oss_out: Sondeo automático de dispositivo audio falló\n"
-#: src/audio_out/audio_oss_out.c:780
+#: src/audio_out/audio_oss_out.c:782
#, c-format
msgid "audio_oss_out: using device >%s<\n"
msgstr "audio_oss_out: usando dispositivo >%s<\n"
-#: src/audio_out/audio_oss_out.c:786 src/audio_out/audio_oss_out.c:901
+#: src/audio_out/audio_oss_out.c:788 src/audio_out/audio_oss_out.c:906
#, c-format
msgid ""
"audio_oss_out: opening audio device %s failed:\n"
@@ -677,11 +678,11 @@ msgstr ""
"audio_oss_out: falló al abrir el dispositivo de audio %s:\n"
"%s\n"
-#: src/audio_out/audio_oss_out.c:807
+#: src/audio_out/audio_oss_out.c:809
msgid "a/v sync method to use by OSS"
msgstr "método de sincronismo a/v a usar por OSS"
-#: src/audio_out/audio_oss_out.c:808
+#: src/audio_out/audio_oss_out.c:810
msgid ""
"xine can use different methods to keep audio and video synchronized. Which "
"setting works best depends on the OSS driver and sound hardware you are "
@@ -741,7 +742,7 @@ msgstr ""
"soporta ninguno de los ioctls de tiempo real y observa errores de "
"sincronismo después de una reproducción larga"
-#: src/audio_out/audio_oss_out.c:856
+#: src/audio_out/audio_oss_out.c:861
msgid ""
"audio_oss_out: Audio driver realtime sync disabled...\n"
"audio_oss_out: ...will use system real-time clock for soft-sync instead\n"
@@ -753,11 +754,11 @@ msgstr ""
"sync, en su lugar\n"
"audio_oss_out: ...puede haber problemas de sincronización audio/vídeo\n"
-#: src/audio_out/audio_oss_out.c:863
+#: src/audio_out/audio_oss_out.c:868
msgid "OSS audio output latency (adjust a/v sync)"
msgstr "Latencia de salida de audio OSS audio (ajuste sincronismo a/v)"
-#: src/audio_out/audio_oss_out.c:877
+#: src/audio_out/audio_oss_out.c:882
msgid ""
"audio_oss_out: Audio driver realtime sync disabled...\n"
"audio_oss_out: ...probing output buffer size: "
@@ -765,7 +766,7 @@ msgstr ""
"audio_oss_out: Sincronismo tiempo real driver de audio desactivado...\n"
"audio_oss_out: ...ensayando tamaño del búfer de salida: "
-#: src/audio_out/audio_oss_out.c:894
+#: src/audio_out/audio_oss_out.c:899
#, c-format
msgid ""
"%d bytes\n"
@@ -774,11 +775,11 @@ msgstr ""
"%d bytes\n"
"audio_oss_out: ...puede haber problemas de sincronización audio/vídeo\n"
-#: src/audio_out/audio_oss_out.c:1023
+#: src/audio_out/audio_oss_out.c:1028
msgid "OSS audio mixer number, -1 for none"
msgstr "número de mezclador audio OSS, -1 para ninguno"
-#: src/audio_out/audio_oss_out.c:1024
+#: src/audio_out/audio_oss_out.c:1029
msgid ""
"The full mixer device name is created by taking the OSS device name, "
"replacing \"dsp\" with \"mixer\" and adding the mixer number.\n"
@@ -795,30 +796,30 @@ msgstr ""
"El rango de este valor es -1 o 0-15. Este parámetro se ignora cuando el "
"nombre del dispositivo audio OSS está puesto a \"auto\"."
-#: src/audio_out/audio_oss_out.c:1075
+#: src/audio_out/audio_oss_out.c:1080
#, c-format
msgid "audio_oss_out: open() mixer %s failed: %s\n"
msgstr "audio_oss_out: función open() mezclador %s falló: %s\n"
-#: src/audio_out/audio_oss_out.c:1152
+#: src/audio_out/audio_oss_out.c:1157
msgid "xine audio output plugin using oss-compliant audio devices/drivers"
msgstr ""
"complemento de xine de salida de audio usando dispositivos/drivers "
"compatibles OSS"
# Cer: ¿pulseaudio?
-#: src/audio_out/audio_pulse_out.c:548
+#: src/audio_out/audio_pulse_out.c:549
msgid "device used for pulseaudio"
msgstr "dispositivo usado para audio a pulsos"
# Cer: ¿pulseaudio? Estaba como "polypaudio" pero fuzzy.
-#: src/audio_out/audio_pulse_out.c:549
+#: src/audio_out/audio_pulse_out.c:550
msgid "use 'server[:sink]' for setting the pulseaudio sink device."
msgstr ""
"use 'server[:sink]' para definir el sumidero del dispositivo audio a pulsos."
# Cer: ¿pulseaudio?
-#: src/audio_out/audio_pulse_out.c:603
+#: src/audio_out/audio_pulse_out.c:604
msgid "xine audio output plugin using pulseaudio sound server"
msgstr ""
"complemento de xine de salida de audio usando servidor de sonido audio a "
@@ -866,11 +867,11 @@ msgstr ""
"ogg: pista de audio vorbis indicada pero cabecera de flujo de bits vorbis no "
"encontrada.\n"
-#: src/combined/xine_ogg_demuxer.c:2080
+#: src/combined/xine_ogg_demuxer.c:2085
msgid "Annodex demux plugin"
msgstr "Complemento demultiplexor annodex"
-#: src/combined/xine_ogg_demuxer.c:2104
+#: src/combined/xine_ogg_demuxer.c:2109
msgid "OGG demux plugin"
msgstr "Complemento demultiplexor OGG"
@@ -883,7 +884,7 @@ msgstr "demux_asf: aviso: El flujo de bits (stream) id=%d está encriptado.\n"
msgid "Media stream scrambled/encrypted"
msgstr "Flujo de bits del medio revuelto/encriptado"
-#: src/demuxers/demux_asf.c:2105
+#: src/demuxers/demux_asf.c:2102
msgid "ASF demux plugin"
msgstr "Complemento demultiplexor ASF"
@@ -891,7 +892,7 @@ msgstr "Complemento demultiplexor ASF"
msgid "Restoring index..."
msgstr "Restaurando índice..."
-#: src/demuxers/demux_avi.c:628 src/demuxers/demux_avi.c:1683
+#: src/demuxers/demux_avi.c:628 src/demuxers/demux_avi.c:1693
#, c-format
msgid "demux_avi: invalid avi chunk \"%c%c%c%c\" at pos %<PRIdMAX>\n"
msgstr "demux_avi: bloque avi inválido \"%c%c%c%c\" en posición %<PRIdMAX>\n"
@@ -907,7 +908,7 @@ msgid "demux_avi: failed to seek to the next chunk (pos %<PRIdMAX>)\n"
msgstr ""
"demux_avi: falló el posicionamiento al siguiente bloque (pos %<PRIdMAX>)\n"
-#: src/demuxers/demux_avi.c:2309
+#: src/demuxers/demux_avi.c:2326
msgid "AVI/RIFF demux plugin"
msgstr "Complemento demultiplexor AVI/RIFF"
@@ -916,12 +917,12 @@ msgstr "Complemento demultiplexor AVI/RIFF"
msgid "invalid FILM chunk size\n"
msgstr "tamaño de bloque FILM inválido\n"
-#: src/demuxers/demux_film.c:338
+#: src/demuxers/demux_film.c:346
#, c-format
msgid "unrecognized FILM chunk\n"
msgstr "bloque FILM no reconocido\n"
-#: src/demuxers/demux_film.c:896
+#: src/demuxers/demux_film.c:905
msgid "FILM (CPK) demux plugin"
msgstr "Complemento demultiplexor FILM (CPK)"
@@ -934,7 +935,7 @@ msgstr "Versión FLV no soportada (%d).\n"
msgid "neither video nor audio stream in this file.\n"
msgstr "no hay flujo de vídeo ni audio en este fichero.\n"
-#: src/demuxers/demux_flv.c:888
+#: src/demuxers/demux_flv.c:898
msgid "Flash Video file demux plugin"
msgstr "Complemento demultiplexor para fichero Flash Video"
@@ -953,7 +954,7 @@ msgstr "iff-ilbm: compresión desconocida: %d\n"
msgid "iff: unknown Chunk: %s\n"
msgstr "iff: Bloque no reconocido: %s\n"
-#: src/demuxers/demux_iff.c:1217
+#: src/demuxers/demux_iff.c:1225
msgid "IFF demux plugin"
msgstr "Complemento demultiplexor IFF"
@@ -1091,13 +1092,13 @@ msgid "demux_wc3movie: SHOT chunk referenced invalid palette (%d >= %d)\n"
msgstr ""
"demux_wc3movie: bloque SHOT referenció una paleta inválida (%d >= %d)\n"
-#: src/demuxers/demux_wc3movie.c:402
+#: src/demuxers/demux_wc3movie.c:408
#, c-format
msgid "demux_wc3movie: There was a problem while loading palette chunks\n"
msgstr ""
"demux_wc3movie: Hubo un problema mientras se cargaban bloques de paleta\n"
-#: src/demuxers/demux_wc3movie.c:711
+#: src/demuxers/demux_wc3movie.c:718
msgid "Wing Commander III Movie (MVE) demux plugin"
msgstr "Complemento demultiplexor Wing Commander III Movie (MVE)"
@@ -2883,22 +2884,22 @@ msgstr "ffmpeg_audio_dec: no pude abrir el decodificador\n"
msgid "ffmpeg based audio decoder plugin"
msgstr "complemento decodificador de audio basado en ffmpeg"
-#: src/combined/ffmpeg/ff_dvaudio_decoder.c:277
+#: src/combined/ffmpeg/ff_dvaudio_decoder.c:286
#, c-format
msgid "dvaudio: increasing buffer to %d to avoid overflow.\n"
msgstr ""
"dvaudio: incrementando el tamaño de la memoria tampón a %d para evitar el "
"desbordamiento.\n"
-#: src/combined/ffmpeg/ff_dvaudio_decoder.c:388
+#: src/combined/ffmpeg/ff_dvaudio_decoder.c:397
msgid "dv audio decoder plugin"
msgstr "complemento decodificador de audio dv"
-#: src/combined/ffmpeg/ffmpeg_encoder.c:161
+#: src/combined/ffmpeg/ffmpeg_encoder.c:165
msgid "libavcodec mpeg output bitrate (kbit/s)"
msgstr "tasa de bits salida mpeg de libavcodec (kbit/s)"
-#: src/combined/ffmpeg/ffmpeg_encoder.c:162
+#: src/combined/ffmpeg/ffmpeg_encoder.c:166
msgid ""
"The bitrate the libavcodec mpeg encoder should use for DXR3's encoding mode. "
"Higher values will increase quality and CPU usage.\n"
@@ -2910,11 +2911,11 @@ msgstr ""
"Este ajuste sólo se considera cuando el modo de calidad constante está "
"desactivado."
-#: src/combined/ffmpeg/ffmpeg_encoder.c:169
+#: src/combined/ffmpeg/ffmpeg_encoder.c:173
msgid "constant quality mode"
msgstr "modo de calidad constante"
-#: src/combined/ffmpeg/ffmpeg_encoder.c:170
+#: src/combined/ffmpeg/ffmpeg_encoder.c:174
msgid ""
"When enabled, libavcodec will use a constant quality mode by dynamically "
"compressing the images based on their complexity. When disabled, libavcodec "
@@ -2924,64 +2925,64 @@ msgstr ""
"dinámicamente comprimiendo las imágenes basado en su complejidad. Cuando se "
"desactiva, libavcodec usará el modo de tasa de bits constante."
-#: src/combined/ffmpeg/ffmpeg_encoder.c:177
+#: src/combined/ffmpeg/ffmpeg_encoder.c:181
msgid "minimum compression"
msgstr "compresión mínima"
-#: src/combined/ffmpeg/ffmpeg_encoder.c:178
+#: src/combined/ffmpeg/ffmpeg_encoder.c:182
msgid "The minimum compression to apply to an image in constant quality mode."
msgstr ""
"La mínima compresión a aplicar a una imagen en el modo de calidad constante."
-#: src/combined/ffmpeg/ffmpeg_encoder.c:183
+#: src/combined/ffmpeg/ffmpeg_encoder.c:187
msgid "maximum quantizer"
msgstr "cuantificador máximo"
-#: src/combined/ffmpeg/ffmpeg_encoder.c:184
+#: src/combined/ffmpeg/ffmpeg_encoder.c:188
msgid "The maximum compression to apply to an image in constant quality mode."
msgstr ""
"La máxima compresión a aplicar a una imagen en modo de calidad constante."
-#: src/combined/ffmpeg/ff_video_decoder.c:156
+#: src/combined/ffmpeg/ff_video_decoder.c:160
msgid "ffmpeg_video_dec: unsupported frame format, DR1 disabled.\n"
msgstr "ffmpeg_video_dec: formato de cuadro no soportado, DR1 desactivado.\n"
-#: src/combined/ffmpeg/ff_video_decoder.c:174
+#: src/combined/ffmpeg/ff_video_decoder.c:178
msgid "ffmpeg_video_dec: unsupported frame dimensions, DR1 disabled.\n"
msgstr ""
"ffmpeg_video_dec: dimensiones de cuadro no soportadas, DR1 desactivado.\n"
-#: src/combined/ffmpeg/ff_video_decoder.c:357
+#: src/combined/ffmpeg/ff_video_decoder.c:361
#, c-format
msgid "ffmpeg_video_dec: couldn't find ffmpeg decoder for buf type 0x%X\n"
msgstr ""
"ffmpeg_video_dec: no pude encontrar el decodificador ffmpeg para el tipo de "
"tampón 0x%X\n"
-#: src/combined/ffmpeg/ff_video_decoder.c:389
+#: src/combined/ffmpeg/ff_video_decoder.c:393
msgid "ffmpeg_video_dec: couldn't open decoder\n"
msgstr "ffmpeg_video_dec: no pude abrir el decodificador\n"
-#: src/combined/ffmpeg/ff_video_decoder.c:432
+#: src/combined/ffmpeg/ff_video_decoder.c:436
msgid "ffmpeg_video_dec: direct rendering enabled\n"
msgstr "ffmpeg_video_dec: renderizado directo activado\n"
-#: src/combined/ffmpeg/ff_video_decoder.c:872
+#: src/combined/ffmpeg/ff_video_decoder.c:876
#, c-format
msgid "ffmpeg_video_dec: increasing buffer to %d to avoid overflow.\n"
msgstr ""
"ffmpeg_video_dec: incrementando el tamaño de la memoria tampón a %d para "
"evitar el desbordamiento.\n"
-#: src/combined/ffmpeg/ff_video_decoder.c:1574
+#: src/combined/ffmpeg/ff_video_decoder.c:1578
msgid "ffmpeg based video decoder plugin"
msgstr "complemento decodificador de vídeo basado en ffmpeg"
-#: src/combined/ffmpeg/ff_video_decoder.c:1586
+#: src/combined/ffmpeg/ff_video_decoder.c:1590
msgid "MPEG-4 postprocessing quality"
msgstr "calidad de postprocesado MPEG-4"
-#: src/combined/ffmpeg/ff_video_decoder.c:1587
+#: src/combined/ffmpeg/ff_video_decoder.c:1591
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 "
@@ -2995,11 +2996,11 @@ msgstr ""
"bloque. Para contenido de alta calidad, demasiado postprocesado puede de "
"hecho hacer la imagen peor emborronándola demasiado."
-#: src/combined/ffmpeg/ff_video_decoder.c:1595
+#: src/combined/ffmpeg/ff_video_decoder.c:1599
msgid "FFmpeg video decoding thread count"
msgstr "Conteo de hilos decodificando vídeo FFmpeg"
-#: src/combined/ffmpeg/ff_video_decoder.c:1596
+#: src/combined/ffmpeg/ff_video_decoder.c:1600
msgid ""
"You can adjust the number of video decoding threads which FFmpeg may use.\n"
"Higher values should speed up decoding but it depends on the codec used "
@@ -3013,12 +3014,12 @@ msgstr ""
"decodificador por cada CPU lógica (típicamente de 1 a 4). Un cambio hará "
"efecto cuando se reproduzca el siguiente flujo."
-#: src/combined/ffmpeg/ff_video_decoder.c:1605
+#: src/combined/ffmpeg/ff_video_decoder.c:1609
msgid "Skip loop filter"
msgstr "Saltarse filtro de bucle"
# Cer "saltar" por"skip" suena raro.
-#: src/combined/ffmpeg/ff_video_decoder.c:1606
+#: src/combined/ffmpeg/ff_video_decoder.c:1610
msgid ""
"You can control for which frames the loop filter shall be skipped after "
"decoding.\n"
@@ -3035,11 +3036,11 @@ msgstr ""
"manos de la implementación.\n"
"Un cambio de este ajuste tendrá efecto a la reproducción de siguiente flujo."
-#: src/combined/ffmpeg/ff_video_decoder.c:1615
+#: src/combined/ffmpeg/ff_video_decoder.c:1619
msgid "Choose speed over specification compliance"
msgstr "Elegir velocidad en vez de conformidad con la especificación"
-#: src/combined/ffmpeg/ff_video_decoder.c:1616
+#: src/combined/ffmpeg/ff_video_decoder.c:1620
msgid ""
"You may want to allow speed cheats which violate codec specification.\n"
"Cheating may speed up decoding but can also lead to decoding artefacts.\n"
@@ -3376,7 +3377,7 @@ msgstr "complemento binario win32 codec de vídeo"
msgid "win32 binary audio codec plugin"
msgstr "complemento binario win32 codec de audio"
-#: src/audio_dec/xine_a52_decoder.c:757 src/audio_dec/xine_dts_decoder.c:524
+#: src/audio_dec/xine_a52_decoder.c:757 src/audio_dec/xine_dts_decoder.c:532
msgid "HELP! a mono-only audio driver?!\n"
msgstr "¡AYUDA! ¿¡Un manejador de audio exclusivamente mono-aural?!\n"
@@ -3431,7 +3432,7 @@ msgstr ""
"de decodificación envolvente matricial como prologic, debería activar esta "
"opción de modo que los canales adicionales se mezclen en la señal estéreo."
-#: src/audio_dec/xine_dts_decoder.c:559
+#: src/audio_dec/xine_dts_decoder.c:567
msgid "DTS passthru audio format decoder plugin"
msgstr "complemento decodificador de formato audio paso a través DTS"
@@ -4019,7 +4020,7 @@ msgstr ""
msgid "Adds noise"
msgstr "añade ruido"
-#: src/post/planar/pp.c:111
+#: src/post/planar/pp.c:116
msgid ""
"FFmpeg libpostprocess plugin.\n"
"\n"
@@ -4031,7 +4032,7 @@ msgstr ""
"Parámetros\n"
"\n"
-#: src/post/planar/pp.c:116
+#: src/post/planar/pp.c:121
msgid ""
"\n"
"* libpostprocess (C) Michael Niedermayer\n"
@@ -4039,7 +4040,7 @@ msgstr ""
"\n"
"* libpostprocess (C) Michael Niedermayer\n"
-#: src/post/planar/pp.c:155
+#: src/post/planar/pp.c:160
msgid "plugin for ffmpeg libpostprocess"
msgstr "complemento para libpostprocess ffmpeg "
@@ -4102,83 +4103,83 @@ msgstr ""
"Unsharp mask & gaussian blur (máscara de des-nitidez y borrosidad gaussiana)"
# Cer: no lo tengo claro
-#: src/vdr/input_vdr.c:183 src/vdr/input_vdr.c:223 src/vdr/input_vdr.c:1848
-#: src/vdr/input_vdr.c:1946
+#: src/vdr/input_vdr.c:197 src/vdr/input_vdr.c:237 src/vdr/input_vdr.c:1898
+#: src/vdr/input_vdr.c:1996
#, c-format
msgid "%s: input event write: %s.\n"
msgstr "%s: evento de entrada escribe: %s.\n"
-#: src/vdr/input_vdr.c:713 src/vdr/input_vdr.c:1137
+#: src/vdr/input_vdr.c:733 src/vdr/input_vdr.c:1129
#, c-format
msgid "%s: buffer_pool_alloc() failed!\n"
msgstr "%s: ¡buffer_pool_alloc() falló!\n"
-#: src/vdr/input_vdr.c:782
+#: src/vdr/input_vdr.c:802
#, c-format
msgid "%s: flush buffers (vb: %d, ab: %d, vf: %d, af: %d) %s.\n"
msgstr "%s: vaciar tampones (vb: %d, ab: %d, vf: %d, af: %d) %s.\n"
-#: src/vdr/input_vdr.c:1476
+#: src/vdr/input_vdr.c:1515
#, c-format
msgid "%s: shutting down rpc thread (timeout: %d ms) ...\n"
msgstr "%s: cerrando el hilo rpc (temporizado: %d ms) ...\n"
-#: src/vdr/input_vdr.c:1500
+#: src/vdr/input_vdr.c:1539
#, c-format
msgid "%s: cancelling rpc thread in function %d...\n"
msgstr "%s: cancelando el hilo rpc en la función %d...\n"
-#: src/vdr/input_vdr.c:1507
+#: src/vdr/input_vdr.c:1546
#, c-format
msgid "%s: joining rpc thread ...\n"
msgstr "%s: uniendo el hilo rpc ...\n"
-#: src/vdr/input_vdr.c:1509
+#: src/vdr/input_vdr.c:1548
#, c-format
msgid "%s: rpc thread joined.\n"
msgstr "%s: hilo rpc unido.\n"
-#: src/vdr/input_vdr.c:1587 src/vdr/input_vdr.c:1601 src/vdr/input_vdr.c:1619
-#: src/vdr/input_vdr.c:1641 src/vdr/input_vdr.c:1663
+#: src/vdr/input_vdr.c:1631 src/vdr/input_vdr.c:1645 src/vdr/input_vdr.c:1669
+#: src/vdr/input_vdr.c:1691 src/vdr/input_vdr.c:1713
#, c-format
msgid "%s: failed to open '%s' (%s)\n"
msgstr "%s: falló en abrir '%s' (%s)\n"
-#: src/vdr/input_vdr.c:1603
+#: src/vdr/input_vdr.c:1647
msgid "timeout expired during setup phase"
msgstr "expiró el límite de tiempo durante la fase de configuración"
-#: src/vdr/input_vdr.c:1688
+#: src/vdr/input_vdr.c:1738
#, c-format
msgid "%s: failed to create socket for port %d (%s)\n"
msgstr "%s: fallo al crear el socket para el puerto %d (%s)\n"
-#: src/vdr/input_vdr.c:1702
+#: src/vdr/input_vdr.c:1752
#, c-format
msgid "%s: failed to connect to port %d (%s)\n"
msgstr "%s: falló en conectar al puerto %d (%s)\n"
-#: src/vdr/input_vdr.c:1709
+#: src/vdr/input_vdr.c:1759
#, c-format
msgid "%s: socket opening (port %d) successful, fd = %d\n"
msgstr "%s: abriendo socket (puerto %d) con éxito, fd = %d\n"
-#: src/vdr/input_vdr.c:1737
+#: src/vdr/input_vdr.c:1787
#, c-format
msgid "%s: connecting to vdr.\n"
msgstr "%s: conectando a vdr.\n"
-#: src/vdr/input_vdr.c:1742
+#: src/vdr/input_vdr.c:1792
#, c-format
msgid "%s: failed to resolve hostname '%s' (%s)\n"
msgstr "%s: falló al resolver el nombre de equipo '%s' (%s)\n"
-#: src/vdr/input_vdr.c:1765
+#: src/vdr/input_vdr.c:1815
#, c-format
msgid "%s: connecting to all sockets (port %d .. %d) was successful.\n"
msgstr "%s: la conexión a todos los sockets (puerto %d .. %d) tuvo éxito.\n"
-#: src/vdr/input_vdr.c:1805
+#: src/vdr/input_vdr.c:1855
#, c-format
msgid ""
"%s: MRL (%s) invalid! MRL should start with vdr://path/to/fifo/stream or "
@@ -4187,12 +4188,12 @@ msgstr ""
"%s: ¡MRL (%s) inválido! El MRL debiera empezar con vdr://camino/a/flujo/fifo "
"o netvdr://equipo:puerto donde ':puerto' es opcional.\n"
-#: src/vdr/input_vdr.c:1815
+#: src/vdr/input_vdr.c:1865
#, c-format
msgid "%s: can't create new thread (%s)\n"
msgstr "%s: no puedo crear nuevo hilo (%s)\n"
-#: src/vdr/input_vdr.c:2060
+#: src/vdr/input_vdr.c:2189
msgid "VDR display device plugin"
msgstr "complemento de dispositivo de visualización VDR"
@@ -4259,10 +4260,8 @@ msgid "video colour key"
msgstr "llave de color de vídeo"
#: src/video_out/video_out_directfb.c:1365
-#: src/video_out/video_out_vidix.c:1160 src/video_out/video_out_vidix.c:1167
-#: src/video_out/video_out_vidix.c:1174 src/video_out/video_out_xcbxv.c:1279
-#: src/video_out/video_out_xv.c:1332 src/video_out/video_out_xvmc.c:1427
-#: src/video_out/video_out_xxmc.c:2574
+#: src/video_out/video_out_vidix.c:1164 src/video_out/video_out_vidix.c:1171
+#: src/video_out/video_out_vidix.c:1178 src/video_out/xv_common.h:25
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."
@@ -4337,30 +4336,30 @@ msgstr ""
"video_out_directfb: escalado de imagen con desentrelazado es acelerado en "
"hardware.\n"
-#: src/video_out/video_out_directfb.c:1782
+#: src/video_out/video_out_directfb.c:1796
msgid "video layer id (auto: -1)"
msgstr "id. de la capa de vídeo (auto: -1)"
-#: src/video_out/video_out_directfb.c:1783
+#: src/video_out/video_out_directfb.c:1797
msgid "Select the video output layer by its id."
msgstr "Seleccione la capa de salida de vídeo por su id."
-#: src/video_out/video_out_directfb.c:1804
-#: src/video_out/video_out_directfb.c:2001
+#: src/video_out/video_out_directfb.c:1818
+#: src/video_out/video_out_directfb.c:2015
#, c-format
msgid "video_out_directfb: using display layer #%d.\n"
msgstr "video_out_directfb: usando capa de visualización nº %d.\n"
-#: src/video_out/video_out_directfb.c:1901
+#: src/video_out/video_out_directfb.c:1915
msgid "xine video output plugin using DirectFB."
msgstr "complemento de xine de salida de vídeo usando DirectFB."
-#: src/video_out/video_out_directfb.c:1994
+#: src/video_out/video_out_directfb.c:2008
msgid "video_out_directfb: no usable display layer was found!\n"
msgstr ""
"video_out_directfb: ¡no se encontró una capa de visualización usable!\n"
-#: src/video_out/video_out_directfb.c:2106
+#: src/video_out/video_out_directfb.c:2120
msgid "xine video output plugin using DirectFB under XDirectFB."
msgstr "complemento de xine de salida de vídeo usando DirectFB bajo XDirectFB."
@@ -4378,11 +4377,11 @@ msgstr ""
"directo) empaquetado (%d).\n"
" Compruebe 'fbset -i' o pruebe 'fbset -depth 16'.\n"
-#: src/video_out/video_out_fb.c:818 src/video_out/video_out_vidix.c:1232
+#: src/video_out/video_out_fb.c:818 src/video_out/video_out_vidix.c:1236
msgid "framebuffer device name"
msgstr "nombre del dispositivo framebuffer"
-#: src/video_out/video_out_fb.c:819 src/video_out/video_out_vidix.c:1233
+#: src/video_out/video_out_fb.c:819 src/video_out/video_out_vidix.c:1237
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, "
@@ -4527,9 +4526,8 @@ msgstr ""
"Frecuencia mínima de cuadro para rutinas animadas de renderizado.\n"
"Ignorado para rutinas estáticas de renderizado.\n"
-#: src/video_out/video_out_opengl.c:1915 src/video_out/video_out_vidix.c:1024
-#: src/video_out/video_out_xcbxv.c:1311 src/video_out/video_out_xv.c:1364
-#: src/video_out/video_out_xvmc.c:1441 src/video_out/video_out_xxmc.c:2606
+#: src/video_out/video_out_opengl.c:1915 src/video_out/video_out_vidix.c:1028
+#: src/video_out/xv_common.h:46
msgid "enable double buffering"
msgstr "activar doble tamponeado"
@@ -4610,31 +4608,29 @@ msgstr ""
msgid "video_out_pgx64: Error: unable to set window properties\n"
msgstr "video_out_pgx64: Error: incapaz de poner las propiedades de ventana\n"
-#: src/video_out/video_out_pgx64.c:808
+#: src/video_out/video_out_pgx64.c:807
msgid "video_out_pgx64: Warning: low video memory, multi-buffering disabled\n"
msgstr ""
"video_out_pgx64: Aviso: memoria de vídeo baja, multi-tamponeado desactivado\n"
-#: src/video_out/video_out_pgx64.c:840
+#: src/video_out/video_out_pgx64.c:839
msgid "video_out_pgx64: Error: insuffucient video memory\n"
msgstr "video_out_pgx64: Error: memoria de vídeo insuficiente\n"
-#: src/video_out/video_out_pgx64.c:856
+#: src/video_out/video_out_pgx64.c:855
msgid "video_out_pgx64: Warning: low video memory, double-buffering disabled\n"
msgstr ""
"video_out_pgx64: Aviso: memoria de vídeo baja, tamponeado-doble desactivado\n"
-#: src/video_out/video_out_pgx64.c:1386
+#: src/video_out/video_out_pgx64.c:1385
msgid "video_out_pgx64: Error: ioctl failed (FBIOGATTR)\n"
msgstr "video_out_pgx64: Error: falló ioctl (FBIOGATTR)\n"
-#: src/video_out/video_out_pgx64.c:1453 src/video_out/video_out_xcbxv.c:1278
-#: src/video_out/video_out_xv.c:1331 src/video_out/video_out_xvmc.c:1426
-#: src/video_out/video_out_xxmc.c:2573
+#: src/video_out/video_out_pgx64.c:1452 src/video_out/xv_common.h:24
msgid "video overlay colour key"
msgstr "llave de color de superposición de vídeo"
-#: src/video_out/video_out_pgx64.c:1454
+#: src/video_out/video_out_pgx64.c:1453
msgid ""
"The colour key is used to tell the graphics card where it can overlay the "
"video image. Try using different values if you see the video showing through "
@@ -4644,11 +4640,11 @@ msgstr ""
"superponer la imagen de vídeo. Pruebe usando diferentes valores si ve que el "
"vídeo asoma a través de otras ventanas."
-#: src/video_out/video_out_pgx64.c:1461
+#: src/video_out/video_out_pgx64.c:1460
msgid "enable chroma keying"
msgstr "activa llave croma (chroma keying)"
-#: src/video_out/video_out_pgx64.c:1462
+#: src/video_out/video_out_pgx64.c:1461
msgid ""
"Draw OSD graphics on top of the overlay colour key rather than blend them "
"into each frame."
@@ -4656,11 +4652,11 @@ msgstr ""
"Dibuja gráficos VEP (OSD) encima de la llave de color de la superposición de "
"vídeo en vez de mezclarlos en cada cuadro."
-#: src/video_out/video_out_pgx64.c:1465
+#: src/video_out/video_out_pgx64.c:1464
msgid "enable multi-buffering"
msgstr "activa multi-tamponeado"
-#: src/video_out/video_out_pgx64.c:1466
+#: src/video_out/video_out_pgx64.c:1465
msgid ""
"Multi buffering increases performance at the expense of using more graphics "
"memory."
@@ -4668,7 +4664,7 @@ msgstr ""
"Multi-tamponeado incrementa el rendimiento a costa de usar más memoria "
"gráfica."
-#: src/video_out/video_out_pgx64.c:1487
+#: src/video_out/video_out_pgx64.c:1486
msgid "xine video output plugin for Sun XVR100/PGX64/PGX24 framebuffers"
msgstr ""
"complemento de xine de salida de vídeo para tampones-de-cuadro Sun XVR100/"
@@ -4709,33 +4705,31 @@ msgid "xine video output plugin using the Libstk Surface Set-top Toolkit"
msgstr ""
"complemento de vídeo de xine usando el \"Libstk Surface Set-top Toolkit\""
-#: src/video_out/video_out_vidix.c:1002
+#: src/video_out/video_out_vidix.c:1006
msgid "red intensity"
msgstr "intensidad de rojo "
-#: src/video_out/video_out_vidix.c:1002
+#: src/video_out/video_out_vidix.c:1006
msgid "The intensity of the red colour components."
msgstr "La intensidad de los componentes de color rojo."
-#: src/video_out/video_out_vidix.c:1007
+#: src/video_out/video_out_vidix.c:1011
msgid "green intensity"
msgstr "intensidad de verde"
-#: src/video_out/video_out_vidix.c:1007
+#: src/video_out/video_out_vidix.c:1011
msgid "The intensity of the green colour components."
msgstr "La intensidad de los componentes de color verde."
-#: src/video_out/video_out_vidix.c:1012
+#: src/video_out/video_out_vidix.c:1016
msgid "blue intensity"
msgstr "intensidad de azul"
-#: src/video_out/video_out_vidix.c:1012
+#: src/video_out/video_out_vidix.c:1016
msgid "The intensity of the blue colour components."
msgstr "La intensidad de los componentes de color azul."
-#: src/video_out/video_out_vidix.c:1025 src/video_out/video_out_xcbxv.c:1312
-#: src/video_out/video_out_xv.c:1365 src/video_out/video_out_xvmc.c:1442
-#: src/video_out/video_out_xxmc.c:2607
+#: src/video_out/video_out_vidix.c:1029 src/video_out/xv_common.h:47
msgid ""
"Double buffering will synchronize the update of the video image to the "
"repainting of the entire screen (\"vertical retrace\"). This eliminates "
@@ -4746,45 +4740,45 @@ msgstr ""
"vertical). Esto elimina el parpadeo y artifactos de rajado, pero usa más "
"memoria gráfica."
-#: src/video_out/video_out_vidix.c:1072
+#: src/video_out/video_out_vidix.c:1076
msgid "video_out_vidix: adaptor supports the yuy2 format\n"
msgstr "video_out_vidix: el adaptador soporta el formato yuy2\n"
-#: src/video_out/video_out_vidix.c:1083
+#: src/video_out/video_out_vidix.c:1087
msgid "video_out_vidix: adaptor supports the yv12 format\n"
msgstr "video_out_vidix: el adaptador soporta el formato yv12\n"
-#: src/video_out/video_out_vidix.c:1099
+#: src/video_out/video_out_vidix.c:1103
msgid "video_out_vidix: You have wrong version of VIDIX library\n"
msgstr ""
"video_out_vidix: Tiene usted la versión incorrecta de la librería VIDIX\n"
-#: src/video_out/video_out_vidix.c:1107
+#: src/video_out/video_out_vidix.c:1111
msgid "video_out_vidix: Couldn't find working VIDIX driver\n"
msgstr "video_out_vidix: No pude localizar el driver VIDIX que funcione\n"
-#: src/video_out/video_out_vidix.c:1120
+#: src/video_out/video_out_vidix.c:1124
#, c-format
msgid "video_out_vidix: using driver: %s by %s\n"
msgstr "video_out_vidix: usando driver: %s por %s\n"
-#: src/video_out/video_out_vidix.c:1159
+#: src/video_out/video_out_vidix.c:1163
msgid "video overlay colour key red component"
msgstr "clave de componente rojo en superposición de vídeo"
-#: src/video_out/video_out_vidix.c:1166
+#: src/video_out/video_out_vidix.c:1170
msgid "video overlay colour key green component"
msgstr "clave de componente verde en superposición de vídeo"
-#: src/video_out/video_out_vidix.c:1173
+#: src/video_out/video_out_vidix.c:1177
msgid "video overlay colour key blue component"
msgstr "clave de componente azul en superposición de vídeo"
-#: src/video_out/video_out_vidix.c:1207
+#: src/video_out/video_out_vidix.c:1211
msgid "xine video output plugin using libvidix for x11"
msgstr "complemento de salida de vídeo usando libvidix para x11"
-#: src/video_out/video_out_vidix.c:1281
+#: src/video_out/video_out_vidix.c:1285
msgid "xine video output plugin using libvidix for linux frame buffer"
msgstr ""
"complemento de salida de vídeo usando libvidix para frame buffer de linux"
@@ -4795,15 +4789,15 @@ msgid "%s: %s: allocating image\n"
msgstr "%s: %s: ubicando imagen\n"
#: src/video_out/video_out_xcbshm.c:152 src/video_out/video_out_xcbshm.c:162
-#: src/video_out/video_out_xcbshm.c:174 src/video_out/video_out_xcbxv.c:260
-#: src/video_out/video_out_xcbxv.c:270 src/video_out/video_out_xcbxv.c:280
-#: src/video_out/video_out_xcbxv.c:292 src/video_out/video_out_xshm.c:196
+#: src/video_out/video_out_xcbshm.c:174 src/video_out/video_out_xcbxv.c:263
+#: src/video_out/video_out_xcbxv.c:273 src/video_out/video_out_xcbxv.c:283
+#: src/video_out/video_out_xcbxv.c:295 src/video_out/video_out_xshm.c:196
#: src/video_out/video_out_xshm.c:213 src/video_out/video_out_xshm.c:224
-#: src/video_out/video_out_xshm.c:243 src/video_out/video_out_xv.c:288
-#: src/video_out/video_out_xv.c:315 src/video_out/video_out_xv.c:324
-#: src/video_out/video_out_xv.c:360 src/video_out/video_out_xxmc.c:642
-#: src/video_out/video_out_xxmc.c:653 src/video_out/video_out_xxmc.c:662
-#: src/video_out/video_out_xxmc.c:698
+#: src/video_out/video_out_xshm.c:243 src/video_out/video_out_xv.c:291
+#: src/video_out/video_out_xv.c:318 src/video_out/video_out_xv.c:327
+#: src/video_out/video_out_xv.c:363 src/video_out/video_out_xxmc.c:643
+#: src/video_out/video_out_xxmc.c:654 src/video_out/video_out_xxmc.c:663
+#: src/video_out/video_out_xxmc.c:699
#, c-format
msgid "%s: => not using MIT Shared Memory extension.\n"
msgstr ""
@@ -4816,14 +4810,14 @@ msgid "%s: shared memory error (address error) when allocating image \n"
msgstr ""
"%s: error de memoria compartida (error de dirección) ) al ubicar imagen\n"
-#: src/video_out/video_out_xcbshm.c:172 src/video_out/video_out_xcbxv.c:290
-#: src/video_out/video_out_xshm.c:241 src/video_out/video_out_xv.c:358
-#: src/video_out/video_out_xxmc.c:696
+#: src/video_out/video_out_xcbshm.c:172 src/video_out/video_out_xcbxv.c:293
+#: src/video_out/video_out_xshm.c:241 src/video_out/video_out_xv.c:361
+#: src/video_out/video_out_xxmc.c:697
#, c-format
msgid "%s: x11 error during shared memory XImage creation\n"
msgstr "%s: x11 error durante creación de XImage en memoria compartida\n"
-#: src/video_out/video_out_xcbshm.c:1104 src/video_out/video_out_xshm.c:1161
+#: src/video_out/video_out_xcbshm.c:1102 src/video_out/video_out_xshm.c:1159
#, c-format
msgid ""
"\n"
@@ -4838,49 +4832,55 @@ msgstr ""
"rendimiento se recomienda una profundidad de 16 bpp!\n"
"\n"
-#: src/video_out/video_out_xcbshm.c:1117 src/video_out/video_out_xshm.c:1174
+#: src/video_out/video_out_xcbshm.c:1115 src/video_out/video_out_xshm.c:1172
#, c-format
msgid "%s: MIT shared memory extension not present on display.\n"
msgstr ""
"%s: la extensión de memoria compartida del MIT (MIT Shared Memory) no está "
"presente en la pantalla.\n"
-#: src/video_out/video_out_xcbshm.c:1216 src/video_out/video_out_xshm.c:1258
+#: src/video_out/video_out_xcbshm.c:1214 src/video_out/video_out_xshm.c:1256
#, c-format
msgid "%s: your video mode was not recognized, sorry :-(\n"
msgstr "%s: lo sentimos, su modo de vídeo no fue reconocido :-(\n"
-#: src/video_out/video_out_xcbshm.c:1245 src/video_out/video_out_xshm.c:1306
+#: src/video_out/video_out_xcbshm.c:1243 src/video_out/video_out_xshm.c:1304
msgid "xine video output plugin using the MIT X shared memory extension"
msgstr ""
"complemento de salida de vídeo de xine usando la extensión de memoria "
"compartida del MIT (MIT Shared Memory) "
-#: src/video_out/video_out_xcbxv.c:258 src/video_out/video_out_xv.c:313
-#: src/video_out/video_out_xxmc.c:651
+#: src/video_out/video_out_xcbxv.c:261 src/video_out/video_out_xv.c:316
+#: src/video_out/video_out_xxmc.c:652
#, c-format
msgid "%s: XvShmCreateImage returned a zero size\n"
msgstr "%s: XvShmCreateImage retornó un tamaño cero\n"
-#: src/video_out/video_out_xcbxv.c:268 src/video_out/video_out_xv.c:322
-#: src/video_out/video_out_xxmc.c:660
+#: src/video_out/video_out_xcbxv.c:271 src/video_out/video_out_xv.c:325
+#: src/video_out/video_out_xxmc.c:661
#, c-format
msgid "%s: shared memory error in shmget: %s\n"
msgstr "%s: error de memoria compartida en shmget: %s\n"
-#: src/video_out/video_out_xcbxv.c:278
+#: src/video_out/video_out_xcbxv.c:281
#, c-format
msgid "%s: shared memory error (address error)\n"
msgstr "%s: error de memoria compartida (error de dirección)\n"
-#: src/video_out/video_out_xcbxv.c:1132 src/video_out/video_out_xv.c:1179
-#: src/video_out/video_out_xxmc.c:2424
+#: src/video_out/video_out_xcbxv.c:1211 src/video_out/video_out_xv.c:1244
+#: src/video_out/video_out_xxmc.c:2472
#, c-format
msgid "%s: Xv extension not present.\n"
msgstr "%s: la extensión Xv no está presente.\n"
-#: src/video_out/video_out_xcbxv.c:1174 src/video_out/video_out_xv.c:1216
-#: src/video_out/video_out_xxmc.c:2461
+#: src/video_out/video_out_xcbxv.c:1238 src/video_out/video_out_xv.c:1269
+#: src/video_out/video_out_xxmc.c:2497
+#, c-format
+msgid "%s: could not open Xv port %d - autodetecting\n"
+msgstr "%s: no se pudo abrir el puerto Xv %d - autodetectando\n"
+
+#: src/video_out/video_out_xcbxv.c:1251 src/video_out/video_out_xv.c:1282
+#: src/video_out/video_out_xxmc.c:2510
#, c-format
msgid ""
"%s: Xv extension is present but I couldn't find a usable yuv12 port.\n"
@@ -4890,7 +4890,7 @@ msgstr ""
"usable.\n"
" ¡¿Parece que su driver de hardware gráfico no soporta Xv?!\n"
-#: src/video_out/video_out_xcbxv.c:1183
+#: src/video_out/video_out_xcbxv.c:1260
#, c-format
msgid ""
"%s: using Xv port %d from adaptor %s for hardware colour space conversion "
@@ -4899,74 +4899,34 @@ msgstr ""
"%s: usando puerto Xv %d del adaptador %s para conversión y escalado de "
"espacio de color en hardware .\n"
-#: src/video_out/video_out_xcbxv.c:1287 src/video_out/video_out_xv.c:1340
-#: src/video_out/video_out_xvmc.c:1435 src/video_out/video_out_xxmc.c:2582
-msgid "autopaint colour key"
-msgstr "llave de color autopintado"
-
-#: src/video_out/video_out_xcbxv.c:1288 src/video_out/video_out_xv.c:1341
-#: src/video_out/video_out_xvmc.c:1436 src/video_out/video_out_xxmc.c:2583
-msgid "Make Xv autopaint its colour key."
-msgstr "Hacer Xv autopintar su llave de color."
-
-#: src/video_out/video_out_xcbxv.c:1295 src/video_out/video_out_xv.c:1348
-#: src/video_out/video_out_xxmc.c:2590
-msgid "bilinear scaling mode"
-msgstr "modo de escalado bilineal"
+#: src/video_out/video_out_xcbxv.c:1383 src/video_out/video_out_xv.c:1425
+msgid "enable vblank sync"
+msgstr "activar sincronismo de blanqueo vertical (vblank sync)"
-#: src/video_out/video_out_xcbxv.c:1296 src/video_out/video_out_xv.c:1349
-#: src/video_out/video_out_xxmc.c:2591
+#: src/video_out/video_out_xcbxv.c:1384 src/video_out/video_out_xv.c:1426
msgid ""
-"Selects the bilinear scaling mode for Permedia cards. The individual values "
-"are:\n"
-"\n"
-"Permedia 2\n"
-"0 - disable bilinear filtering\n"
-"1 - enable bilinear filtering\n"
-"\n"
-"Permedia 3\n"
-"0 - disable bilinear filtering\n"
-"1 - horizontal linear filtering\n"
-"2 - enable full bilinear filtering"
+"This option will synchronize the update of the video image to the repainting "
+"of the entire screen (\"vertical retrace\"). This eliminates flickering and "
+"tearing artifacts. On nvidia cards one may also need to run \"nvidia-settings"
+"\" and choose which display device to sync to under the XVideo Settings tab"
msgstr ""
-"Selecciona el modo de escalado bilineal para las tarjetas Permedia. Los "
-"valores individuales son:\n"
-"\n"
-"Permedia 2\n"
-"0 - desactivar filtrado bilineal\n"
-"1 - activar filtrado bilineal\n"
-"\n"
-"Permedia 3\n"
-"0 - desactivar filtrado bilineal\n"
-"1 - filtrado horizontal lineal\n"
-"2 - sactivar filtrado bilineal completo"
-
-#: src/video_out/video_out_xcbxv.c:1348 src/video_out/video_out_xv.c:1398
-#: src/video_out/video_out_xxmc.c:2647
-#, c-format
-msgid "%s: this adaptor supports the yv12 format.\n"
-msgstr "%s: éste adaptador soporta el formato yv12.\n"
+"Esta opción sincronizará la actualización de la imagen de vídeo al "
+"redibujado de la pantalla de video entera (\"vertical retrace\", retrazado "
+"vertical). Esto elimina el parpadeo y artefactos de rajado. En las tarjetas "
+"nvidia puede también necesitar que ejecute \"nvidia-settings"
+"\" (configuración de nvidia) y escoger que dispositivo de pantalla debe "
+"sincronizar bajo la pestaña de configuración de XVideo"
-#: src/video_out/video_out_xcbxv.c:1353 src/video_out/video_out_xv.c:1403
-#: src/video_out/video_out_xxmc.c:2652
+#: src/video_out/video_out_xcbxv.c:1423 src/video_out/video_out_xcbxv.c:1429
+#: src/video_out/video_out_xv.c:1462 src/video_out/video_out_xv.c:1468
+#: src/video_out/video_out_xvmc.c:1470 src/video_out/video_out_xvmc.c:1476
+#: src/video_out/video_out_xxmc.c:2682 src/video_out/video_out_xxmc.c:2688
#, c-format
-msgid "%s: this adaptor supports the yuy2 format.\n"
-msgstr "%s: éste adaptador soporta el formato yuy2.\n"
+msgid "%s: this adaptor supports the %s format.\n"
+msgstr "%s: éste adaptador soporta el formato %s.\n"
-#: src/video_out/video_out_xcbxv.c:1361 src/video_out/video_out_xv.c:1425
-#: src/video_out/video_out_xxmc.c:2675
-msgid "pitch alignment workaround"
-msgstr "rodeo para alineamiento de paso"
-
-#: src/video_out/video_out_xcbxv.c:1362 src/video_out/video_out_xv.c:1426
-#: src/video_out/video_out_xxmc.c:2676
-msgid "Some buggy video drivers need a workaround to function properly."
-msgstr ""
-"Algunos drivers de vídeo con errores necesitan un rodeo para que funcionen "
-"adecuadamente."
-
-#: src/video_out/video_out_xcbxv.c:1389 src/video_out/video_out_xv.c:1472
-#: src/video_out/video_out_xxmc.c:2769
+#: src/video_out/video_out_xcbxv.c:1467 src/video_out/video_out_xv.c:1539
+#: src/video_out/video_out_xxmc.c:2807
msgid "xine video output plugin using the MIT X video extension"
msgstr "complemento de salida de vídeo usando la extensión MIT X vídeo"
@@ -4975,7 +4935,7 @@ msgstr "complemento de salida de vídeo usando la extensión MIT X vídeo"
msgid "%s: shared memory error when allocating image\n"
msgstr "%s: error de memoria compartida al ubicar imagen\n"
-#: src/video_out/video_out_xv.c:286 src/video_out/video_out_xxmc.c:640
+#: src/video_out/video_out_xv.c:289 src/video_out/video_out_xxmc.c:641
#, c-format
msgid "%s: XvShmCreateImage failed\n"
msgstr ""
@@ -4983,7 +4943,7 @@ msgstr ""
"video_out_xv: => no usando la extensión de memoria compartida MIT (MIT "
"Shared Memory).\n"
-#: src/video_out/video_out_xv.c:1226 src/video_out/video_out_xxmc.c:2471
+#: src/video_out/video_out_xv.c:1292 src/video_out/video_out_xxmc.c:2520
#, c-format
msgid ""
"%s: using Xv port %ld from adaptor %s for hardware colour space conversion "
@@ -4992,11 +4952,11 @@ msgstr ""
"%s: usando puerto Xv %ld del adaptador %s para conversión y escalado de "
"espacio de color en hardware .\n"
-#: src/video_out/video_out_xvmc.c:1552
+#: src/video_out/video_out_xvmc.c:1548
msgid "video_out_xvmc: XvMC extension not present.\n"
msgstr "video_out_xvmc: extensión XvMC no presente.\n"
-#: src/video_out/video_out_xvmc.c:1650
+#: src/video_out/video_out_xvmc.c:1646
msgid ""
"video_out_xvmc: Xv extension is present but I couldn't find a usable yuv12 "
"port.\n"
@@ -5004,7 +4964,7 @@ msgstr ""
"video_out_xvmc: la extensión Xv está presente pero no pude encontrar un "
"puerto yuv12 usable.\n"
-#: src/video_out/video_out_xvmc.c:1659
+#: src/video_out/video_out_xvmc.c:1655
#, c-format
msgid ""
"video_out_xvmc: using Xv port %ld from adaptor %s\n"
@@ -5013,32 +4973,32 @@ msgstr ""
"video_out_xvmc: usando puerto %ld de Xv del adaptador %s\n"
" para conversión del espacio de color y escalado en hardware\n"
-#: src/video_out/video_out_xvmc.c:1664
+#: src/video_out/video_out_xvmc.c:1660
msgid " idct and motion compensation acceleration \n"
msgstr " compensación de movimiento y aceleración idct \n"
-#: src/video_out/video_out_xvmc.c:1666
+#: src/video_out/video_out_xvmc.c:1662
msgid " motion compensation acceleration only\n"
msgstr " sólo compensación de aceleración \n"
-#: src/video_out/video_out_xvmc.c:1668
+#: src/video_out/video_out_xvmc.c:1664
msgid " no XvMC support \n"
msgstr " sin soporte XvMC \n"
-#: src/video_out/video_out_xvmc.c:1669
+#: src/video_out/video_out_xvmc.c:1665
#, c-format
msgid " With Overlay = %d; UnsignedIntra = %d.\n"
msgstr " Con Overlay = %d; UnsignedIntra = %d.\n"
-#: src/video_out/video_out_xvmc.c:1682
+#: src/video_out/video_out_xvmc.c:1678
msgid "xine video output plugin using the XvMC X video extension"
msgstr "complemento de vídeo de xine usando extensión de vídeo X XvMC"
-#: src/video_out/video_out_xxmc.c:2681
+#: src/video_out/video_out_xxmc.c:2719
msgid "Make XvMC allocate more frames for better buffering."
msgstr "Hacer que XvMC ubique más cuadros more cuadros para mejor tamponeado."
-#: src/video_out/video_out_xxmc.c:2682
+#: src/video_out/video_out_xxmc.c:2720
msgid ""
"Some XvMC implementations allow more than 8 frames.\n"
"This option, when turned on, makes the driver try to\n"
@@ -5048,11 +5008,11 @@ msgstr ""
"Esta opción, cuando se activa, hace que el manejador trate de\n"
"ubicar 15 cuadros. hay que tenerlo para VDR uni cromático y en vivo.\n"
-#: src/video_out/video_out_xxmc.c:2688
+#: src/video_out/video_out_xxmc.c:2726
msgid "Unichrome cpu save"
msgstr "Ahorro de cpu unichrome"
-#: src/video_out/video_out_xxmc.c:2689
+#: src/video_out/video_out_xxmc.c:2727
msgid ""
"Saves CPU time by sleeping while decoder works.\n"
"Only for Linux kernel 2.6 series or 2.4 with multimedia patch.\n"
@@ -5062,11 +5022,11 @@ msgstr ""
"Sólo para Linux con kernel serie 2.6 series o 2.4 con parche multimedia.\n"
"Experimental.\n"
-#: src/video_out/video_out_xxmc.c:2695
+#: src/video_out/video_out_xxmc.c:2733
msgid "Fix buggy NVIDIA XvMC subpicture colours"
msgstr "Arreglar colores de subimagen en NVIDIA XvMC con errores"
-#: src/video_out/video_out_xxmc.c:2696
+#: src/video_out/video_out_xxmc.c:2734
msgid ""
"There's a bug in NVIDIA's XvMC lib that makes red OSD colours\n"
"look blue and vice versa. This option provides a workaround.\n"
@@ -5075,11 +5035,11 @@ msgstr ""
"rojo en el DEP aparezca como azul y viceversa.\n"
"Esta opción proporciona un arreglo.\n"
-#: src/video_out/video_out_xxmc.c:2701
+#: src/video_out/video_out_xxmc.c:2739
msgid "Use bob as accelerated deinterlace method."
msgstr "Use «bob» como método acelerado de desentrelazado."
-#: src/video_out/video_out_xxmc.c:2702
+#: src/video_out/video_out_xxmc.c:2740
msgid ""
"When interlacing is enabled for hardware accelerated frames,\n"
"alternate between top and bottom field at double the frame rate.\n"
@@ -5088,11 +5048,11 @@ msgstr ""
"en hardware, alterna entre el campo superior e inferior\n"
"al doble de la frecuencia de cuadro.\n"
-#: src/video_out/video_out_xxmc.c:2708
+#: src/video_out/video_out_xxmc.c:2746
msgid "Don't use bob deinterlacing for progressive frames."
msgstr "No usar desentrelazado «bob» para cuadros progresivos."
-#: src/video_out/video_out_xxmc.c:2709
+#: src/video_out/video_out_xxmc.c:2747
msgid ""
"Progressive frames don't need deinterlacing, so disabling it on\n"
"demand should result in a better picture.\n"
@@ -5100,12 +5060,12 @@ msgstr ""
"Los cuadros progresivos no necesitan desentrelazado, de manera\n"
"que desentrelazarlos bajo demanda no resultará en una mejor imagen.\n"
-#: src/video_out/video_out_xxmc.c:2715
+#: src/video_out/video_out_xxmc.c:2753
msgid "Don't use bob deinterlacing while a scaled OSD is active."
msgstr ""
"No usar desentrelazado «bob» mientras una escalado de VEP (OSD) está activo."
-#: src/video_out/video_out_xxmc.c:2716
+#: src/video_out/video_out_xxmc.c:2754
msgid ""
"Bob deinterlacing adds some noise to horizontal lines, so disabling it\n"
"on demand should result in a better OSD picture.\n"
@@ -5137,6 +5097,76 @@ msgstr ""
msgid "x11osd: unscaled overlay created (%s mode).\n"
msgstr "x11osd: superposición no escalada creada (modo %s).\n"
+#: src/video_out/xv_common.h:30
+msgid "autopaint colour key"
+msgstr "llave de color autopintado"
+
+#: src/video_out/xv_common.h:31
+msgid "Make Xv autopaint its colour key."
+msgstr "Hacer Xv autopintar su llave de color."
+
+#: src/video_out/xv_common.h:34
+msgid "bilinear scaling mode"
+msgstr "modo de escalado bilineal"
+
+#: src/video_out/xv_common.h:35
+msgid ""
+"Selects the bilinear scaling mode for Permedia cards. The individual values "
+"are:\n"
+"\n"
+"Permedia 2\n"
+"0 - disable bilinear filtering\n"
+"1 - enable bilinear filtering\n"
+"\n"
+"Permedia 3\n"
+"0 - disable bilinear filtering\n"
+"1 - horizontal linear filtering\n"
+"2 - enable full bilinear filtering"
+msgstr ""
+"Selecciona el modo de escalado bilineal para las tarjetas Permedia. Los "
+"valores individuales son:\n"
+"\n"
+"Permedia 2\n"
+"0 - desactivar filtrado bilineal\n"
+"1 - activar filtrado bilineal\n"
+"\n"
+"Permedia 3\n"
+"0 - desactivar filtrado bilineal\n"
+"1 - filtrado horizontal lineal\n"
+"2 - sactivar filtrado bilineal completo"
+
+#: src/video_out/xv_common.h:53
+msgid "Xv port number"
+msgstr "puerto Xv número"
+
+#: src/video_out/xv_common.h:54
+msgid "Selects the Xv port number to use (0 to autodetect)."
+msgstr "Selecciona el número de puerto Xv a usar (0 para autodetectar)."
+
+#: src/video_out/xv_common.h:57
+msgid "pitch alignment workaround"
+msgstr "rodeo para alineamiento de paso"
+
+#: src/video_out/xv_common.h:58
+msgid "Some buggy video drivers need a workaround to function properly."
+msgstr ""
+"Algunos drivers de vídeo con errores necesitan un rodeo para que funcionen "
+"adecuadamente."
+
+#: src/video_out/xv_common.h:66
+msgid "video display method preference"
+msgstr "preferencia de método de visualización de vídeo (display)"
+
+#: src/video_out/xv_common.h:67
+msgid ""
+"Selects which video output method is preferred. Detection is done using the "
+"reported Xv adaptor names.\n"
+"(Only applies when auto-detecting which Xv port to use.)"
+msgstr ""
+"Selecciona que método de salida de vídeo se prefiere. La detección se hace "
+"usando los nombres reportados del adaptador Xv.\n"
+"(Sólo aplica al detectar qué puerto Xv a usar.)"
+
#: src/xine-engine/alphablend.c:2146
msgid "disable exact alpha blending of overlays"
msgstr "desactivar la mezcla alfa exacta de superposiciones"
@@ -5597,12 +5627,12 @@ msgstr ""
"load_plugins: tipo de complemento estáticamente ligado desconocido %d\n"
# CER: ¿stat?
-#: src/xine-engine/load_plugins.c:594
+#: src/xine-engine/load_plugins.c:593
#, c-format
msgid "load_plugins: unable to stat %s\n"
msgstr "load_plugins: incapaz de obtener estado %s\n"
-#: src/xine-engine/load_plugins.c:636
+#: src/xine-engine/load_plugins.c:635
#, c-format
msgid ""
"load_plugins: cannot open plugin lib %s:\n"
@@ -5611,7 +5641,7 @@ msgstr ""
"load_plugins: no puedo abrir librería de complemento %s:\n"
"%s\n"
-#: src/xine-engine/load_plugins.c:651
+#: src/xine-engine/load_plugins.c:650
#, c-format
msgid ""
"load_plugins: can't get plugin info from %s:\n"
@@ -5620,12 +5650,12 @@ msgstr ""
"load_plugins: no puedo conseguir información del complemento de %s:\n"
"%s\n"
-#: src/xine-engine/load_plugins.c:669
+#: src/xine-engine/load_plugins.c:668
#, c-format
msgid "load_plugins: skipping unreadable plugin directory %s.\n"
msgstr "load_plugins: omitiendo directorio de complementos ilegible %s.\n"
-#: src/xine-engine/load_plugins.c:737
+#: src/xine-engine/load_plugins.c:736
#, c-format
msgid ""
"load_plugins: cannot (stage 2) open plugin lib %s:\n"
@@ -5634,32 +5664,32 @@ msgstr ""
"load_plugins: no puedo (etapa 2) abrir librería de complementos %s:\n"
"%s\n"
-#: src/xine-engine/load_plugins.c:771
+#: src/xine-engine/load_plugins.c:770
#, c-format
msgid "load_plugins: Yikes! %s doesn't contain plugin info.\n"
msgstr "load_plugins: ¡Ondiá! %s no contiene información del complemento.\n"
-#: src/xine-engine/load_plugins.c:1175 src/xine-engine/load_plugins.c:1184
+#: src/xine-engine/load_plugins.c:1174 src/xine-engine/load_plugins.c:1183
#, c-format
msgid "Unable to create %s directory: %s\n"
msgstr "Incapaz de crear el directorio %s: %s\n"
-#: src/xine-engine/load_plugins.c:1421
+#: src/xine-engine/load_plugins.c:1428
#, c-format
msgid "load_plugins: unknown content detection strategy %d\n"
msgstr "load_plugins: estrategia %d de detección de contenido desconocida\n"
-#: src/xine-engine/load_plugins.c:1546
+#: src/xine-engine/load_plugins.c:1553
#, c-format
msgid "load_plugins: using demuxer '%s'\n"
msgstr "load_plugins: usando desmultiplexor '%s'\n"
-#: src/xine-engine/load_plugins.c:1841 src/xine-engine/load_plugins.c:1888
+#: src/xine-engine/load_plugins.c:1850 src/xine-engine/load_plugins.c:1897
#, c-format
msgid "load_plugins: failed to load audio output plugin <%s>\n"
msgstr "load_plugins: fallé al cargar complemento de salida de audio <%s>\n"
-#: src/xine-engine/load_plugins.c:1891
+#: src/xine-engine/load_plugins.c:1900
msgid ""
"load_plugins: audio output auto-probing didn't find any usable audio "
"driver.\n"
@@ -5667,7 +5697,7 @@ msgstr ""
"load_plugins: el auto-probado de salida de audio no encontró ningún driver "
"de audio usable audio.\n"
-#: src/xine-engine/load_plugins.c:2194
+#: src/xine-engine/load_plugins.c:2204
#, c-format
msgid ""
"load_plugins: cannot unload plugin lib %s:\n"
@@ -5919,139 +5949,139 @@ msgstr ""
"imagen no está acelerado en hardware, esto puede reducir drásticamente el "
"uso de cpu."
-#: src/xine-engine/xine.c:845 src/xine-engine/xine.c:953
-#: src/xine-engine/xine.c:993 src/xine-engine/xine.c:1029
-#: src/xine-engine/xine.c:1041 src/xine-engine/xine.c:1054
-#: src/xine-engine/xine.c:1067 src/xine-engine/xine.c:1080
-#: src/xine-engine/xine.c:1106 src/xine-engine/xine.c:1131
-#: src/xine-engine/xine.c:1168
+#: src/xine-engine/xine.c:848 src/xine-engine/xine.c:970
+#: src/xine-engine/xine.c:1010 src/xine-engine/xine.c:1046
+#: src/xine-engine/xine.c:1058 src/xine-engine/xine.c:1071
+#: src/xine-engine/xine.c:1084 src/xine-engine/xine.c:1097
+#: src/xine-engine/xine.c:1123 src/xine-engine/xine.c:1148
+#: src/xine-engine/xine.c:1185
msgid "xine: error while parsing mrl\n"
msgstr "xine: error mientras se interpretaba mrl\n"
-#: src/xine-engine/xine.c:887
+#: src/xine-engine/xine.c:907
#, c-format
msgid "xine: found input plugin : %s\n"
msgstr "xine: encontrado complemento de entrada : %s\n"
-#: src/xine-engine/xine.c:905
+#: src/xine-engine/xine.c:924
#, c-format
msgid "xine: input plugin cannot open MRL [%s]\n"
msgstr "xine: el complemento de entrada no puede abrir el MRL [%s]\n"
-#: src/xine-engine/xine.c:916
+#: src/xine-engine/xine.c:933
#, c-format
msgid "xine: cannot find input plugin for MRL [%s]\n"
msgstr "xine: no se puede encontrar el complemento de entrada para MRL [%s]\n"
-#: src/xine-engine/xine.c:942
+#: src/xine-engine/xine.c:959
#, c-format
msgid "xine: specified demuxer %s failed to start\n"
msgstr "xine: fallo al iniciar el demultiplexor %s especificado\n"
# cer: ¿join rip?
-#: src/xine-engine/xine.c:979
+#: src/xine-engine/xine.c:996
#, c-format
msgid "xine: join rip input plugin\n"
msgstr "xine: complemento de entrada join rip \n"
-#: src/xine-engine/xine.c:986
+#: src/xine-engine/xine.c:1003
msgid "xine: error opening rip input plugin instance\n"
msgstr "xine: error al abrir instancia de complemento de entrada rip\n"
-#: src/xine-engine/xine.c:1017
+#: src/xine-engine/xine.c:1034
#, c-format
msgid "xine: last_probed demuxer %s failed to start\n"
msgstr ""
"xine: el último demultiplexor probado (last_probed) %s no consiguió "
"iniciarse \n"
-#: src/xine-engine/xine.c:1046
+#: src/xine-engine/xine.c:1063
msgid "ignoring video\n"
msgstr "ignorando vídeo\n"
-#: src/xine-engine/xine.c:1059
+#: src/xine-engine/xine.c:1076
msgid "ignoring audio\n"
msgstr "ignorando audio\n"
-#: src/xine-engine/xine.c:1072
+#: src/xine-engine/xine.c:1089
msgid "ignoring subpicture\n"
msgstr "ignorando subimagen\n"
-#: src/xine-engine/xine.c:1085
+#: src/xine-engine/xine.c:1102
msgid "input cache plugin disabled\n"
msgstr "caché del complemento de entrada desactivado\n"
-#: src/xine-engine/xine.c:1158
+#: src/xine-engine/xine.c:1175
#, c-format
msgid "subtitle mrl opened '%s'\n"
msgstr "abierto mrl de subtítulos '%s'\n"
-#: src/xine-engine/xine.c:1162
+#: src/xine-engine/xine.c:1179
msgid "xine: error opening subtitle mrl\n"
msgstr "xine: error abriendo mrl de subtítulos\n"
-#: src/xine-engine/xine.c:1194
+#: src/xine-engine/xine.c:1211
#, c-format
msgid "xine: error while parsing MRL\n"
msgstr "xine: error al interpretar MRL\n"
-#: src/xine-engine/xine.c:1201
+#: src/xine-engine/xine.c:1218
#, c-format
msgid "xine: changing option '%s' from MRL isn't permitted\n"
msgstr "xine: cambiar la ocpión '%s' del MRL no está permitido\n"
-#: src/xine-engine/xine.c:1221
+#: src/xine-engine/xine.c:1238
#, c-format
msgid "xine: couldn't find demux for >%s<\n"
msgstr "xine: no se pudo encontrar un demultiplexor para >%s<\n"
-#: src/xine-engine/xine.c:1237
+#: src/xine-engine/xine.c:1254
#, c-format
msgid "xine: found demuxer plugin: %s\n"
msgstr "xine: encontrado complemento demultiplexor: %s\n"
-#: src/xine-engine/xine.c:1259
+#: src/xine-engine/xine.c:1276
#, c-format
msgid "xine: demuxer is already done. that was fast!\n"
msgstr "xine: el demultiplexor ya ha terminado, ¡eso fué rápido\n"
-#: src/xine-engine/xine.c:1261
+#: src/xine-engine/xine.c:1278
#, c-format
msgid "xine: demuxer failed to start\n"
msgstr "xine: fallo al iniciar el demultiplexor\n"
-#: src/xine-engine/xine.c:1327
+#: src/xine-engine/xine.c:1344
#, c-format
msgid "xine_play: no demux available\n"
msgstr "xine_play: no hay disponible un demultiplexor\n"
-#: src/xine-engine/xine.c:1397
+#: src/xine-engine/xine.c:1415
#, c-format
msgid "xine_play: demux failed to start\n"
msgstr "xine_play: fallo al iniciar el demultiplexor\n"
-#: src/xine-engine/xine.c:1674
+#: src/xine-engine/xine.c:1693
#, c-format
msgid "xine: The specified save_dir \"%s\" might be a security risk.\n"
msgstr ""
"xine: El directorio (save_dir) especificado \"%s\" pudiera ser un riesgo "
"para la seguridad.\n"
-#: src/xine-engine/xine.c:1679
+#: src/xine-engine/xine.c:1698
msgid "The specified save_dir might be a security risk."
msgstr ""
"El directorio (save_dir) especificado pudiera ser un riesgo para la "
"seguridad."
-#: src/xine-engine/xine.c:1707
+#: src/xine-engine/xine.c:1732
msgid "xine: locale not supported by C library\n"
msgstr "xine: \"locale\" no soportada por la librería de C\n"
-#: src/xine-engine/xine.c:1716
+#: src/xine-engine/xine.c:1741
msgid "media format detection strategy"
msgstr "estrategia de detecciónde formato"
-#: src/xine-engine/xine.c:1717
+#: src/xine-engine/xine.c:1742
msgid ""
"xine offers various methods to detect the media format of input to play. The "
"individual values are:\n"
@@ -6085,11 +6115,11 @@ msgstr ""
"extension\n"
"Detectar sólo por la extensión del nombre del fichero.\n"
-#: src/xine-engine/xine.c:1735
+#: src/xine-engine/xine.c:1760
msgid "directory for saving streams"
msgstr "directorio para guardar flujos de bits"
-#: src/xine-engine/xine.c:1736
+#: src/xine-engine/xine.c:1761
msgid ""
"When using the stream save feature, files will be written only into this "
"directory.\n"
@@ -6105,11 +6135,11 @@ msgstr ""
"arbitrario. Así que debiera ser cuidadoso que el directorio especificado sea "
"robusto contra cualquier contenido en cualquier fichero."
-#: src/xine-engine/xine.c:1747
+#: src/xine-engine/xine.c:1772
msgid "allow implicit changes to the configuration (e.g. by MRL)"
msgstr "permitir cambios implícitos a la configuración (p.e. por MRL)"
-#: src/xine-engine/xine.c:1748
+#: src/xine-engine/xine.c:1773
msgid ""
"If enabled, you allow xine to change your configuration without explicit "
"actions from your side. For example configuration changes demanded by MRLs "
@@ -6126,11 +6156,11 @@ msgstr ""
"arbitrariamente cambiar su configuración, usted podría acabar con un xine "
"totalmente enredado."
-#: src/xine-engine/xine.c:1762
+#: src/xine-engine/xine.c:1787
msgid "Timeout for network stream reading (in seconds)"
msgstr "Temporización para lectura de flujos de bits desde red (en segundos)"
-#: src/xine-engine/xine.c:1763
+#: src/xine-engine/xine.c:1788
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 "
@@ -6141,15 +6171,15 @@ msgstr ""
"fuente es lenta o el ancho de banda está ocupado; valores demasiado altos "
"congelarán el reproductor si se pierde la conexión."
-#: src/xine-engine/xine.c:2115
+#: src/xine-engine/xine.c:2196
msgid "messages"
msgstr "mensajes"
-#: src/xine-engine/xine.c:2116
+#: src/xine-engine/xine.c:2197
msgid "plugin"
msgstr "complemento"
-#: src/xine-engine/xine.c:2117
+#: src/xine-engine/xine.c:2198
msgid "trace"
msgstr "traza"
diff --git a/po/libxine2.pot b/po/libxine2.pot
index abf0bda62..41771bd13 100644
--- a/po/libxine2.pot
+++ b/po/libxine2.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: 2008-01-26 23:28+0000\n"
+"POT-Creation-Date: 2008-04-02 01:33+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -147,11 +147,11 @@ msgstr ""
msgid ">>> Check if another program already uses PCM <<<\n"
msgstr ""
-#: src/audio_out/audio_alsa_out.c:1470 src/audio_out/audio_oss_out.c:926
+#: src/audio_out/audio_alsa_out.c:1470 src/audio_out/audio_oss_out.c:931
msgid "speaker arrangement"
msgstr ""
-#: src/audio_out/audio_alsa_out.c:1471 src/audio_out/audio_oss_out.c:927
+#: src/audio_out/audio_alsa_out.c:1471 src/audio_out/audio_oss_out.c:932
msgid ""
"Select how your speakers are arranged, this determines which speakers xine "
"uses for sound output. The individual values are:\n"
@@ -489,7 +489,7 @@ msgstr ""
msgid "esd audio output latency (adjust a/v sync)"
msgstr ""
-#: src/audio_out/audio_esd_out.c:540 src/audio_out/audio_oss_out.c:864
+#: src/audio_out/audio_esd_out.c:540 src/audio_out/audio_oss_out.c:869
msgid ""
"If you experience audio being not in sync with the video, you can enter a "
"fixed offset here to compensate.\n"
@@ -544,22 +544,22 @@ msgstr ""
msgid "audio_oss_out: audio rate : %d requested, %d provided by device\n"
msgstr ""
-#: src/audio_out/audio_oss_out.c:743
+#: src/audio_out/audio_oss_out.c:745
msgid "OSS audio device name"
msgstr ""
-#: src/audio_out/audio_oss_out.c:744
+#: src/audio_out/audio_oss_out.c:746
msgid ""
"Specifies the base part of the audio device name, to which the OSS device "
"number is appended to get the full device name.\n"
"Select \"auto\" if you want xine to auto detect the corret setting."
msgstr ""
-#: src/audio_out/audio_oss_out.c:751
+#: src/audio_out/audio_oss_out.c:753
msgid "OSS audio device number, -1 for none"
msgstr ""
-#: src/audio_out/audio_oss_out.c:752
+#: src/audio_out/audio_oss_out.c:754
msgid ""
"The full audio device name is created by concatenating the OSS device name "
"and the audio device number.\n"
@@ -569,31 +569,31 @@ msgid ""
"audio device name is set to \"auto\"."
msgstr ""
-#: src/audio_out/audio_oss_out.c:761
+#: src/audio_out/audio_oss_out.c:763
msgid "audio_oss_out: audio.device.oss_device_name = auto, probing devs\n"
msgstr ""
-#: src/audio_out/audio_oss_out.c:764
+#: src/audio_out/audio_oss_out.c:766
msgid "audio_oss_out: Auto probe for audio device failed\n"
msgstr ""
-#: src/audio_out/audio_oss_out.c:780
+#: src/audio_out/audio_oss_out.c:782
#, c-format
msgid "audio_oss_out: using device >%s<\n"
msgstr ""
-#: src/audio_out/audio_oss_out.c:786 src/audio_out/audio_oss_out.c:901
+#: src/audio_out/audio_oss_out.c:788 src/audio_out/audio_oss_out.c:906
#, c-format
msgid ""
"audio_oss_out: opening audio device %s failed:\n"
"%s\n"
msgstr ""
-#: src/audio_out/audio_oss_out.c:807
+#: src/audio_out/audio_oss_out.c:809
msgid "a/v sync method to use by OSS"
msgstr ""
-#: src/audio_out/audio_oss_out.c:808
+#: src/audio_out/audio_oss_out.c:810
msgid ""
"xine can use different methods to keep audio and video synchronized. Which "
"setting works best depends on the OSS driver and sound hardware you are "
@@ -623,35 +623,35 @@ msgid ""
"ioctls and you experience sync errors after long playback"
msgstr ""
-#: src/audio_out/audio_oss_out.c:856
+#: src/audio_out/audio_oss_out.c:861
msgid ""
"audio_oss_out: Audio driver realtime sync disabled...\n"
"audio_oss_out: ...will use system real-time clock for soft-sync instead\n"
"audio_oss_out: ...there may be audio/video synchronization issues\n"
msgstr ""
-#: src/audio_out/audio_oss_out.c:863
+#: src/audio_out/audio_oss_out.c:868
msgid "OSS audio output latency (adjust a/v sync)"
msgstr ""
-#: src/audio_out/audio_oss_out.c:877
+#: src/audio_out/audio_oss_out.c:882
msgid ""
"audio_oss_out: Audio driver realtime sync disabled...\n"
"audio_oss_out: ...probing output buffer size: "
msgstr ""
-#: src/audio_out/audio_oss_out.c:894
+#: src/audio_out/audio_oss_out.c:899
#, c-format
msgid ""
"%d bytes\n"
"audio_oss_out: ...there may be audio/video synchronization issues\n"
msgstr ""
-#: src/audio_out/audio_oss_out.c:1023
+#: src/audio_out/audio_oss_out.c:1028
msgid "OSS audio mixer number, -1 for none"
msgstr ""
-#: src/audio_out/audio_oss_out.c:1024
+#: src/audio_out/audio_oss_out.c:1029
msgid ""
"The full mixer device name is created by taking the OSS device name, "
"replacing \"dsp\" with \"mixer\" and adding the mixer number.\n"
@@ -661,24 +661,24 @@ msgid ""
"audio device name is set to \"auto\"."
msgstr ""
-#: src/audio_out/audio_oss_out.c:1075
+#: src/audio_out/audio_oss_out.c:1080
#, c-format
msgid "audio_oss_out: open() mixer %s failed: %s\n"
msgstr ""
-#: src/audio_out/audio_oss_out.c:1152
+#: src/audio_out/audio_oss_out.c:1157
msgid "xine audio output plugin using oss-compliant audio devices/drivers"
msgstr ""
-#: src/audio_out/audio_pulse_out.c:548
+#: src/audio_out/audio_pulse_out.c:549
msgid "device used for pulseaudio"
msgstr ""
-#: src/audio_out/audio_pulse_out.c:549
+#: src/audio_out/audio_pulse_out.c:550
msgid "use 'server[:sink]' for setting the pulseaudio sink device."
msgstr ""
-#: src/audio_out/audio_pulse_out.c:603
+#: src/audio_out/audio_pulse_out.c:604
msgid "xine audio output plugin using pulseaudio sound server"
msgstr ""
@@ -713,24 +713,24 @@ msgstr ""
msgid "ogg: vorbis audio track indicated but no vorbis stream header found.\n"
msgstr ""
-#: src/combined/xine_ogg_demuxer.c:2080
+#: src/combined/xine_ogg_demuxer.c:2085
msgid "Annodex demux plugin"
msgstr ""
-#: src/combined/xine_ogg_demuxer.c:2098
+#: src/combined/xine_ogg_demuxer.c:2109
msgid "OGG demux plugin"
msgstr ""
-#: src/demuxers/demux_asf.c:426
+#: src/demuxers/demux_asf.c:441
#, c-format
msgid "demux_asf: warning: The stream id=%d is encrypted.\n"
msgstr ""
-#: src/demuxers/demux_asf.c:428
+#: src/demuxers/demux_asf.c:443
msgid "Media stream scrambled/encrypted"
msgstr ""
-#: src/demuxers/demux_asf.c:2091
+#: src/demuxers/demux_asf.c:2102
msgid "ASF demux plugin"
msgstr ""
@@ -738,7 +738,7 @@ msgstr ""
msgid "Restoring index..."
msgstr ""
-#: src/demuxers/demux_avi.c:628 src/demuxers/demux_avi.c:1683
+#: src/demuxers/demux_avi.c:628 src/demuxers/demux_avi.c:1693
#, c-format
msgid "demux_avi: invalid avi chunk \"%c%c%c%c\" at pos %<PRIdMAX>\n"
msgstr ""
@@ -753,7 +753,7 @@ msgstr ""
msgid "demux_avi: failed to seek to the next chunk (pos %<PRIdMAX>)\n"
msgstr ""
-#: src/demuxers/demux_avi.c:2309
+#: src/demuxers/demux_avi.c:2326
msgid "AVI/RIFF demux plugin"
msgstr ""
@@ -762,12 +762,12 @@ msgstr ""
msgid "invalid FILM chunk size\n"
msgstr ""
-#: src/demuxers/demux_film.c:338
+#: src/demuxers/demux_film.c:346
#, c-format
msgid "unrecognized FILM chunk\n"
msgstr ""
-#: src/demuxers/demux_film.c:896
+#: src/demuxers/demux_film.c:905
msgid "FILM (CPK) demux plugin"
msgstr ""
@@ -780,7 +780,7 @@ msgstr ""
msgid "neither video nor audio stream in this file.\n"
msgstr ""
-#: src/demuxers/demux_flv.c:879
+#: src/demuxers/demux_flv.c:898
msgid "Flash Video file demux plugin"
msgstr ""
@@ -799,7 +799,7 @@ msgstr ""
msgid "iff: unknown Chunk: %s\n"
msgstr ""
-#: src/demuxers/demux_iff.c:1217
+#: src/demuxers/demux_iff.c:1225
msgid "IFF demux plugin"
msgstr ""
@@ -916,12 +916,12 @@ msgstr ""
msgid "demux_wc3movie: SHOT chunk referenced invalid palette (%d >= %d)\n"
msgstr ""
-#: src/demuxers/demux_wc3movie.c:402
+#: src/demuxers/demux_wc3movie.c:408
#, c-format
msgid "demux_wc3movie: There was a problem while loading palette chunks\n"
msgstr ""
-#: src/demuxers/demux_wc3movie.c:711
+#: src/demuxers/demux_wc3movie.c:718
msgid "Wing Commander III Movie (MVE) demux plugin"
msgstr ""
@@ -1295,7 +1295,7 @@ msgstr ""
msgid "video_out_dxr3: ERROR Reading overlay init file. Run autocal!\n"
msgstr ""
-#: src/input/input_cdda.c:1586
+#: src/input/input_cdda.c:1584
#, c-format
msgid "%s: can't connect to %s:%d\n"
msgstr ""
@@ -1310,25 +1310,25 @@ msgstr ""
msgid "input_cdda: failed to connect to cddb server '%s:%d' (%s).\n"
msgstr ""
-#: src/input/input_cdda.c:2687
+#: src/input/input_cdda.c:2685
msgid "CD Digital Audio (aka. CDDA)"
msgstr ""
-#: src/input/input_cdda.c:2700
+#: src/input/input_cdda.c:2698
msgid "device used for CD audio"
msgstr ""
-#: src/input/input_cdda.c:2701
+#: src/input/input_cdda.c:2699
msgid ""
"The path to the device, usually a CD or DVD drive, which you intend to use "
"for playing audio CDs."
msgstr ""
-#: src/input/input_cdda.c:2707
+#: src/input/input_cdda.c:2705
msgid "query CDDB"
msgstr ""
-#: src/input/input_cdda.c:2707
+#: src/input/input_cdda.c:2705
msgid ""
"Enables CDDB queries, which will give you convenient title and track names "
"for your audio CDs.\n"
@@ -1337,11 +1337,11 @@ msgid ""
"listening habits."
msgstr ""
-#: src/input/input_cdda.c:2715
+#: src/input/input_cdda.c:2713
msgid "CDDB server name"
msgstr ""
-#: src/input/input_cdda.c:2715
+#: src/input/input_cdda.c:2713
msgid ""
"The CDDB server used to retrieve the title and track information from.\n"
"This setting is security critical, because the sever will receive "
@@ -1349,19 +1349,19 @@ msgid ""
"malicious replies. Be sure to enter a server you can trust."
msgstr ""
-#: src/input/input_cdda.c:2723
+#: src/input/input_cdda.c:2721
msgid "CDDB server port"
msgstr ""
-#: src/input/input_cdda.c:2723
+#: src/input/input_cdda.c:2721
msgid "The server port used to retrieve the title and track information from."
msgstr ""
-#: src/input/input_cdda.c:2729
+#: src/input/input_cdda.c:2727
msgid "slow down disc drive to this speed factor"
msgstr ""
-#: src/input/input_cdda.c:2730
+#: src/input/input_cdda.c:2728
msgid ""
"Since some CD or DVD drives make some really loud noises because of the fast "
"disc rotation, xine will try to slow them down. With standard CD or DVD "
@@ -1380,142 +1380,142 @@ msgstr ""
msgid "input_dvb: dvb channel file '%s' is not a plain file\n"
msgstr ""
-#: src/input/input_dvb.c:2127 src/input/input_dvb.c:2967
+#: src/input/input_dvb.c:2127 src/input/input_dvb.c:2964
msgid "input_dvb: tuner_set_channel failed\n"
msgstr ""
-#: src/input/input_dvb.c:2762
+#: src/input/input_dvb.c:2759
#, c-format
msgid "input_dvb: DVB GUI %s\n"
msgstr ""
-#: src/input/input_dvb.c:2767 src/input/input_dvb.c:3183
+#: src/input/input_dvb.c:2764 src/input/input_dvb.c:3180
msgid "input_dvb: cannot open dvb device\n"
msgstr ""
-#: src/input/input_dvb.c:2791
+#: src/input/input_dvb.c:2788
#, c-format
msgid "input_dvb: channel %d out of range, defaulting to 0\n"
msgstr ""
-#: src/input/input_dvb.c:2802
+#: src/input/input_dvb.c:2799
#, c-format
msgid "input_dvb: searching for channel %s\n"
msgstr ""
-#: src/input/input_dvb.c:2825
+#: src/input/input_dvb.c:2822
#, c-format
msgid "input_dvb: exact match for %s not found: trying partial matches\n"
msgstr ""
-#: src/input/input_dvb.c:2832
+#: src/input/input_dvb.c:2829
#, c-format
msgid "input_dvb: found matching channel %s\n"
msgstr ""
-#: src/input/input_dvb.c:2845
+#: src/input/input_dvb.c:2842
#, c-format
msgid "input_dvb: channel %s not found in channels.conf, defaulting.\n"
msgstr ""
-#: src/input/input_dvb.c:2851
+#: src/input/input_dvb.c:2848
msgid ""
"input_dvb: invalid channel specification, defaulting to last viewed "
"channel.\n"
msgstr ""
-#: src/input/input_dvb.c:2857
+#: src/input/input_dvb.c:2854
msgid "input_dvb: invalid channel specification, defaulting to channel 0\n"
msgstr ""
-#: src/input/input_dvb.c:2869
+#: src/input/input_dvb.c:2866
msgid ""
"input_dvb: dvbs mrl specified but the tuner doesn't appear to be QPSK (DVB-"
"S)\n"
msgstr ""
-#: src/input/input_dvb.c:2889
+#: src/input/input_dvb.c:2886
msgid ""
"input_dvb: dvbt mrl specified but the tuner doesn't appear to be OFDM (DVB-"
"T)\n"
msgstr ""
-#: src/input/input_dvb.c:2912
+#: src/input/input_dvb.c:2909
msgid ""
"input_dvb: dvbc mrl specified but the tuner doesn't appear to be QAM (DVB-"
"C)\n"
msgstr ""
-#: src/input/input_dvb.c:2938
+#: src/input/input_dvb.c:2935
msgid ""
"input_dvb: dvba mrl specified but the tuner doesn't appear to be ATSC (DVB-"
"A)\n"
msgstr ""
-#: src/input/input_dvb.c:2973
+#: src/input/input_dvb.c:2970
#, c-format
msgid "input_dvb: cannot open dvr device '%s'\n"
msgstr ""
-#: src/input/input_dvb.c:2996
+#: src/input/input_dvb.c:2993
msgid "input_dvb: cannot create EPG updater thread\n"
msgstr ""
-#: src/input/input_dvb.c:3058
+#: src/input/input_dvb.c:3055
msgid "use DVB 'center cutout' (zoom)"
msgstr ""
-#: src/input/input_dvb.c:3059
+#: src/input/input_dvb.c:3056
msgid ""
"This will allow fullscreen playback of 4:3 content transmitted in a 16:9 "
"frame."
msgstr ""
-#: src/input/input_dvb.c:3252
+#: src/input/input_dvb.c:3249
msgid "DVB (Digital TV) input plugin"
msgstr ""
-#: src/input/input_dvb.c:3270
+#: src/input/input_dvb.c:3267
msgid "Remember last DVB channel watched"
msgstr ""
-#: src/input/input_dvb.c:3271
+#: src/input/input_dvb.c:3268
msgid ""
"On autoplay, xine will remember and switch to the channel indicated in media."
"dvb.last_channel. "
msgstr ""
-#: src/input/input_dvb.c:3278
+#: src/input/input_dvb.c:3275
msgid "Last DVB channel viewed"
msgstr ""
-#: src/input/input_dvb.c:3279
+#: src/input/input_dvb.c:3276
msgid "If enabled xine will remember and switch to this channel. "
msgstr ""
-#: src/input/input_dvb.c:3284
+#: src/input/input_dvb.c:3281
msgid "Number of seconds until tuning times out."
msgstr ""
-#: src/input/input_dvb.c:3285
+#: src/input/input_dvb.c:3282
msgid ""
"Leave at 0 means try forever. Greater than 0 means wait that many seconds to "
"get a lock. Minimum is 5 seconds."
msgstr ""
-#: src/input/input_dvb.c:3292
+#: src/input/input_dvb.c:3289
msgid "Enable the DVB GUI"
msgstr ""
-#: src/input/input_dvb.c:3293
+#: src/input/input_dvb.c:3290
msgid "Enable the DVB GUI, mouse controlled recording and channel switching."
msgstr ""
-#: src/input/input_dvb.c:3298
+#: src/input/input_dvb.c:3295
msgid "Number of dvb card to use."
msgstr ""
-#: src/input/input_dvb.c:3299
+#: src/input/input_dvb.c:3296
msgid ""
"Leave this at zero unless you really have more than 1 card in your system."
msgstr ""
@@ -1842,11 +1842,11 @@ msgstr ""
msgid "input_net: unable to connect to '%s'.\n"
msgstr ""
-#: src/input/input_net.c:517
+#: src/input/input_net.c:523
msgid "net input plugin as shipped with xine"
msgstr ""
-#: src/input/input_pnm.c:272
+#: src/input/input_pnm.c:270
msgid "pnm streaming input plugin"
msgstr ""
@@ -1865,28 +1865,28 @@ msgstr ""
msgid "input_pvr: read error (%s)\n"
msgstr ""
-#: src/input/input_pvr.c:1142 src/input/input_pvr.c:1395
+#: src/input/input_pvr.c:1165 src/input/input_pvr.c:1418
#, c-format
msgid "input_pvr: error opening device %s\n"
msgstr ""
-#: src/input/input_pvr.c:1148 src/input/input_pvr.c:1401
+#: src/input/input_pvr.c:1171 src/input/input_pvr.c:1424
msgid "input_pvr: IVTV_IOC_G_CODEC failed, maybe API changed?\n"
msgstr ""
-#: src/input/input_pvr.c:1156 src/input/input_pvr.c:1410
+#: src/input/input_pvr.c:1179 src/input/input_pvr.c:1433
msgid "input_pvr: IVTV_IOC_S_CODEC failed, maybe API changed?\n"
msgstr ""
-#: src/input/input_pvr.c:1528
+#: src/input/input_pvr.c:1551
msgid "device used for WinTV-PVR 250/350 (pvr plugin)"
msgstr ""
-#: src/input/input_pvr.c:1529
+#: src/input/input_pvr.c:1552
msgid "The path to the device of your WinTV card."
msgstr ""
-#: src/input/input_pvr.c:1535
+#: src/input/input_pvr.c:1558
msgid "WinTV-PVR 250/350 input plugin"
msgstr ""
@@ -1961,7 +1961,7 @@ msgstr ""
msgid "RTP and UDP input plugin as shipped with xine"
msgstr ""
-#: src/input/input_rtsp.c:292
+#: src/input/input_rtsp.c:290
msgid "rtsp streaming input plugin"
msgstr ""
@@ -1983,39 +1983,39 @@ msgstr ""
msgid "stdin streaming input plugin"
msgstr ""
-#: src/input/input_v4l.c:402
+#: src/input/input_v4l.c:405
msgid "Buffer underrun..."
msgstr ""
-#: src/input/input_v4l.c:406
+#: src/input/input_v4l.c:409
msgid "Buffer overrun..."
msgstr ""
-#: src/input/input_v4l.c:409
+#: src/input/input_v4l.c:412
msgid "Adjusting..."
msgstr ""
-#: src/input/input_v4l.c:683
+#: src/input/input_v4l.c:686
msgid "Tuner name not found\n"
msgstr ""
-#: src/input/input_v4l.c:1914
+#: src/input/input_v4l.c:1921
msgid "v4l tv input plugin"
msgstr ""
-#: src/input/input_v4l.c:1922
+#: src/input/input_v4l.c:1929
msgid "v4l video device"
msgstr ""
-#: src/input/input_v4l.c:1923
+#: src/input/input_v4l.c:1930
msgid "The path to your Video4Linux video device."
msgstr ""
-#: src/input/input_v4l.c:1927
+#: src/input/input_v4l.c:1934
msgid "v4l TV standard"
msgstr ""
-#: src/input/input_v4l.c:1928
+#: src/input/input_v4l.c:1935
msgid ""
"Selects the TV standard of the input signals. Either: PAL, NTSC and SECAM. "
msgstr ""
@@ -2030,15 +2030,15 @@ msgid ""
"device."
msgstr ""
-#: src/input/input_v4l.c:1946
+#: src/input/input_v4l.c:1961
msgid "v4l radio input plugin"
msgstr ""
-#: src/input/input_v4l.c:1954
+#: src/input/input_v4l.c:1969
msgid "v4l radio device"
msgstr ""
-#: src/input/input_v4l.c:1955
+#: src/input/input_v4l.c:1970
msgid "The path to your Video4Linux radio device."
msgstr ""
@@ -2075,12 +2075,12 @@ msgid ""
"VideoCDs with."
msgstr ""
-#: src/input/librtsp/rtsp.c:435
+#: src/input/librtsp/rtsp.c:437
#, c-format
msgid "rtsp: bad mrl: %s\n"
msgstr ""
-#: src/input/librtsp/rtsp.c:493
+#: src/input/librtsp/rtsp.c:495
#, c-format
msgid "rtsp: failed to connect to '%s'\n"
msgstr ""
@@ -2100,7 +2100,7 @@ msgid ""
"established.\n"
msgstr ""
-#: src/input/librtsp/rtsp_session.c:159
+#: src/input/librtsp/rtsp_session.c:164
#, c-format
msgid "rtsp_session: rtsp server type '%s' not supported yet. sorry.\n"
msgstr ""
@@ -2383,88 +2383,88 @@ msgstr ""
msgid "ffmpeg based audio decoder plugin"
msgstr ""
-#: src/combined/ffmpeg/ff_dvaudio_decoder.c:277
+#: src/combined/ffmpeg/ff_dvaudio_decoder.c:286
#, c-format
msgid "dvaudio: increasing buffer to %d to avoid overflow.\n"
msgstr ""
-#: src/combined/ffmpeg/ff_dvaudio_decoder.c:388
+#: src/combined/ffmpeg/ff_dvaudio_decoder.c:397
msgid "dv audio decoder plugin"
msgstr ""
-#: src/combined/ffmpeg/ffmpeg_encoder.c:161
+#: src/combined/ffmpeg/ffmpeg_encoder.c:165
msgid "libavcodec mpeg output bitrate (kbit/s)"
msgstr ""
-#: src/combined/ffmpeg/ffmpeg_encoder.c:162
+#: src/combined/ffmpeg/ffmpeg_encoder.c:166
msgid ""
"The bitrate the libavcodec mpeg encoder should use for DXR3's encoding mode. "
"Higher values will increase quality and CPU usage.\n"
"This setting is only considered, when constant quality mode is disabled."
msgstr ""
-#: src/combined/ffmpeg/ffmpeg_encoder.c:169
+#: src/combined/ffmpeg/ffmpeg_encoder.c:173
msgid "constant quality mode"
msgstr ""
-#: src/combined/ffmpeg/ffmpeg_encoder.c:170
+#: src/combined/ffmpeg/ffmpeg_encoder.c:174
msgid ""
"When enabled, libavcodec will use a constant quality mode by dynamically "
"compressing the images based on their complexity. When disabled, libavcodec "
"will use constant bitrate mode."
msgstr ""
-#: src/combined/ffmpeg/ffmpeg_encoder.c:177
+#: src/combined/ffmpeg/ffmpeg_encoder.c:181
msgid "minimum compression"
msgstr ""
-#: src/combined/ffmpeg/ffmpeg_encoder.c:178
+#: src/combined/ffmpeg/ffmpeg_encoder.c:182
msgid "The minimum compression to apply to an image in constant quality mode."
msgstr ""
-#: src/combined/ffmpeg/ffmpeg_encoder.c:183
+#: src/combined/ffmpeg/ffmpeg_encoder.c:187
msgid "maximum quantizer"
msgstr ""
-#: src/combined/ffmpeg/ffmpeg_encoder.c:184
+#: src/combined/ffmpeg/ffmpeg_encoder.c:188
msgid "The maximum compression to apply to an image in constant quality mode."
msgstr ""
-#: src/combined/ffmpeg/ff_video_decoder.c:154
+#: src/combined/ffmpeg/ff_video_decoder.c:160
msgid "ffmpeg_video_dec: unsupported frame format, DR1 disabled.\n"
msgstr ""
-#: src/combined/ffmpeg/ff_video_decoder.c:172
+#: src/combined/ffmpeg/ff_video_decoder.c:178
msgid "ffmpeg_video_dec: unsupported frame dimensions, DR1 disabled.\n"
msgstr ""
-#: src/combined/ffmpeg/ff_video_decoder.c:336
+#: src/combined/ffmpeg/ff_video_decoder.c:361
#, c-format
msgid "ffmpeg_video_dec: couldn't find ffmpeg decoder for buf type 0x%X\n"
msgstr ""
-#: src/combined/ffmpeg/ff_video_decoder.c:365
+#: src/combined/ffmpeg/ff_video_decoder.c:393
msgid "ffmpeg_video_dec: couldn't open decoder\n"
msgstr ""
-#: src/combined/ffmpeg/ff_video_decoder.c:406
+#: src/combined/ffmpeg/ff_video_decoder.c:436
msgid "ffmpeg_video_dec: direct rendering enabled\n"
msgstr ""
-#: src/combined/ffmpeg/ff_video_decoder.c:834
+#: src/combined/ffmpeg/ff_video_decoder.c:876
#, c-format
msgid "ffmpeg_video_dec: increasing buffer to %d to avoid overflow.\n"
msgstr ""
-#: src/combined/ffmpeg/ff_video_decoder.c:1536
+#: src/combined/ffmpeg/ff_video_decoder.c:1578
msgid "ffmpeg based video decoder plugin"
msgstr ""
-#: src/combined/ffmpeg/ff_video_decoder.c:1548
+#: src/combined/ffmpeg/ff_video_decoder.c:1590
msgid "MPEG-4 postprocessing quality"
msgstr ""
-#: src/combined/ffmpeg/ff_video_decoder.c:1549
+#: src/combined/ffmpeg/ff_video_decoder.c:1591
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 "
@@ -2473,11 +2473,11 @@ msgid ""
"much."
msgstr ""
-#: src/combined/ffmpeg/ff_video_decoder.c:1557
+#: src/combined/ffmpeg/ff_video_decoder.c:1599
msgid "FFmpeg video decoding thread count"
msgstr ""
-#: src/combined/ffmpeg/ff_video_decoder.c:1558
+#: src/combined/ffmpeg/ff_video_decoder.c:1600
msgid ""
"You can adjust the number of video decoding threads which FFmpeg may use.\n"
"Higher values should speed up decoding but it depends on the codec used "
@@ -2486,11 +2486,11 @@ msgid ""
"A change of this setting will take effect with playing the next stream."
msgstr ""
-#: src/combined/ffmpeg/ff_video_decoder.c:1605
+#: src/combined/ffmpeg/ff_video_decoder.c:1609
msgid "Skip loop filter"
msgstr ""
-#: src/combined/ffmpeg/ff_video_decoder.c:1606
+#: src/combined/ffmpeg/ff_video_decoder.c:1610
msgid ""
"You can control for which frames the loop filter shall be skipped after "
"decoding.\n"
@@ -2500,11 +2500,11 @@ msgid ""
"A change of this setting will take effect with playing the next stream."
msgstr ""
-#: src/combined/ffmpeg/ff_video_decoder.c:1615
+#: src/combined/ffmpeg/ff_video_decoder.c:1619
msgid "Choose speed over specification compliance"
msgstr ""
-#: src/combined/ffmpeg/ff_video_decoder.c:1616
+#: src/combined/ffmpeg/ff_video_decoder.c:1620
msgid ""
"You may want to allow speed cheats which violate codec specification.\n"
"Cheating may speed up decoding but can also lead to decoding artefacts.\n"
@@ -2626,66 +2626,66 @@ msgstr ""
msgid "encoding of subtitles"
msgstr ""
-#: src/spu_dec/sputext_demuxer.c:1461
+#: src/spu_dec/sputext_demuxer.c:1436
msgid "sputext demuxer plugin"
msgstr ""
-#: src/spu_dec/sputext_demuxer.c:1476
+#: src/spu_dec/sputext_demuxer.c:1451
msgid "default duration of subtitle display in seconds"
msgstr ""
-#: src/spu_dec/sputext_demuxer.c:1477
+#: src/spu_dec/sputext_demuxer.c:1452
msgid ""
"Some subtitle formats do not explicitly give a duration for each subtitle. "
"For these, you can set a default duration here. Setting to zero will result "
"in the subtitle being shown until the next one takes over."
msgstr ""
-#: src/spu_dec/sputext_decoder.c:912
+#: src/spu_dec/sputext_decoder.c:1135
msgid "external subtitle decoder plugin"
msgstr ""
-#: src/spu_dec/sputext_decoder.c:921
+#: src/spu_dec/sputext_decoder.c:1144
msgid "subtitle size"
msgstr ""
-#: src/spu_dec/sputext_decoder.c:922
+#: src/spu_dec/sputext_decoder.c:1145
msgid ""
"You can adjust the subtitle size here. The setting will be evaluated "
"relative to the window size."
msgstr ""
-#: src/spu_dec/sputext_decoder.c:928
+#: src/spu_dec/sputext_decoder.c:1151
msgid "subtitle vertical offset"
msgstr ""
-#: src/spu_dec/sputext_decoder.c:929
+#: src/spu_dec/sputext_decoder.c:1152
msgid ""
"You can adjust the vertical position of the subtitle. The setting will be "
"evaluated relative to the window size."
msgstr ""
-#: src/spu_dec/sputext_decoder.c:935 src/spu_dec/sputext_decoder.c:944
+#: src/spu_dec/sputext_decoder.c:1158 src/spu_dec/sputext_decoder.c:1167
msgid "font for subtitles"
msgstr ""
-#: src/spu_dec/sputext_decoder.c:936
+#: src/spu_dec/sputext_decoder.c:1159
msgid "A font from the xine font directory to be used for the subtitle text."
msgstr ""
-#: src/spu_dec/sputext_decoder.c:945
+#: src/spu_dec/sputext_decoder.c:1168
msgid "An outline font file (e.g. a .ttf) to be used for the subtitle text."
msgstr ""
-#: src/spu_dec/sputext_decoder.c:951
+#: src/spu_dec/sputext_decoder.c:1174
msgid "whether to use a freetype font"
msgstr ""
-#: src/spu_dec/sputext_decoder.c:958
+#: src/spu_dec/sputext_decoder.c:1181
msgid "encoding of the subtitles"
msgstr ""
-#: src/spu_dec/sputext_decoder.c:959
+#: src/spu_dec/sputext_decoder.c:1182
msgid ""
"The encoding of the subtitle text in the stream. This setting is used to "
"render non-ASCII characters correctly. If non-ASCII characters are not "
@@ -2693,11 +2693,11 @@ msgid ""
"used."
msgstr ""
-#: src/spu_dec/sputext_decoder.c:967
+#: src/spu_dec/sputext_decoder.c:1190
msgid "use unscaled OSD if possible"
msgstr ""
-#: src/spu_dec/sputext_decoder.c:968
+#: src/spu_dec/sputext_decoder.c:1191
msgid ""
"The unscaled OSD will be rendered independently of the video frame and will "
"always be sharp, even if the video is magnified. This will look better, but "
@@ -2784,7 +2784,7 @@ msgstr ""
msgid "win32 binary audio codec plugin"
msgstr ""
-#: src/audio_dec/xine_a52_decoder.c:757 src/audio_dec/xine_dts_decoder.c:524
+#: src/audio_dec/xine_a52_decoder.c:757 src/audio_dec/xine_dts_decoder.c:532
msgid "HELP! a mono-only audio driver?!\n"
msgstr ""
@@ -2827,7 +2827,7 @@ msgid ""
"that the additional channels are mixed into the stereo signal."
msgstr ""
-#: src/audio_dec/xine_dts_decoder.c:559
+#: src/audio_dec/xine_dts_decoder.c:567
msgid "DTS passthru audio format decoder plugin"
msgstr ""
@@ -3219,7 +3219,7 @@ msgstr ""
msgid "Adds noise"
msgstr ""
-#: src/post/planar/pp.c:111
+#: src/post/planar/pp.c:116
msgid ""
"FFmpeg libpostprocess plugin.\n"
"\n"
@@ -3227,13 +3227,13 @@ msgid ""
"\n"
msgstr ""
-#: src/post/planar/pp.c:116
+#: src/post/planar/pp.c:121
msgid ""
"\n"
"* libpostprocess (C) Michael Niedermayer\n"
msgstr ""
-#: src/post/planar/pp.c:155
+#: src/post/planar/pp.c:160
msgid "plugin for ffmpeg libpostprocess"
msgstr ""
@@ -3269,95 +3269,95 @@ msgstr ""
msgid "unsharp mask & gaussian blur"
msgstr ""
-#: src/vdr/input_vdr.c:183 src/vdr/input_vdr.c:223 src/vdr/input_vdr.c:2442
-#: src/vdr/input_vdr.c:2540
+#: src/vdr/input_vdr.c:197 src/vdr/input_vdr.c:237 src/vdr/input_vdr.c:1898
+#: src/vdr/input_vdr.c:1996
#, c-format
msgid "%s: input event write: %s.\n"
msgstr ""
-#: src/vdr/input_vdr.c:713 src/vdr/input_vdr.c:1137
+#: src/vdr/input_vdr.c:733 src/vdr/input_vdr.c:1129
#, c-format
msgid "%s: buffer_pool_alloc() failed!\n"
msgstr ""
-#: src/vdr/input_vdr.c:782
+#: src/vdr/input_vdr.c:802
#, c-format
msgid "%s: flush buffers (vb: %d, ab: %d, vf: %d, af: %d) %s.\n"
msgstr ""
-#: src/vdr/input_vdr.c:1476
+#: src/vdr/input_vdr.c:1515
#, c-format
msgid "%s: shutting down rpc thread (timeout: %d ms) ...\n"
msgstr ""
-#: src/vdr/input_vdr.c:1500
+#: src/vdr/input_vdr.c:1539
#, c-format
msgid "%s: cancelling rpc thread in function %d...\n"
msgstr ""
-#: src/vdr/input_vdr.c:1507
+#: src/vdr/input_vdr.c:1546
#, c-format
msgid "%s: joining rpc thread ...\n"
msgstr ""
-#: src/vdr/input_vdr.c:1509
+#: src/vdr/input_vdr.c:1548
#, c-format
msgid "%s: rpc thread joined.\n"
msgstr ""
-#: src/vdr/input_vdr.c:2145 src/vdr/input_vdr.c:2159 src/vdr/input_vdr.c:2177
-#: src/vdr/input_vdr.c:2199 src/vdr/input_vdr.c:2221
+#: src/vdr/input_vdr.c:1631 src/vdr/input_vdr.c:1645 src/vdr/input_vdr.c:1669
+#: src/vdr/input_vdr.c:1691 src/vdr/input_vdr.c:1713
#, c-format
msgid "%s: failed to open '%s' (%s)\n"
msgstr ""
-#: src/vdr/input_vdr.c:2161
+#: src/vdr/input_vdr.c:1647
msgid "timeout expired during setup phase"
msgstr ""
-#: src/vdr/input_vdr.c:2246
+#: src/vdr/input_vdr.c:1738
#, c-format
msgid "%s: failed to create socket for port %d (%s)\n"
msgstr ""
-#: src/vdr/input_vdr.c:2260
+#: src/vdr/input_vdr.c:1752
#, c-format
msgid "%s: failed to connect to port %d (%s)\n"
msgstr ""
-#: src/vdr/input_vdr.c:2267
+#: src/vdr/input_vdr.c:1759
#, c-format
msgid "%s: socket opening (port %d) successful, fd = %d\n"
msgstr ""
-#: src/vdr/input_vdr.c:2295
+#: src/vdr/input_vdr.c:1787
#, c-format
msgid "%s: connecting to vdr.\n"
msgstr ""
-#: src/vdr/input_vdr.c:2300
+#: src/vdr/input_vdr.c:1792
#, c-format
msgid "%s: failed to resolve hostname '%s' (%s)\n"
msgstr ""
-#: src/vdr/input_vdr.c:2323
+#: src/vdr/input_vdr.c:1815
#, c-format
msgid "%s: connecting to all sockets (port %d .. %d) was successful.\n"
msgstr ""
-#: src/vdr/input_vdr.c:2363
+#: src/vdr/input_vdr.c:1855
#, c-format
msgid ""
"%s: MRL (%s) invalid! MRL should start with vdr://path/to/fifo/stream or "
"netvdr://host:port where ':port' is optional.\n"
msgstr ""
-#: src/vdr/input_vdr.c:2373
+#: src/vdr/input_vdr.c:1865
#, c-format
msgid "%s: can't create new thread (%s)\n"
msgstr ""
-#: src/vdr/input_vdr.c:2654
+#: src/vdr/input_vdr.c:2189
msgid "VDR display device plugin"
msgstr ""
@@ -3413,10 +3413,8 @@ msgid "video colour key"
msgstr ""
#: src/video_out/video_out_directfb.c:1365
-#: src/video_out/video_out_vidix.c:1148 src/video_out/video_out_vidix.c:1155
-#: src/video_out/video_out_vidix.c:1162 src/video_out/video_out_xcbxv.c:1267
-#: src/video_out/video_out_xv.c:1320 src/video_out/video_out_xvmc.c:1415
-#: src/video_out/video_out_xxmc.c:2562
+#: src/video_out/video_out_vidix.c:1164 src/video_out/video_out_vidix.c:1171
+#: src/video_out/video_out_vidix.c:1178 src/video_out/xv_common.h:25
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."
@@ -3481,29 +3479,29 @@ msgid ""
"accelerated.\n"
msgstr ""
-#: src/video_out/video_out_directfb.c:1782
+#: src/video_out/video_out_directfb.c:1796
msgid "video layer id (auto: -1)"
msgstr ""
-#: src/video_out/video_out_directfb.c:1783
+#: src/video_out/video_out_directfb.c:1797
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:2001
+#: src/video_out/video_out_directfb.c:1818
+#: src/video_out/video_out_directfb.c:2015
#, c-format
msgid "video_out_directfb: using display layer #%d.\n"
msgstr ""
-#: src/video_out/video_out_directfb.c:1901
+#: src/video_out/video_out_directfb.c:1915
msgid "xine video output plugin using DirectFB."
msgstr ""
-#: src/video_out/video_out_directfb.c:1994
+#: src/video_out/video_out_directfb.c:2008
msgid "video_out_directfb: no usable display layer was found!\n"
msgstr ""
-#: src/video_out/video_out_directfb.c:2106
+#: src/video_out/video_out_directfb.c:2120
msgid "xine video output plugin using DirectFB under XDirectFB."
msgstr ""
@@ -3511,18 +3509,18 @@ msgstr ""
msgid "xine video output plugin for win32 using directx"
msgstr ""
-#: src/video_out/video_out_fb.c:746
+#: src/video_out/video_out_fb.c:758
#, c-format
msgid ""
"video_out_fb: only packed truecolour/directcolour is supported (%d).\n"
" Check 'fbset -i' or try 'fbset -depth 16'.\n"
msgstr ""
-#: src/video_out/video_out_fb.c:806 src/video_out/video_out_vidix.c:1220
+#: src/video_out/video_out_fb.c:818 src/video_out/video_out_vidix.c:1236
msgid "framebuffer device name"
msgstr ""
-#: src/video_out/video_out_fb.c:807 src/video_out/video_out_vidix.c:1221
+#: src/video_out/video_out_fb.c:819 src/video_out/video_out_vidix.c:1237
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, "
@@ -3530,17 +3528,17 @@ msgid ""
"careful that the value you enter really is a proper framebuffer device."
msgstr ""
-#: src/video_out/video_out_fb.c:881
+#: src/video_out/video_out_fb.c:893
#, c-format
msgid "%s: Your video mode was not recognized, sorry.\n"
msgstr ""
-#: src/video_out/video_out_fb.c:938
+#: src/video_out/video_out_fb.c:950
#, c-format
msgid "%s: %d video RAM buffers are available.\n"
msgstr ""
-#: src/video_out/video_out_fb.c:944
+#: src/video_out/video_out_fb.c:956
#, c-format
msgid ""
"WARNING: %s: Zero copy buffers are DISABLED because only %d buffers\n"
@@ -3548,14 +3546,14 @@ msgid ""
" the frame buffer resolution might help.\n"
msgstr ""
-#: src/video_out/video_out_fb.c:955
+#: src/video_out/video_out_fb.c:967
#, c-format
msgid ""
"WARNING: %s: 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:1024
+#: src/video_out/video_out_fb.c:1036
#, c-format
msgid ""
"WARNING: %s: current display depth is %d. For better performance\n"
@@ -3563,7 +3561,7 @@ msgid ""
"\n"
msgstr ""
-#: src/video_out/video_out_fb.c:1055
+#: src/video_out/video_out_fb.c:1067
msgid "Xine video output plugin using the Linux frame buffer device"
msgstr ""
@@ -3614,9 +3612,8 @@ msgid ""
"Ignored for static render routines.\n"
msgstr ""
-#: src/video_out/video_out_opengl.c:1915 src/video_out/video_out_vidix.c:1012
-#: src/video_out/video_out_xcbxv.c:1299 src/video_out/video_out_xv.c:1352
-#: src/video_out/video_out_xvmc.c:1429 src/video_out/video_out_xxmc.c:2594
+#: src/video_out/video_out_opengl.c:1915 src/video_out/video_out_vidix.c:1028
+#: src/video_out/xv_common.h:46
msgid "enable double buffering"
msgstr ""
@@ -3679,79 +3676,77 @@ msgstr ""
msgid "video_out_pgx64: Error: unable to set window properties\n"
msgstr ""
-#: src/video_out/video_out_pgx64.c:808
+#: src/video_out/video_out_pgx64.c:807
msgid "video_out_pgx64: Warning: low video memory, multi-buffering disabled\n"
msgstr ""
-#: src/video_out/video_out_pgx64.c:840
+#: src/video_out/video_out_pgx64.c:839
msgid "video_out_pgx64: Error: insuffucient video memory\n"
msgstr ""
-#: src/video_out/video_out_pgx64.c:856
+#: src/video_out/video_out_pgx64.c:855
msgid "video_out_pgx64: Warning: low video memory, double-buffering disabled\n"
msgstr ""
-#: src/video_out/video_out_pgx64.c:1386
+#: src/video_out/video_out_pgx64.c:1385
msgid "video_out_pgx64: Error: ioctl failed (FBIOGATTR)\n"
msgstr ""
-#: src/video_out/video_out_pgx64.c:1453 src/video_out/video_out_xcbxv.c:1266
-#: src/video_out/video_out_xv.c:1319 src/video_out/video_out_xvmc.c:1414
-#: src/video_out/video_out_xxmc.c:2561
+#: src/video_out/video_out_pgx64.c:1452 src/video_out/xv_common.h:24
msgid "video overlay colour key"
msgstr ""
-#: src/video_out/video_out_pgx64.c:1454
+#: src/video_out/video_out_pgx64.c:1453
msgid ""
"The colour key is used to tell the graphics card where it can overlay the "
"video image. Try using different values if you see the video showing through "
"other windows."
msgstr ""
-#: src/video_out/video_out_pgx64.c:1461
+#: src/video_out/video_out_pgx64.c:1460
msgid "enable chroma keying"
msgstr ""
-#: src/video_out/video_out_pgx64.c:1462
+#: src/video_out/video_out_pgx64.c:1461
msgid ""
"Draw OSD graphics on top of the overlay colour key rather than blend them "
"into each frame."
msgstr ""
-#: src/video_out/video_out_pgx64.c:1465
+#: src/video_out/video_out_pgx64.c:1464
msgid "enable multi-buffering"
msgstr ""
-#: src/video_out/video_out_pgx64.c:1466
+#: src/video_out/video_out_pgx64.c:1465
msgid ""
"Multi buffering increases performance at the expense of using more graphics "
"memory."
msgstr ""
-#: src/video_out/video_out_pgx64.c:1487
+#: src/video_out/video_out_pgx64.c:1486
msgid "xine video output plugin for Sun XVR100/PGX64/PGX24 framebuffers"
msgstr ""
-#: src/video_out/video_out_sdl.c:480
+#: src/video_out/video_out_sdl.c:488
msgid "use hardware acceleration if available"
msgstr ""
-#: src/video_out/video_out_sdl.c:481
+#: src/video_out/video_out_sdl.c:489
msgid ""
"When your system supports it, hardware acceleration provided by your "
"graphics hardware will be used. This might not work, so you can disable it, "
"if things go wrong."
msgstr ""
-#: src/video_out/video_out_sdl.c:523
+#: src/video_out/video_out_sdl.c:531
msgid "sdl has to emulate a 16 bit surfaces, that will slow things down.\n"
msgstr ""
-#: src/video_out/video_out_sdl.c:560
+#: src/video_out/video_out_sdl.c:568
msgid "video_out_sdl: fullscreen mode is NOT supported\n"
msgstr ""
-#: src/video_out/video_out_sdl.c:582
+#: src/video_out/video_out_sdl.c:590
msgid "xine video output plugin using the Simple Direct Media Layer"
msgstr ""
@@ -3759,145 +3754,75 @@ msgstr ""
msgid "xine video output plugin using the Libstk Surface Set-top Toolkit"
msgstr ""
-#: src/video_out/video_out_syncfb.c:280
-msgid "video_out_syncfb: error. (YUY2 not supported by your graphic card)\n"
-msgstr ""
-
-#: src/video_out/video_out_syncfb.c:296
-msgid "video_out_syncfb: error. (YV12 not supported by your graphic card)\n"
-msgstr ""
-
-#: src/video_out/video_out_syncfb.c:938
-msgid "video_out_syncfb: info. (SyncFB module supports YUV 4:2:0 (3 plane))\n"
-msgstr ""
-
-#: src/video_out/video_out_syncfb.c:943
-msgid "video_out_syncfb: info. (SyncFB module supports YUV 4:2:0 (2 plane))\n"
-msgstr ""
-
-#: src/video_out/video_out_syncfb.c:948
-msgid "video_out_syncfb: info. (SyncFB module supports YUV 4:2:2)\n"
-msgstr ""
-
-#: src/video_out/video_out_syncfb.c:954
-msgid "video_out_syncfb: info. (SyncFB module supports YUY2)\n"
-msgstr ""
-
-#: src/video_out/video_out_syncfb.c:961
-msgid "video_out_syncfb: info. (SyncFB module supports RGB565)\n"
-msgstr ""
-
-#: src/video_out/video_out_syncfb.c:966
-msgid ""
-"video_out_syncfb: aborting. (SyncFB module does not support YV12, YUY2 nor "
-"RGB565)\n"
-msgstr ""
-
-#: src/video_out/video_out_syncfb.c:985
-msgid ""
-"video_out_syncfb: info. (brightness/contrast control won't be available "
-"because your SyncFB kernel module seems to be outdated. Please refer to "
-"README.syncfb for informations on how to update it.)\n"
-msgstr ""
-
-#: src/video_out/video_out_syncfb.c:1009
-msgid "default number of frame repetitions"
-msgstr ""
-
-#: src/video_out/video_out_syncfb.c:1010
-msgid ""
-"This specifies how many times a single video frame will be displayed "
-"consecutively."
-msgstr ""
-
-#: src/video_out/video_out_syncfb.c:1060
-msgid "SyncFB device name"
-msgstr ""
-
-#: src/video_out/video_out_syncfb.c:1061
-msgid ""
-"Specifies the file name for the SyncFB (TeleTux) device to be used.\n"
-"This setting is security critical, because when changed to a different file, "
-"xine can be used to fill this file with arbitrary content. So you should be "
-"careful that the value you enter really is a proper framebuffer device."
-msgstr ""
-
-#: src/video_out/video_out_syncfb.c:1084
-msgid ""
-"xine video output plugin using the SyncFB module for Matrox G200/G400 cards"
-msgstr ""
-
-#: src/video_out/video_out_vidix.c:990
+#: src/video_out/video_out_vidix.c:1006
msgid "red intensity"
msgstr ""
-#: src/video_out/video_out_vidix.c:990
+#: src/video_out/video_out_vidix.c:1006
msgid "The intensity of the red colour components."
msgstr ""
-#: src/video_out/video_out_vidix.c:995
+#: src/video_out/video_out_vidix.c:1011
msgid "green intensity"
msgstr ""
-#: src/video_out/video_out_vidix.c:995
+#: src/video_out/video_out_vidix.c:1011
msgid "The intensity of the green colour components."
msgstr ""
-#: src/video_out/video_out_vidix.c:1000
+#: src/video_out/video_out_vidix.c:1016
msgid "blue intensity"
msgstr ""
-#: src/video_out/video_out_vidix.c:1000
+#: src/video_out/video_out_vidix.c:1016
msgid "The intensity of the blue colour components."
msgstr ""
-#: src/video_out/video_out_vidix.c:1013 src/video_out/video_out_xcbxv.c:1300
-#: src/video_out/video_out_xv.c:1353 src/video_out/video_out_xvmc.c:1430
-#: src/video_out/video_out_xxmc.c:2595
+#: src/video_out/video_out_vidix.c:1029 src/video_out/xv_common.h:47
msgid ""
"Double buffering will synchronize the update of the video image to the "
"repainting of the entire screen (\"vertical retrace\"). This eliminates "
"flickering and tearing artifacts, but will use more graphics memory."
msgstr ""
-#: src/video_out/video_out_vidix.c:1060
+#: src/video_out/video_out_vidix.c:1076
msgid "video_out_vidix: adaptor supports the yuy2 format\n"
msgstr ""
-#: src/video_out/video_out_vidix.c:1071
+#: src/video_out/video_out_vidix.c:1087
msgid "video_out_vidix: adaptor supports the yv12 format\n"
msgstr ""
-#: src/video_out/video_out_vidix.c:1087
+#: src/video_out/video_out_vidix.c:1103
msgid "video_out_vidix: You have wrong version of VIDIX library\n"
msgstr ""
-#: src/video_out/video_out_vidix.c:1095
+#: src/video_out/video_out_vidix.c:1111
msgid "video_out_vidix: Couldn't find working VIDIX driver\n"
msgstr ""
-#: src/video_out/video_out_vidix.c:1108
+#: src/video_out/video_out_vidix.c:1124
#, c-format
msgid "video_out_vidix: using driver: %s by %s\n"
msgstr ""
-#: src/video_out/video_out_vidix.c:1147
+#: src/video_out/video_out_vidix.c:1163
msgid "video overlay colour key red component"
msgstr ""
-#: src/video_out/video_out_vidix.c:1154
+#: src/video_out/video_out_vidix.c:1170
msgid "video overlay colour key green component"
msgstr ""
-#: src/video_out/video_out_vidix.c:1161
+#: src/video_out/video_out_vidix.c:1177
msgid "video overlay colour key blue component"
msgstr ""
-#: src/video_out/video_out_vidix.c:1195
+#: src/video_out/video_out_vidix.c:1211
msgid "xine video output plugin using libvidix for x11"
msgstr ""
-#: src/video_out/video_out_vidix.c:1269
+#: src/video_out/video_out_vidix.c:1285
msgid "xine video output plugin using libvidix for linux frame buffer"
msgstr ""
@@ -3907,15 +3832,15 @@ msgid "%s: %s: allocating image\n"
msgstr ""
#: src/video_out/video_out_xcbshm.c:152 src/video_out/video_out_xcbshm.c:162
-#: src/video_out/video_out_xcbshm.c:174 src/video_out/video_out_xcbxv.c:260
-#: src/video_out/video_out_xcbxv.c:270 src/video_out/video_out_xcbxv.c:280
-#: src/video_out/video_out_xcbxv.c:292 src/video_out/video_out_xshm.c:196
+#: src/video_out/video_out_xcbshm.c:174 src/video_out/video_out_xcbxv.c:263
+#: src/video_out/video_out_xcbxv.c:273 src/video_out/video_out_xcbxv.c:283
+#: src/video_out/video_out_xcbxv.c:295 src/video_out/video_out_xshm.c:196
#: src/video_out/video_out_xshm.c:213 src/video_out/video_out_xshm.c:224
-#: src/video_out/video_out_xshm.c:243 src/video_out/video_out_xv.c:288
-#: src/video_out/video_out_xv.c:315 src/video_out/video_out_xv.c:324
-#: src/video_out/video_out_xv.c:360 src/video_out/video_out_xxmc.c:642
-#: src/video_out/video_out_xxmc.c:653 src/video_out/video_out_xxmc.c:662
-#: src/video_out/video_out_xxmc.c:698
+#: src/video_out/video_out_xshm.c:243 src/video_out/video_out_xv.c:291
+#: src/video_out/video_out_xv.c:318 src/video_out/video_out_xv.c:327
+#: src/video_out/video_out_xv.c:363 src/video_out/video_out_xxmc.c:643
+#: src/video_out/video_out_xxmc.c:654 src/video_out/video_out_xxmc.c:663
+#: src/video_out/video_out_xxmc.c:699
#, c-format
msgid "%s: => not using MIT Shared Memory extension.\n"
msgstr ""
@@ -3925,14 +3850,14 @@ msgstr ""
msgid "%s: shared memory error (address error) when allocating image \n"
msgstr ""
-#: src/video_out/video_out_xcbshm.c:172 src/video_out/video_out_xcbxv.c:290
-#: src/video_out/video_out_xshm.c:241 src/video_out/video_out_xv.c:358
-#: src/video_out/video_out_xxmc.c:696
+#: src/video_out/video_out_xcbshm.c:172 src/video_out/video_out_xcbxv.c:293
+#: src/video_out/video_out_xshm.c:241 src/video_out/video_out_xv.c:361
+#: src/video_out/video_out_xxmc.c:697
#, c-format
msgid "%s: x11 error during shared memory XImage creation\n"
msgstr ""
-#: src/video_out/video_out_xcbshm.c:1096 src/video_out/video_out_xshm.c:1153
+#: src/video_out/video_out_xcbshm.c:1102 src/video_out/video_out_xshm.c:1159
#, c-format
msgid ""
"\n"
@@ -3942,113 +3867,86 @@ msgid ""
"\n"
msgstr ""
-#: src/video_out/video_out_xcbshm.c:1109 src/video_out/video_out_xshm.c:1166
+#: src/video_out/video_out_xcbshm.c:1115 src/video_out/video_out_xshm.c:1172
#, c-format
msgid "%s: MIT shared memory extension not present on display.\n"
msgstr ""
-#: src/video_out/video_out_xcbshm.c:1208 src/video_out/video_out_xshm.c:1250
+#: src/video_out/video_out_xcbshm.c:1214 src/video_out/video_out_xshm.c:1256
#, c-format
msgid "%s: your video mode was not recognized, sorry :-(\n"
msgstr ""
-#: src/video_out/video_out_xcbshm.c:1237 src/video_out/video_out_xshm.c:1298
+#: src/video_out/video_out_xcbshm.c:1243 src/video_out/video_out_xshm.c:1304
msgid "xine video output plugin using the MIT X shared memory extension"
msgstr ""
-#: src/video_out/video_out_xcbxv.c:258 src/video_out/video_out_xv.c:313
-#: src/video_out/video_out_xxmc.c:651
+#: src/video_out/video_out_xcbxv.c:261 src/video_out/video_out_xv.c:316
+#: src/video_out/video_out_xxmc.c:652
#, c-format
msgid "%s: XvShmCreateImage returned a zero size\n"
msgstr ""
-#: src/video_out/video_out_xcbxv.c:268 src/video_out/video_out_xv.c:322
-#: src/video_out/video_out_xxmc.c:660
+#: src/video_out/video_out_xcbxv.c:271 src/video_out/video_out_xv.c:325
+#: src/video_out/video_out_xxmc.c:661
#, c-format
msgid "%s: shared memory error in shmget: %s\n"
msgstr ""
-#: src/video_out/video_out_xcbxv.c:278
+#: src/video_out/video_out_xcbxv.c:281
#, c-format
msgid "%s: shared memory error (address error)\n"
msgstr ""
-#: src/video_out/video_out_xcbxv.c:1120 src/video_out/video_out_xv.c:1167
-#: src/video_out/video_out_xxmc.c:2412
+#: src/video_out/video_out_xcbxv.c:1211 src/video_out/video_out_xv.c:1244
+#: src/video_out/video_out_xxmc.c:2472
#, c-format
msgid "%s: Xv extension not present.\n"
msgstr ""
-#: src/video_out/video_out_xcbxv.c:1162 src/video_out/video_out_xv.c:1204
-#: src/video_out/video_out_xxmc.c:2449
+#: src/video_out/video_out_xcbxv.c:1238 src/video_out/video_out_xv.c:1269
+#: src/video_out/video_out_xxmc.c:2497
+#, c-format
+msgid "%s: could not open Xv port %d - autodetecting\n"
+msgstr ""
+
+#: src/video_out/video_out_xcbxv.c:1251 src/video_out/video_out_xv.c:1282
+#: src/video_out/video_out_xxmc.c:2510
#, c-format
msgid ""
"%s: Xv extension is present but I couldn't find a usable yuv12 port.\n"
"\tLooks like your graphics hardware driver doesn't support Xv?!\n"
msgstr ""
-#: src/video_out/video_out_xcbxv.c:1171
+#: src/video_out/video_out_xcbxv.c:1260
#, c-format
msgid ""
"%s: using Xv port %d from adaptor %s for hardware colour space conversion "
"and scaling.\n"
msgstr ""
-#: src/video_out/video_out_xcbxv.c:1275 src/video_out/video_out_xv.c:1328
-#: src/video_out/video_out_xvmc.c:1423 src/video_out/video_out_xxmc.c:2570
-msgid "autopaint colour key"
-msgstr ""
-
-#: src/video_out/video_out_xcbxv.c:1276 src/video_out/video_out_xv.c:1329
-#: src/video_out/video_out_xvmc.c:1424 src/video_out/video_out_xxmc.c:2571
-msgid "Make Xv autopaint its colour key."
+#: src/video_out/video_out_xcbxv.c:1383 src/video_out/video_out_xv.c:1425
+msgid "enable vblank sync"
msgstr ""
-#: src/video_out/video_out_xcbxv.c:1283 src/video_out/video_out_xv.c:1336
-#: src/video_out/video_out_xxmc.c:2578
-msgid "bilinear scaling mode"
-msgstr ""
-
-#: src/video_out/video_out_xcbxv.c:1284 src/video_out/video_out_xv.c:1337
-#: src/video_out/video_out_xxmc.c:2579
+#: src/video_out/video_out_xcbxv.c:1384 src/video_out/video_out_xv.c:1426
msgid ""
-"Selects the bilinear scaling mode for Permedia cards. The individual values "
-"are:\n"
-"\n"
-"Permedia 2\n"
-"0 - disable bilinear filtering\n"
-"1 - enable bilinear filtering\n"
-"\n"
-"Permedia 3\n"
-"0 - disable bilinear filtering\n"
-"1 - horizontal linear filtering\n"
-"2 - enable full bilinear filtering"
-msgstr ""
-
-#: src/video_out/video_out_xcbxv.c:1336 src/video_out/video_out_xv.c:1386
-#: src/video_out/video_out_xxmc.c:2635
-#, c-format
-msgid "%s: this adaptor supports the yv12 format.\n"
+"This option will synchronize the update of the video image to the repainting "
+"of the entire screen (\"vertical retrace\"). This eliminates flickering and "
+"tearing artifacts. On nvidia cards one may also need to run \"nvidia-settings"
+"\" and choose which display device to sync to under the XVideo Settings tab"
msgstr ""
-#: src/video_out/video_out_xcbxv.c:1341 src/video_out/video_out_xv.c:1391
-#: src/video_out/video_out_xxmc.c:2640
+#: src/video_out/video_out_xcbxv.c:1423 src/video_out/video_out_xcbxv.c:1429
+#: src/video_out/video_out_xv.c:1462 src/video_out/video_out_xv.c:1468
+#: src/video_out/video_out_xvmc.c:1470 src/video_out/video_out_xvmc.c:1476
+#: src/video_out/video_out_xxmc.c:2682 src/video_out/video_out_xxmc.c:2688
#, c-format
-msgid "%s: this adaptor supports the yuy2 format.\n"
-msgstr ""
-
-#: src/video_out/video_out_xcbxv.c:1349 src/video_out/video_out_xv.c:1413
-#: src/video_out/video_out_xxmc.c:2663
-msgid "pitch alignment workaround"
+msgid "%s: this adaptor supports the %s format.\n"
msgstr ""
-#: src/video_out/video_out_xcbxv.c:1350 src/video_out/video_out_xv.c:1414
-#: src/video_out/video_out_xxmc.c:2664
-msgid "Some buggy video drivers need a workaround to function properly."
-msgstr ""
-
-#: src/video_out/video_out_xcbxv.c:1377 src/video_out/video_out_xv.c:1460
-#: src/video_out/video_out_xxmc.c:2757
+#: src/video_out/video_out_xcbxv.c:1467 src/video_out/video_out_xv.c:1539
+#: src/video_out/video_out_xxmc.c:2807
msgid "xine video output plugin using the MIT X video extension"
msgstr ""
@@ -4057,113 +3955,113 @@ msgstr ""
msgid "%s: shared memory error when allocating image\n"
msgstr ""
-#: src/video_out/video_out_xv.c:286 src/video_out/video_out_xxmc.c:640
+#: src/video_out/video_out_xv.c:289 src/video_out/video_out_xxmc.c:641
#, c-format
msgid "%s: XvShmCreateImage failed\n"
msgstr ""
-#: src/video_out/video_out_xv.c:1214 src/video_out/video_out_xxmc.c:2459
+#: src/video_out/video_out_xv.c:1292 src/video_out/video_out_xxmc.c:2520
#, c-format
msgid ""
"%s: using Xv port %ld from adaptor %s for hardware colour space conversion "
"and scaling.\n"
msgstr ""
-#: src/video_out/video_out_xvmc.c:1540
+#: src/video_out/video_out_xvmc.c:1548
msgid "video_out_xvmc: XvMC extension not present.\n"
msgstr ""
-#: src/video_out/video_out_xvmc.c:1638
+#: src/video_out/video_out_xvmc.c:1646
msgid ""
"video_out_xvmc: Xv extension is present but I couldn't find a usable yuv12 "
"port.\n"
msgstr ""
-#: src/video_out/video_out_xvmc.c:1647
+#: src/video_out/video_out_xvmc.c:1655
#, c-format
msgid ""
"video_out_xvmc: using Xv port %ld from adaptor %s\n"
" for hardware colour space conversion and scaling\n"
msgstr ""
-#: src/video_out/video_out_xvmc.c:1652
+#: src/video_out/video_out_xvmc.c:1660
msgid " idct and motion compensation acceleration \n"
msgstr ""
-#: src/video_out/video_out_xvmc.c:1654
+#: src/video_out/video_out_xvmc.c:1662
msgid " motion compensation acceleration only\n"
msgstr ""
-#: src/video_out/video_out_xvmc.c:1656
+#: src/video_out/video_out_xvmc.c:1664
msgid " no XvMC support \n"
msgstr ""
-#: src/video_out/video_out_xvmc.c:1657
+#: src/video_out/video_out_xvmc.c:1665
#, c-format
msgid " With Overlay = %d; UnsignedIntra = %d.\n"
msgstr ""
-#: src/video_out/video_out_xvmc.c:1670
+#: src/video_out/video_out_xvmc.c:1678
msgid "xine video output plugin using the XvMC X video extension"
msgstr ""
-#: src/video_out/video_out_xxmc.c:2669
+#: src/video_out/video_out_xxmc.c:2719
msgid "Make XvMC allocate more frames for better buffering."
msgstr ""
-#: src/video_out/video_out_xxmc.c:2670
+#: src/video_out/video_out_xxmc.c:2720
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:2676
+#: src/video_out/video_out_xxmc.c:2726
msgid "Unichrome cpu save"
msgstr ""
-#: src/video_out/video_out_xxmc.c:2677
+#: src/video_out/video_out_xxmc.c:2727
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:2683
+#: src/video_out/video_out_xxmc.c:2733
msgid "Fix buggy NVIDIA XvMC subpicture colours"
msgstr ""
-#: src/video_out/video_out_xxmc.c:2684
+#: src/video_out/video_out_xxmc.c:2734
msgid ""
"There's a bug in NVIDIA's XvMC lib that makes red OSD colours\n"
"look blue and vice versa. This option provides a workaround.\n"
msgstr ""
-#: src/video_out/video_out_xxmc.c:2689
+#: src/video_out/video_out_xxmc.c:2739
msgid "Use bob as accelerated deinterlace method."
msgstr ""
-#: src/video_out/video_out_xxmc.c:2690
+#: src/video_out/video_out_xxmc.c:2740
msgid ""
"When interlacing is enabled for hardware accelerated frames,\n"
"alternate between top and bottom field at double the frame rate.\n"
msgstr ""
-#: src/video_out/video_out_xxmc.c:2696
+#: src/video_out/video_out_xxmc.c:2746
msgid "Don't use bob deinterlacing for progressive frames."
msgstr ""
-#: src/video_out/video_out_xxmc.c:2697
+#: src/video_out/video_out_xxmc.c:2747
msgid ""
"Progressive frames don't need deinterlacing, so disabling it on\n"
"demand should result in a better picture.\n"
msgstr ""
-#: src/video_out/video_out_xxmc.c:2703
+#: src/video_out/video_out_xxmc.c:2753
msgid "Don't use bob deinterlacing while a scaled OSD is active."
msgstr ""
-#: src/video_out/video_out_xxmc.c:2704
+#: src/video_out/video_out_xxmc.c:2754
msgid ""
"Bob deinterlacing adds some noise to horizontal lines, so disabling it\n"
"on demand should result in a better OSD picture.\n"
@@ -4187,6 +4085,60 @@ msgstr ""
msgid "x11osd: unscaled overlay created (%s mode).\n"
msgstr ""
+#: src/video_out/xv_common.h:30
+msgid "autopaint colour key"
+msgstr ""
+
+#: src/video_out/xv_common.h:31
+msgid "Make Xv autopaint its colour key."
+msgstr ""
+
+#: src/video_out/xv_common.h:34
+msgid "bilinear scaling mode"
+msgstr ""
+
+#: src/video_out/xv_common.h:35
+msgid ""
+"Selects the bilinear scaling mode for Permedia cards. The individual values "
+"are:\n"
+"\n"
+"Permedia 2\n"
+"0 - disable bilinear filtering\n"
+"1 - enable bilinear filtering\n"
+"\n"
+"Permedia 3\n"
+"0 - disable bilinear filtering\n"
+"1 - horizontal linear filtering\n"
+"2 - enable full bilinear filtering"
+msgstr ""
+
+#: src/video_out/xv_common.h:53
+msgid "Xv port number"
+msgstr ""
+
+#: src/video_out/xv_common.h:54
+msgid "Selects the Xv port number to use (0 to autodetect)."
+msgstr ""
+
+#: src/video_out/xv_common.h:57
+msgid "pitch alignment workaround"
+msgstr ""
+
+#: src/video_out/xv_common.h:58
+msgid "Some buggy video drivers need a workaround to function properly."
+msgstr ""
+
+#: src/video_out/xv_common.h:66
+msgid "video display method preference"
+msgstr ""
+
+#: src/video_out/xv_common.h:67
+msgid ""
+"Selects which video output method is preferred. Detection is done using the "
+"reported Xv adaptor names.\n"
+"(Only applies when auto-detecting which Xv port to use.)"
+msgstr ""
+
#: src/xine-engine/alphablend.c:2146
msgid "disable exact alpha blending of overlays"
msgstr ""
@@ -4221,32 +4173,32 @@ msgid ""
"increased latency and memory consumption."
msgstr ""
-#: src/xine-engine/audio_out.c:1111
+#: src/xine-engine/audio_out.c:1112
msgid ""
"audio_out: delay calculation impossible with an unavailable audio device\n"
msgstr ""
-#: src/xine-engine/audio_out.c:1250
+#: src/xine-engine/audio_out.c:1251
msgid "write to sound card failed. Assuming the device was unplugged.\n"
msgstr ""
-#: src/xine-engine/audio_out.c:1422
+#: src/xine-engine/audio_out.c:1423
msgid "8 bits not supported by driver, converting to 16 bits.\n"
msgstr ""
-#: src/xine-engine/audio_out.c:1430
+#: src/xine-engine/audio_out.c:1431
msgid "mono not supported by driver, converting to stereo.\n"
msgstr ""
-#: src/xine-engine/audio_out.c:1436
+#: src/xine-engine/audio_out.c:1437
msgid "stereo not supported by driver, converting to mono.\n"
msgstr ""
-#: src/xine-engine/audio_out.c:2095
+#: src/xine-engine/audio_out.c:2100
msgid "method to sync audio and video"
msgstr ""
-#: src/xine-engine/audio_out.c:2096
+#: src/xine-engine/audio_out.c:2101
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 "
@@ -4269,11 +4221,11 @@ msgid ""
"form."
msgstr ""
-#: src/xine-engine/audio_out.c:2124
+#: src/xine-engine/audio_out.c:2129
msgid "enable resampling"
msgstr ""
-#: src/xine-engine/audio_out.c:2125
+#: src/xine-engine/audio_out.c:2130
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 "
@@ -4281,33 +4233,33 @@ msgid ""
"automatically when necessary."
msgstr ""
-#: src/xine-engine/audio_out.c:2132
+#: src/xine-engine/audio_out.c:2137
msgid "always resample to this rate (0 to disable)"
msgstr ""
-#: src/xine-engine/audio_out.c:2133
+#: src/xine-engine/audio_out.c:2138
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:2142
+#: src/xine-engine/audio_out.c:2147
msgid "offset for digital passthrough"
msgstr ""
-#: src/xine-engine/audio_out.c:2143
+#: src/xine-engine/audio_out.c:2148
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:2152
+#: src/xine-engine/audio_out.c:2157
msgid "play audio even on slow/fast speeds"
msgstr ""
-#: src/xine-engine/audio_out.c:2153
+#: src/xine-engine/audio_out.c:2158
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 "
@@ -4315,23 +4267,23 @@ msgid ""
"audio post plugin instead."
msgstr ""
-#: src/xine-engine/audio_out.c:2226
+#: src/xine-engine/audio_out.c:2231
msgid "startup audio volume"
msgstr ""
-#: src/xine-engine/audio_out.c:2227
+#: src/xine-engine/audio_out.c:2232
msgid "The overall audio volume set at xine startup."
msgstr ""
-#: src/xine-engine/audio_out.c:2230
+#: src/xine-engine/audio_out.c:2235
msgid "restore volume level at startup"
msgstr ""
-#: src/xine-engine/audio_out.c:2231
+#: src/xine-engine/audio_out.c:2236
msgid "If disabled, xine will not modify any mixer settings at startup."
msgstr ""
-#: src/xine-engine/audio_out.c:2261
+#: src/xine-engine/audio_out.c:2266
msgid "audio_out: sorry, this should not happen. please restart xine.\n"
msgstr ""
@@ -4340,36 +4292,36 @@ msgstr ""
msgid "xine-lib: buffer.c: There has been a fatal error: TOO MANY FREE's\n"
msgstr ""
-#: src/xine-engine/configfile.c:933
+#: src/xine-engine/configfile.c:943
#, c-format
msgid "The current config file has been modified by a newer version of xine."
msgstr ""
-#: src/xine-engine/configfile.c:1038
+#: src/xine-engine/configfile.c:1048
#, c-format
msgid "configfile: WARNING: backing up configfile to %s failed\n"
msgstr ""
-#: src/xine-engine/configfile.c:1039
+#: src/xine-engine/configfile.c:1049
msgid "configfile: WARNING: your configuration will not be saved\n"
msgstr ""
-#: src/xine-engine/configfile.c:1138
+#: src/xine-engine/configfile.c:1149
#, c-format
msgid "configfile: WARNING: writing configuration to %s failed\n"
msgstr ""
-#: src/xine-engine/configfile.c:1139
+#: src/xine-engine/configfile.c:1150
#, c-format
msgid "configfile: WARNING: removing possibly broken config file %s\n"
msgstr ""
-#: src/xine-engine/configfile.c:1140
+#: src/xine-engine/configfile.c:1151
#, c-format
msgid "configfile: WARNING: you should check the backup file %s\n"
msgstr ""
-#: src/xine-engine/configfile.c:1275
+#: src/xine-engine/configfile.c:1606
#, c-format
msgid "configfile: entry '%s' mustn't be modified from MRL\n"
msgstr ""
@@ -4498,136 +4450,136 @@ msgstr ""
msgid "io_helper: Connection Refused\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:213
+#: src/xine-engine/load_plugins.c:216
#, c-format
msgid "map_decoder_list: no space for decoder, skipped.\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:327
+#: src/xine-engine/load_plugins.c:331
#, c-format
msgid ""
"load_plugins: ignoring plugin %s, wrong iface version %d (should be %d)\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:385
+#: src/xine-engine/load_plugins.c:390
#, c-format
msgid "priority for %s decoder"
msgstr ""
-#: src/xine-engine/load_plugins.c:390
+#: src/xine-engine/load_plugins.c:395
msgid ""
"The priority provides a ranking in case some media can be handled by more "
"than one decoder.\n"
"A priority of 0 enables the decoder's default priority."
msgstr ""
-#: src/xine-engine/load_plugins.c:418
+#: src/xine-engine/load_plugins.c:423
#, c-format
msgid ""
"load_plugins: demuxer plugin %s does not provide a priority, xine-lib will "
"use the default priority.\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:435
+#: src/xine-engine/load_plugins.c:440
#, c-format
msgid ""
"load_plugins: input plugin %s does not provide a priority, xine-lib will use "
"the default priority.\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:491
+#: src/xine-engine/load_plugins.c:497
#, c-format
msgid "load_plugins: plugin %s found\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:494
+#: src/xine-engine/load_plugins.c:500
#, c-format
msgid "load_plugins: static plugin found\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:501
+#: src/xine-engine/load_plugins.c:507
#, c-format
msgid "load_plugins: plugin limit reached, %s could not be loaded\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:504
+#: src/xine-engine/load_plugins.c:510
#, c-format
msgid "load_plugins: plugin limit reached, static plugin could not be loaded\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:521
+#: src/xine-engine/load_plugins.c:527
#, c-format
msgid "load_plugins: unknown plugin type %d in %s\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:525
+#: src/xine-engine/load_plugins.c:531
#, c-format
msgid "load_plugins: unknown statically linked plugin type %d\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:585
+#: src/xine-engine/load_plugins.c:593
#, c-format
msgid "load_plugins: unable to stat %s\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:626
+#: src/xine-engine/load_plugins.c:635
#, c-format
msgid ""
"load_plugins: cannot open plugin lib %s:\n"
"%s\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:641
+#: src/xine-engine/load_plugins.c:650
#, c-format
msgid ""
"load_plugins: can't get plugin info from %s:\n"
"%s\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:659
+#: src/xine-engine/load_plugins.c:668
#, c-format
msgid "load_plugins: skipping unreadable plugin directory %s.\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:708
+#: src/xine-engine/load_plugins.c:736
#, c-format
msgid ""
"load_plugins: cannot (stage 2) open plugin lib %s:\n"
"%s\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:734
+#: src/xine-engine/load_plugins.c:770
#, c-format
msgid "load_plugins: Yikes! %s doesn't contain plugin info.\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:1097 src/xine-engine/load_plugins.c:1106
+#: src/xine-engine/load_plugins.c:1174 src/xine-engine/load_plugins.c:1183
#, c-format
msgid "Unable to create %s directory: %s\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:1343
+#: src/xine-engine/load_plugins.c:1428
#, c-format
msgid "load_plugins: unknown content detection strategy %d\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:1468
+#: src/xine-engine/load_plugins.c:1553
#, c-format
msgid "load_plugins: using demuxer '%s'\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:1763 src/xine-engine/load_plugins.c:1810
+#: src/xine-engine/load_plugins.c:1850 src/xine-engine/load_plugins.c:1897
#, c-format
msgid "load_plugins: failed to load audio output plugin <%s>\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:1813
+#: src/xine-engine/load_plugins.c:1900
msgid ""
"load_plugins: audio output auto-probing didn't find any usable audio "
"driver.\n"
msgstr ""
-#: src/xine-engine/load_plugins.c:2116
+#: src/xine-engine/load_plugins.c:2204
#, c-format
msgid ""
"load_plugins: cannot unload plugin lib %s:\n"
@@ -4800,11 +4752,11 @@ msgstr ""
msgid "video_out: sorry, this should not happen. please restart xine.\n"
msgstr ""
-#: src/xine-engine/vo_scale.c:387
+#: src/xine-engine/vo_scale.c:380
msgid "horizontal image position in the output window"
msgstr ""
-#: src/xine-engine/vo_scale.c:388
+#: src/xine-engine/vo_scale.c:381
msgid ""
"If the video window's horizontal size is bigger than the actual image to "
"show, you can adjust the position where the image will be placed.\n"
@@ -4812,11 +4764,11 @@ msgid ""
"\", while 0 means \"at the very left\" and 100 \"at the very right\"."
msgstr ""
-#: src/xine-engine/vo_scale.c:395
+#: src/xine-engine/vo_scale.c:388
msgid "vertical image position in the output window"
msgstr ""
-#: src/xine-engine/vo_scale.c:396
+#: src/xine-engine/vo_scale.c:389
msgid ""
"If the video window's vertical size is bigger than the actual image to show, "
"you can adjust the position where the image will be placed.\n"
@@ -4824,11 +4776,11 @@ msgid ""
"\", while 0 means \"at the top\" and 100 \"at the bottom\"."
msgstr ""
-#: src/xine-engine/vo_scale.c:403
+#: src/xine-engine/vo_scale.c:396
msgid "disable all video scaling"
msgstr ""
-#: src/xine-engine/vo_scale.c:404
+#: src/xine-engine/vo_scale.c:397
msgid ""
"If you want the video image to be always shown at its original resolution, "
"you can disable all image scaling here.\n"
@@ -4839,132 +4791,132 @@ msgid ""
"accelerated, this can dramatically reduce CPU usage."
msgstr ""
-#: src/xine-engine/xine.c:831 src/xine-engine/xine.c:939
-#: src/xine-engine/xine.c:978 src/xine-engine/xine.c:1014
-#: src/xine-engine/xine.c:1026 src/xine-engine/xine.c:1039
-#: src/xine-engine/xine.c:1052 src/xine-engine/xine.c:1065
-#: src/xine-engine/xine.c:1091 src/xine-engine/xine.c:1116
-#: src/xine-engine/xine.c:1151
+#: src/xine-engine/xine.c:848 src/xine-engine/xine.c:970
+#: src/xine-engine/xine.c:1010 src/xine-engine/xine.c:1046
+#: src/xine-engine/xine.c:1058 src/xine-engine/xine.c:1071
+#: src/xine-engine/xine.c:1084 src/xine-engine/xine.c:1097
+#: src/xine-engine/xine.c:1123 src/xine-engine/xine.c:1148
+#: src/xine-engine/xine.c:1185
msgid "xine: error while parsing mrl\n"
msgstr ""
-#: src/xine-engine/xine.c:873
+#: src/xine-engine/xine.c:907
#, c-format
msgid "xine: found input plugin : %s\n"
msgstr ""
-#: src/xine-engine/xine.c:891
+#: src/xine-engine/xine.c:924
#, c-format
msgid "xine: input plugin cannot open MRL [%s]\n"
msgstr ""
-#: src/xine-engine/xine.c:902
+#: src/xine-engine/xine.c:933
#, c-format
msgid "xine: cannot find input plugin for MRL [%s]\n"
msgstr ""
-#: src/xine-engine/xine.c:928
+#: src/xine-engine/xine.c:959
#, c-format
msgid "xine: specified demuxer %s failed to start\n"
msgstr ""
-#: src/xine-engine/xine.c:964
+#: src/xine-engine/xine.c:996
#, c-format
msgid "xine: join rip input plugin\n"
msgstr ""
-#: src/xine-engine/xine.c:971
+#: src/xine-engine/xine.c:1003
msgid "xine: error opening rip input plugin instance\n"
msgstr ""
-#: src/xine-engine/xine.c:1002
+#: src/xine-engine/xine.c:1034
#, c-format
msgid "xine: last_probed demuxer %s failed to start\n"
msgstr ""
-#: src/xine-engine/xine.c:1031
+#: src/xine-engine/xine.c:1063
msgid "ignoring video\n"
msgstr ""
-#: src/xine-engine/xine.c:1044
+#: src/xine-engine/xine.c:1076
msgid "ignoring audio\n"
msgstr ""
-#: src/xine-engine/xine.c:1057
+#: src/xine-engine/xine.c:1089
msgid "ignoring subpicture\n"
msgstr ""
-#: src/xine-engine/xine.c:1070
+#: src/xine-engine/xine.c:1102
msgid "input cache plugin disabled\n"
msgstr ""
-#: src/xine-engine/xine.c:1141
+#: src/xine-engine/xine.c:1175
#, c-format
msgid "subtitle mrl opened '%s'\n"
msgstr ""
-#: src/xine-engine/xine.c:1145
+#: src/xine-engine/xine.c:1179
msgid "xine: error opening subtitle mrl\n"
msgstr ""
-#: src/xine-engine/xine.c:1177
+#: src/xine-engine/xine.c:1211
#, c-format
msgid "xine: error while parsing MRL\n"
msgstr ""
-#: src/xine-engine/xine.c:1184
+#: src/xine-engine/xine.c:1218
#, c-format
msgid "xine: changing option '%s' from MRL isn't permitted\n"
msgstr ""
-#: src/xine-engine/xine.c:1204
+#: src/xine-engine/xine.c:1238
#, c-format
msgid "xine: couldn't find demux for >%s<\n"
msgstr ""
-#: src/xine-engine/xine.c:1220
+#: src/xine-engine/xine.c:1254
#, c-format
msgid "xine: found demuxer plugin: %s\n"
msgstr ""
-#: src/xine-engine/xine.c:1242
+#: src/xine-engine/xine.c:1276
#, c-format
msgid "xine: demuxer is already done. that was fast!\n"
msgstr ""
-#: src/xine-engine/xine.c:1244
+#: src/xine-engine/xine.c:1278
#, c-format
msgid "xine: demuxer failed to start\n"
msgstr ""
-#: src/xine-engine/xine.c:1310
+#: src/xine-engine/xine.c:1344
#, c-format
msgid "xine_play: no demux available\n"
msgstr ""
-#: src/xine-engine/xine.c:1380
+#: src/xine-engine/xine.c:1415
#, c-format
msgid "xine_play: demux failed to start\n"
msgstr ""
-#: src/xine-engine/xine.c:1657
+#: src/xine-engine/xine.c:1693
#, c-format
msgid "xine: The specified save_dir \"%s\" might be a security risk.\n"
msgstr ""
-#: src/xine-engine/xine.c:1662
+#: src/xine-engine/xine.c:1698
msgid "The specified save_dir might be a security risk."
msgstr ""
-#: src/xine-engine/xine.c:1690
+#: src/xine-engine/xine.c:1732
msgid "xine: locale not supported by C library\n"
msgstr ""
-#: src/xine-engine/xine.c:1699
+#: src/xine-engine/xine.c:1741
msgid "media format detection strategy"
msgstr ""
-#: src/xine-engine/xine.c:1700
+#: src/xine-engine/xine.c:1742
msgid ""
"xine offers various methods to detect the media format of input to play. The "
"individual values are:\n"
@@ -4982,11 +4934,11 @@ msgid ""
"Detect by file name extension only.\n"
msgstr ""
-#: src/xine-engine/xine.c:1718
+#: src/xine-engine/xine.c:1760
msgid "directory for saving streams"
msgstr ""
-#: src/xine-engine/xine.c:1719
+#: src/xine-engine/xine.c:1761
msgid ""
"When using the stream save feature, files will be written only into this "
"directory.\n"
@@ -4996,11 +4948,11 @@ msgid ""
"content in any file."
msgstr ""
-#: src/xine-engine/xine.c:1730
+#: src/xine-engine/xine.c:1772
msgid "allow implicit changes to the configuration (e.g. by MRL)"
msgstr ""
-#: src/xine-engine/xine.c:1731
+#: src/xine-engine/xine.c:1773
msgid ""
"If enabled, you allow xine to change your configuration without explicit "
"actions from your side. For example configuration changes demanded by MRLs "
@@ -5010,26 +4962,26 @@ msgid ""
"configuration, you might end with a totally messed up xine."
msgstr ""
-#: src/xine-engine/xine.c:1745
+#: src/xine-engine/xine.c:1787
msgid "Timeout for network stream reading (in seconds)"
msgstr ""
-#: src/xine-engine/xine.c:1746
+#: src/xine-engine/xine.c:1788
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:2098
+#: src/xine-engine/xine.c:2196
msgid "messages"
msgstr ""
-#: src/xine-engine/xine.c:2099
+#: src/xine-engine/xine.c:2197
msgid "plugin"
msgstr ""
-#: src/xine-engine/xine.c:2100
+#: src/xine-engine/xine.c:2198
msgid "trace"
msgstr ""
@@ -5085,17 +5037,17 @@ msgstr ""
msgid "File is empty:"
msgstr ""
-#: src/xine-utils/memcpy.c:479
+#: src/xine-utils/memcpy.c:478
msgid "memcopy method used by xine"
msgstr ""
-#: src/xine-utils/memcpy.c:480
+#: src/xine-utils/memcpy.c:479
msgid ""
"The copying of large memory blocks is one of the most expensive operations "
"on todays computers. Therefore xine provides various tuned methods to do "
"this copying. Usually, the best method is detected automatically."
msgstr ""
-#: src/xine-utils/memcpy.c:507
+#: src/xine-utils/memcpy.c:506
msgid "Benchmarking memcpy methods (smaller is better):\n"
msgstr ""
diff --git a/src/audio_dec/xine_dts_decoder.c b/src/audio_dec/xine_dts_decoder.c
index 2b8dabd10..4f9171d6e 100644
--- a/src/audio_dec/xine_dts_decoder.c
+++ b/src/audio_dec/xine_dts_decoder.c
@@ -199,19 +199,27 @@ static void dts_decode_frame (dts_decoder_t *this, const int64_t pts, const int
audio_buffer->num_frames = this->ac5_pcm_length;
- data_out[0] = 0x72; data_out[1] = 0xf8; /* spdif syncword */
- data_out[2] = 0x1f; data_out[3] = 0x4e; /* .............. */
- data_out[4] = ac5_spdif_type; /* DTS data */
- data_out[5] = 0; /* Unknown */
- data_out[6] = (this->ac5_length << 3) & 0xff; /* ac5_length * 8 */
- data_out[7] = ((this->ac5_length ) >> 5) & 0xff;
-
- if( this->ac5_pcm_length ) {
- if( this->ac5_pcm_length % 2) {
- swab(data_in, &data_out[8], this->ac5_length );
- } else {
- swab(data_in, &data_out[8], this->ac5_length + 1);
+ // Checking if AC5 data plus IEC958 header will fit into frames samples data
+ if ( this->ac5_length + 8 <= this->ac5_pcm_length * 2 * 2 ) {
+ data_out[0] = 0x72; data_out[1] = 0xf8; /* spdif syncword */
+ data_out[2] = 0x1f; data_out[3] = 0x4e; /* .............. */
+ data_out[4] = ac5_spdif_type; /* DTS data */
+ data_out[5] = 0; /* Unknown */
+ data_out[6] = (this->ac5_length << 3) & 0xff; /* ac5_length * 8 */
+ data_out[7] = ((this->ac5_length ) >> 5) & 0xff;
+
+ if( this->ac5_pcm_length ) {
+ if( this->ac5_pcm_length % 2) {
+ swab(data_in, &data_out[8], this->ac5_length );
+ } else {
+ swab(data_in, &data_out[8], this->ac5_length + 1);
+ }
}
+ // Transmit it without header otherwise, receivers will autodetect DTS
+ } else {
+ lprintf("AC5 data is too large (%i > %i), sending without IEC958 header\n",
+ this->ac5_length + 8, this->ac5_pcm_length * 2 * 2);
+ memcpy(data_out, data_in, this->ac5_length);
}
} else {
/* Software decode */
diff --git a/src/audio_dec/xine_lpcm_decoder.c b/src/audio_dec/xine_lpcm_decoder.c
index e84b112f4..83043cec9 100644
--- a/src/audio_dec/xine_lpcm_decoder.c
+++ b/src/audio_dec/xine_lpcm_decoder.c
@@ -192,18 +192,34 @@ static void lpcm_decode_data (audio_decoder_t *this_gen, buf_element_t *buf) {
uint8_t *d = (uint8_t *)audio_buffer->mem;
int n = buf->size;
- while (n >= 0) {
+ while (n >= 3) {
if ( stream_be ) {
- *d++ = s[0];
- *d++ = s[1];
+ if ( stream_be == this->cpu_be ) {
+ *d++ = s[0];
+ *d++ = s[1];
+ } else {
+ *d++ = s[1];
+ *d++ = s[0];
+ }
} else {
- *d++ = s[1];
- *d++ = s[2];
+ if ( stream_be == this->cpu_be ) {
+ *d++ = s[1];
+ *d++ = s[2];
+ }
+ else
+ {
+ *d++ = s[2];
+ *d++ = s[1];
+ }
}
s += 3;
n -= 3;
}
+
+ if ( (d - (uint8_t*)audio_buffer->mem)/2*3 < buf->size )
+ xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG, "lpcm_decoder: lost %i bytes\n", (int)(buf->size - (d - (uint8_t*)audio_buffer->mem))/2*3);
+
} else {
memcpy (audio_buffer->mem, sample_buffer, buf->size);
}
diff --git a/src/audio_dec/xine_mad_decoder.c b/src/audio_dec/xine_mad_decoder.c
index 74c04924f..abad70f4f 100644
--- a/src/audio_dec/xine_mad_decoder.c
+++ b/src/audio_dec/xine_mad_decoder.c
@@ -393,7 +393,7 @@ static const uint32_t audio_types[] = {
static const decoder_info_t dec_info_audio = {
audio_types, /* supported types */
- 7 /* priority */
+ 8 /* priority */
};
const plugin_info_t xine_plugin_info[] EXPORTED = {
diff --git a/src/audio_out/audio_oss_out.c b/src/audio_out/audio_oss_out.c
index 7cae9b300..89d79fae9 100644
--- a/src/audio_out/audio_oss_out.c
+++ b/src/audio_out/audio_oss_out.c
@@ -405,6 +405,18 @@ static int ao_oss_delay(ao_driver_t *this_gen) {
if (bytes_left<=0) /* buffer ran dry */
bytes_left = 0;
break;
+ case OSS_SYNC_GETODELAY:
+#ifdef SNDCTL_DSP_GETODELAY
+ if (ioctl (this->audio_fd, SNDCTL_DSP_GETODELAY, &bytes_left)) {
+ perror ("audio_oss_out: DSP_GETODELAY ioctl():");
+ }
+ if (bytes_left<0)
+ bytes_left = 0;
+
+ lprintf ("%d bytes left\n", bytes_left);
+
+ break;
+#endif
case OSS_SYNC_GETOPTR:
if (ioctl (this->audio_fd, SNDCTL_DSP_GETOPTR, &info)) {
perror ("audio_oss_out: SNDCTL_DSP_GETOPTR failed:");
@@ -424,16 +436,6 @@ static int ao_oss_delay(ao_driver_t *this_gen) {
}
this->last_getoptr = info.bytes;
break;
- case OSS_SYNC_GETODELAY:
- if (ioctl (this->audio_fd, SNDCTL_DSP_GETODELAY, &bytes_left)) {
- perror ("audio_oss_out: DSP_GETODELAY ioctl():");
- }
- if (bytes_left<0)
- bytes_left = 0;
-
- lprintf ("%d bytes left\n", bytes_left);
-
- break;
}
return bytes_left / this->bytes_per_frame;
@@ -840,10 +842,13 @@ static ao_driver_t *open_plugin (audio_driver_class_t *class_gen, const void *da
* check if SNDCTL_DSP_GETODELAY works. if so, using it is preferred.
*/
+#ifdef SNDCTL_DSP_GETODELAY
if (ioctl(audio_fd, SNDCTL_DSP_GETODELAY, &info) != -1) {
xprintf(class->xine, XINE_VERBOSITY_DEBUG, "audio_oss_out: using SNDCTL_DSP_GETODELAY\n");
this->sync_method = OSS_SYNC_GETODELAY;
- } else if (ioctl(audio_fd, SNDCTL_DSP_GETOPTR, &info) != -1) {
+ } else
+#endif
+ if (ioctl(audio_fd, SNDCTL_DSP_GETOPTR, &info) != -1) {
xprintf(class->xine, XINE_VERBOSITY_DEBUG, "audio_oss_out: using SNDCTL_DSP_GETOPTR\n");
this->sync_method = OSS_SYNC_GETOPTR;
} else {
diff --git a/src/audio_out/audio_pulse_out.c b/src/audio_out/audio_pulse_out.c
index 0235a4321..9b811aaaf 100644
--- a/src/audio_out/audio_pulse_out.c
+++ b/src/audio_out/audio_pulse_out.c
@@ -1,28 +1,28 @@
-/*
- * Copyright (C) 2000-2007 the xine project
- *
+/* -*- Mode: C; c-basic-offset: 2; indent-tabs-mode: nil -*- */
+
+/*
+ * Copyright (C) 2000-2008 the xine project
+ *
* This file is part of xine, a free video player.
- *
+ *
* xine is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* xine is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
*
- * ao plugin for pulseaudio (rename of polypaudio):
+ * ao plugin for PulseAudio:
* http://0pointer.de/lennart/projects/pulsaudio/
*
- * originally written for polypaudio simple api. Lennart then suggested
- * using the async api for better control (such as volume), therefore, a lot
- * of this code comes from Lennart's patch to mplayer.
+ * Diego Petteno, Lennart Poettering
*/
#ifdef HAVE_CONFIG_H
@@ -48,15 +48,9 @@
#define GAP_TOLERANCE AO_MAX_GAP
-/* CHECKME: should this be conditional on autotools? */
-extern const char *__progname;
-
typedef struct {
audio_driver_class_t driver_class;
xine_t *xine;
-
- struct pa_context *context; /*< Pulseaudio connection context */
- struct pa_threaded_mainloop *mainloop; /*< Main event loop object */
} pulse_class_t;
typedef struct pulse_driver_s {
@@ -67,11 +61,13 @@ typedef struct pulse_driver_s {
char *host; /*< The host to connect to */
char *sink; /*< The sink to connect to */
- struct pa_stream *stream; /*< Pulseaudio playback stream object */
- pthread_mutex_t info_mutex; /**< Mutex for info callback signaling */
+ pa_threaded_mainloop *mainloop; /*< Main event loop object */
+ pa_context *context; /*< Pulseaudio connection context */
+ pa_stream *stream; /*< Pulseaudio playback stream object */
pa_volume_t swvolume;
+ int muted;
pa_cvolume cvolume;
int capabilities;
@@ -82,67 +78,117 @@ typedef struct pulse_driver_s {
uint32_t bits_per_sample;
uint32_t bytes_per_frame;
- uint32_t frames_written;
-
} pulse_driver_t;
/**
- * @brief Callback function called when a stream operation succeed
- * @param stream Stream which operation has succeeded
- * @param success The success value for the operation (ignored)
- * @param this_Gen pulse_driver_t pointer for the PulseAudio output
- * instance.
+ * @brief Callback function called when the state of the context is changed
+ * @param c Context which changed status
+ * @param this_gen pulse_class_t pointer for the PulseAudio output class
*/
-static void __xine_pa_stream_success_callback(pa_stream *const stream, const int success,
- void *const mutex_gen)
+static void __xine_pa_context_state_callback(pa_context *c, void *this_gen)
{
- pthread_mutex_t *const completion_mutex = (pthread_mutex_t*)mutex_gen;
+ pulse_driver_t * this = (pulse_driver_t*) this_gen;
+
+ switch (pa_context_get_state(c)) {
+
+ case PA_CONTEXT_READY:
+ case PA_CONTEXT_TERMINATED:
+ case PA_CONTEXT_FAILED:
+ pa_threaded_mainloop_signal(this->mainloop, 0);
+ break;
- pthread_mutex_unlock(completion_mutex);
+ case PA_CONTEXT_CONNECTING:
+ case PA_CONTEXT_UNCONNECTED:
+ case PA_CONTEXT_AUTHORIZING:
+ case PA_CONTEXT_SETTING_NAME:
+ break;
+ }
}
/**
- * @brief Callback function called when the state of the context is changed
- * @param ctx Context which operation has succeeded
+ * @brief Callback function called when the state of the stream is changed
+ * @param s Stream that changed status
* @param this_gen pulse_driver_t pointer for the PulseAudio output
* instance.
*/
-static void __xine_pa_context_status_callback(pa_context *const ctx, void *const this_gen)
+static void __xine_pa_stream_state_callback(pa_stream *s, void *this_gen)
{
- pulse_driver_t *const this = (pulse_driver_t*)this_gen;
-
- switch (pa_context_get_state(ctx)) {
- case PA_CONTEXT_READY:
- case PA_CONTEXT_TERMINATED:
- case PA_CONTEXT_FAILED:
- pa_threaded_mainloop_signal(this->pa_class->mainloop, 0);
- break;
-
- case PA_CONTEXT_CONNECTING:
- case PA_CONTEXT_UNCONNECTED:
- case PA_CONTEXT_AUTHORIZING:
- case PA_CONTEXT_SETTING_NAME:
- break;
+ pulse_driver_t * this = (pulse_driver_t*) this_gen;
+
+ switch (pa_stream_get_state(s)) {
+
+ case PA_STREAM_READY:
+ case PA_STREAM_TERMINATED:
+ case PA_STREAM_FAILED:
+ pa_threaded_mainloop_signal(this->mainloop, 0);
+ break;
+
+ case PA_STREAM_UNCONNECTED:
+ case PA_STREAM_CREATING:
+ break;
}
}
/**
- * @brief Callback function called when a context operation succeed
+ * @brief Callback function called when PA asks for more audio data.
+ * @param s Stream on which data is requested
+ * @param nbytes the number of bytes PA requested
+ * @param this_gen pulse_driver_t pointer for the PulseAudio output
+ * instance.
+ */
+static void __xine_pa_stream_request_callback(pa_stream *s, size_t nbytes, void *this_gen)
+{
+ pulse_driver_t * this = (pulse_driver_t*) this_gen;
+
+ pa_threaded_mainloop_signal(this->mainloop, 0);
+}
+
+/**
+ * @brief Callback function called when PA notifies about something
+ * @param s Stream on which the notification happened
+ * @param this_gen pulse_driver_t pointer for the PulseAudio output
+ * instance.
+ */
+static void __xine_pa_stream_notify_callback(pa_stream *s, void *this_gen)
+{
+ pulse_driver_t * this = (pulse_driver_t*) this_gen;
+
+ pa_threaded_mainloop_signal(this->mainloop, 0);
+}
+
+/**
+ * @brief Callback function called when PA completed an operation
* @param ctx Context which operation has succeeded
- * @param success The success value for the operation (ignored)
+ * @param nbytes the number of bytes PA requested
* @param this_gen pulse_driver_t pointer for the PulseAudio output
* instance.
*/
-static void __xine_pa_context_success_callback(pa_context *const ctx, const int success,
- void *const this_gen)
+static void __xine_pa_stream_success_callback(pa_stream *s, int success, void *this_gen)
{
- pulse_driver_t *const this = (pulse_driver_t*)this_gen;
+ pulse_driver_t * this = (pulse_driver_t*) this_gen;
- _x_assert(ctx); _x_assert(this);
- _x_assert(ctx == this->pa_class->context);
+ if (!success)
+ xprintf (this->xine, XINE_VERBOSITY_DEBUG, "audio_pulse_out: stream operation failed: %s\n", pa_strerror(pa_context_errno(this->context)));
- pa_threaded_mainloop_signal(this->pa_class->mainloop, 0);
+ pa_threaded_mainloop_signal(this->mainloop, 0);
+}
+
+/**
+ * @brief Callback function called when PA completed an operation
+ * @param c Context on which operation has succeeded
+ * @param nbytes the number of bytes PA requested
+ * @param this_gen pulse_driver_t pointer for the PulseAudio output
+ * instance.
+ */
+static void __xine_pa_context_success_callback(pa_context *c, int success, void *this_gen)
+{
+ pulse_driver_t *this = (pulse_driver_t*) this_gen;
+
+ if (!success)
+ xprintf (this->xine, XINE_VERBOSITY_DEBUG, "audio_pulse_out: context operation failed: %s\n", pa_strerror(pa_context_errno(this->context)));
+
+ pa_threaded_mainloop_signal(this->mainloop, 0);
}
/**
@@ -156,14 +202,14 @@ static void __xine_pa_context_success_callback(pa_context *const ctx, const int
* This function saves the volume field of the passed structure to the
* @c cvolume variable of the output instance.
*/
-static void __xine_pa_sink_info_callback(pa_context *const ctx, const pa_sink_input_info *const info,
- const int is_last, void *const userdata) {
+static void __xine_pa_sink_info_callback(pa_context *c, const pa_sink_input_info *info,
+ int is_last, void *userdata) {
pulse_driver_t *const this = (pulse_driver_t *) userdata;
if (is_last < 0) {
xprintf (this->xine, XINE_VERBOSITY_DEBUG, "audio_pulse_out: Failed to get sink input info: %s\n",
- pa_strerror(pa_context_errno(this->pa_class->context)));
+ pa_strerror(pa_context_errno(this->context)));
return;
}
@@ -171,36 +217,90 @@ static void __xine_pa_sink_info_callback(pa_context *const ctx, const pa_sink_in
return;
this->cvolume = info->volume;
+ this->swvolume = pa_sw_volume_to_linear(pa_cvolume_avg(&info->volume));
+ this->muted = info->mute;
+}
+
+static int connect_context(pulse_driver_t *this) {
+
+ if (this->context && (pa_context_get_state(this->context) == PA_CONTEXT_FAILED ||
+ pa_context_get_state(this->context) == PA_CONTEXT_TERMINATED)) {
+ pa_context_unref(this->context);
+ this->context = NULL;
+ }
+
+ if (!this->context) {
+ char fn[PATH_MAX], *p;
+
+ if (pa_get_binary_name(fn, sizeof(fn)))
+ p = pa_path_get_filename(fn);
+ else
+ p = "Xine";
+
+ this->context = pa_context_new(pa_threaded_mainloop_get_api(this->mainloop), p);
+ _x_assert(this->context);
+
+ pa_context_set_state_callback(this->context, __xine_pa_context_state_callback, this);
+ }
+
+ if (pa_context_get_state(this->context) == PA_CONTEXT_UNCONNECTED) {
+
+ if (pa_context_connect(this->context, this->host, 0, NULL) < 0) {
+ xprintf (this->xine, XINE_VERBOSITY_DEBUG, "audio_pulse_out: failed to connect context object %s\n", pa_strerror(pa_context_errno(this->context)));
+ return -1;
+ }
+ }
+
+ for (;;) {
+ pa_context_state_t state = pa_context_get_state(this->context);
+
+ if (state == PA_CONTEXT_FAILED || state == PA_CONTEXT_TERMINATED) {
+ xprintf (this->xine, XINE_VERBOSITY_DEBUG, "audio_pulse_out: failed to connect context object: %s\n", pa_strerror(pa_context_errno(this->context)));
+ return -1;
+ }
+
+ if (state == PA_CONTEXT_READY)
+ break;
+
+ pa_threaded_mainloop_wait(this->mainloop);
+ }
- pthread_mutex_unlock(&this->info_mutex);
+ return 0;
}
/*
* open the audio device for writing to
*/
static int ao_pulse_open(ao_driver_t *this_gen,
- uint32_t bits, uint32_t rate, int mode)
+ uint32_t bits, uint32_t rate, int mode)
{
pulse_driver_t *this = (pulse_driver_t *) this_gen;
- struct pa_sample_spec ss;
- struct pa_buffer_attr a;
- pa_stream_state_t streamstate;
+ pa_sample_spec ss;
+ pa_channel_map cm;
+ int r;
xprintf (this->xine, XINE_VERBOSITY_DEBUG,
- "audio_pulse_out: ao_open bits=%d rate=%d, mode=%d\n", bits, rate, mode);
+ "audio_pulse_out: ao_open bits=%d rate=%d, mode=%d\n", bits, rate, mode);
if ( (mode & this->capabilities) == 0 ) {
xprintf (this->xine, XINE_VERBOSITY_DEBUG, "audio_pulse_out: unsupported mode %08x\n", mode);
return 0;
}
+ pa_threaded_mainloop_lock(this->mainloop);
+
if (this->stream) {
- if ( mode == this->mode && rate == this->sample_rate &&
- bits == this->bits_per_sample )
+ if (mode == this->mode && rate == this->sample_rate &&
+ bits == this->bits_per_sample) {
+
+ pa_threaded_mainloop_unlock(this->mainloop);
return this->sample_rate;
+ }
- this_gen->close(this_gen);
+ pa_stream_disconnect(this->stream);
+ pa_stream_unref(this->stream);
+ this->stream = NULL;
}
this->mode = mode;
@@ -221,6 +321,8 @@ static int ao_pulse_open(ao_driver_t *this_gen,
case 32:
ss.format = PA_SAMPLE_FLOAT32NE;
break;
+ default:
+ _x_assert(!"Should not be reached");
}
if (!pa_sample_spec_valid(&ss)) {
@@ -228,70 +330,86 @@ static int ao_pulse_open(ao_driver_t *this_gen,
goto fail;
}
- if ( this->pa_class->context && pa_context_get_state(this->pa_class->context) > PA_CONTEXT_READY ) {
- pa_context_unref(this->pa_class->context);
- this->pa_class->context = NULL;
- }
-
- if ( this->pa_class->context == NULL ) {
- this->pa_class->context = pa_context_new(pa_threaded_mainloop_get_api(this->pa_class->mainloop),
- __progname);
- }
+ cm.channels = ss.channels;
- pa_context_ref(this->pa_class->context);
-
- if ( pa_context_get_state(this->pa_class->context) == PA_CONTEXT_UNCONNECTED ) {
- int ret;
+ switch (mode) {
+ case AO_CAP_MODE_MONO:
+ cm.map[0] = PA_CHANNEL_POSITION_MONO;
+ _x_assert(cm.channels == 1);
+ break;
- pa_threaded_mainloop_lock(this->pa_class->mainloop);
- ret = pa_context_connect(this->pa_class->context, this->host, 1, NULL);
- if ( ret < 0 )
- goto fail_unlock;
+ case AO_CAP_MODE_STEREO:
+ cm.map[0] = PA_CHANNEL_POSITION_FRONT_LEFT;
+ cm.map[1] = PA_CHANNEL_POSITION_FRONT_RIGHT;
+ _x_assert(cm.channels == 2);
+ break;
- pa_context_set_state_callback(this->pa_class->context, __xine_pa_context_status_callback, this);
+ case AO_CAP_MODE_4CHANNEL:
+ cm.map[0] = PA_CHANNEL_POSITION_FRONT_LEFT;
+ cm.map[1] = PA_CHANNEL_POSITION_FRONT_RIGHT;
+ cm.map[2] = PA_CHANNEL_POSITION_REAR_LEFT;
+ cm.map[3] = PA_CHANNEL_POSITION_REAR_RIGHT;
+ _x_assert(cm.channels == 4);
+ break;
- pa_threaded_mainloop_wait(this->pa_class->mainloop);
- pa_threaded_mainloop_unlock(this->pa_class->mainloop);
+ case AO_CAP_MODE_4_1CHANNEL:
+ case AO_CAP_MODE_5CHANNEL:
+ case AO_CAP_MODE_5_1CHANNEL:
+ cm.map[0] = PA_CHANNEL_POSITION_FRONT_LEFT;
+ cm.map[1] = PA_CHANNEL_POSITION_FRONT_RIGHT;
+ cm.map[2] = PA_CHANNEL_POSITION_REAR_LEFT;
+ cm.map[3] = PA_CHANNEL_POSITION_REAR_RIGHT;
+ cm.map[4] = PA_CHANNEL_POSITION_FRONT_CENTER;
+ cm.map[5] = PA_CHANNEL_POSITION_LFE;
+ cm.channels = 6;
+ break;
+ default:
+ _x_assert(!"Should not be reached");
}
- if (pa_context_get_state(this->pa_class->context) != PA_CONTEXT_READY) {
- xprintf (this->xine, XINE_VERBOSITY_DEBUG, "audio_pulse_out: Failed to connect to server: %s\n",
- pa_strerror(pa_context_errno(this->pa_class->context)));
+ if (!pa_channel_map_valid(&cm)) {
+ xprintf (this->xine, XINE_VERBOSITY_DEBUG, "audio_pulse_out: Invalid channel map\n");
goto fail;
}
- this->stream = pa_stream_new(this->pa_class->context, "audio stream", &ss, NULL);
+ if (connect_context(this) < 0)
+ goto fail;
+
+ _x_assert(!this->stream);
+ this->stream = pa_stream_new(this->context, "Audio Stream", &ss, &cm);
_x_assert(this->stream);
- a.maxlength = pa_bytes_per_second(&ss)*1;
- a.tlength = a.maxlength*9/10;
- a.prebuf = a.tlength/2;
- a.minreq = a.tlength/10;
+ pa_stream_set_state_callback(this->stream, __xine_pa_stream_state_callback, this);
+ pa_stream_set_write_callback(this->stream, __xine_pa_stream_request_callback, this);
+ pa_stream_set_latency_update_callback(this->stream, __xine_pa_stream_notify_callback, this);
- pa_stream_connect_playback(this->stream, this->sink, &a,
- PA_STREAM_INTERPOLATE_TIMING|PA_STREAM_AUTO_TIMING_UPDATE,
+ r = pa_stream_connect_playback(this->stream, this->sink, NULL,
+ PA_STREAM_INTERPOLATE_TIMING|PA_STREAM_AUTO_TIMING_UPDATE,
NULL, NULL);
- do {
- xine_usec_sleep (100);
+ for (;;) {
+ pa_context_state_t cstate = pa_context_get_state(this->context);
+ pa_stream_state_t sstate = pa_stream_get_state(this->stream);
- streamstate = pa_stream_get_state(this->stream);
- } while (streamstate < PA_STREAM_READY);
-
- if (streamstate != PA_STREAM_READY) {
- xprintf (this->xine, XINE_VERBOSITY_LOG, "audio_pulse_out: Failed to connect to server: %s\n",
- pa_strerror(pa_context_errno(this->pa_class->context)));
- goto fail;
+ if (cstate == PA_CONTEXT_FAILED || cstate == PA_CONTEXT_TERMINATED ||
+ sstate == PA_STREAM_FAILED || sstate == PA_STREAM_TERMINATED) {
+ xprintf (this->xine, XINE_VERBOSITY_DEBUG, "audio_pulse_out: failed to connect context object: %s\n", pa_strerror(pa_context_errno(this->context)));
+ goto fail;
+ }
+
+ if (sstate == PA_STREAM_READY)
+ break;
+
+ pa_threaded_mainloop_wait(this->mainloop);
}
- this->frames_written = 0;
- this->ao_driver.set_property(this, AO_PROP_PCM_VOL, 100);
+ pa_threaded_mainloop_unlock(this->mainloop);
return this->sample_rate;
- fail_unlock:
- pa_threaded_mainloop_unlock(this->pa_class->mainloop);
fail:
+
+ pa_threaded_mainloop_unlock(this->mainloop);
this_gen->close(this_gen);
return 0;
}
@@ -319,217 +437,348 @@ static int ao_pulse_write(ao_driver_t *this_gen, int16_t *data,
{
pulse_driver_t *this = (pulse_driver_t *) this_gen;
size_t size = num_frames * this->bytes_per_frame;
- int ret = 0;
-
- if ( !this->stream || !this->pa_class->context)
- return -1;
+ int ret = -1;
+ size_t done = 0;
- switch( pa_stream_get_state(this->stream) ) {
- case PA_STREAM_READY:
- while (size > 0) {
- size_t l;
+ pa_threaded_mainloop_lock(this->mainloop);
- while (!(l = pa_stream_writable_size(this->stream))) {
- xine_usec_sleep (10000);
- }
+ while (size > 0) {
+ size_t l;
- if (l > size)
- l = size;
-
- pa_stream_write(this->stream, data, l, NULL, 0, PA_SEEK_RELATIVE);
- data = (int16_t *) ((uint8_t*) data + l);
- size -= l;
- }
+ for (;;) {
+
+ if (!this->stream ||
+ !this->context ||
+ pa_context_get_state(this->context) != PA_CONTEXT_READY ||
+ pa_stream_get_state(this->stream) != PA_STREAM_READY)
+ goto finish;
- this->frames_written += num_frames;
+ if ((l = pa_stream_writable_size(this->stream)) == (size_t) -1)
+ goto finish;
- if (pa_stream_get_state(this->stream) == PA_STREAM_READY)
- ret = 1;
+ if (l > 0)
+ break;
- break;
+ pa_threaded_mainloop_wait(this->mainloop);
+ }
+
+ if (l > size)
+ l = size;
+
+ pa_stream_write(this->stream, data, l, NULL, 0, PA_SEEK_RELATIVE);
+ data = (int16_t *) ((uint8_t*) data + l);
+ size -= l;
+ done += l;
}
+ ret = done;
+
+finish:
+
+ pa_threaded_mainloop_unlock(this->mainloop);
+
+/* fprintf(stderr, "write-out\n"); */
+
return ret;
-}
+}
static int ao_pulse_delay (ao_driver_t *this_gen)
{
pulse_driver_t *this = (pulse_driver_t *) this_gen;
- pa_usec_t latency = 0;
- unsigned int delay_frames;
+ int ret = 0;
- if ( ! this->stream ) return this->frames_written;
+/* fprintf(stderr, "delay-in\n"); */
- if (pa_stream_get_latency(this->stream, &latency, NULL) < 0) {
- pa_context_unref(this->pa_class->context);
- this->pa_class->context = NULL;
+ pa_threaded_mainloop_lock(this->mainloop);
- pa_stream_disconnect(this->stream);
- pa_stream_unref(this->stream);
- this->stream = NULL;
+ for (;;) {
+ pa_usec_t latency = 0;
- return 0;
+ if (!this->stream ||
+ !this->context ||
+ pa_context_get_state(this->context) != PA_CONTEXT_READY ||
+ pa_stream_get_state(this->stream) != PA_STREAM_READY)
+ goto finish;
+
+ if (pa_stream_get_latency(this->stream, &latency, NULL) >= 0) {
+ ret = (int) ((latency * this->sample_rate) / 1000000);
+ goto finish;
+ }
+
+ if (pa_context_errno(this->context) != PA_ERR_NODATA) {
+ xprintf (this->xine, XINE_VERBOSITY_DEBUG, "audio_pulse_out: failed to query latency: %s\n", pa_strerror(pa_context_errno(this->context)));
+ goto finish;
+ }
+
+ pa_threaded_mainloop_wait(this->mainloop);
}
- /* convert latency (us) to frame units. */
- delay_frames = (int)(latency * this->sample_rate / 1000000);
+finish:
+
+ pa_threaded_mainloop_unlock(this->mainloop);
- if( delay_frames > this->frames_written )
- return this->frames_written;
- else
- return delay_frames;
+ return ret;
}
static void ao_pulse_close(ao_driver_t *this_gen)
{
pulse_driver_t *this = (pulse_driver_t *) this_gen;
-
- if (this->stream) {
- if (pa_stream_get_state(this->stream) == PA_STREAM_READY) {
- pthread_mutex_t completion_callback = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&completion_callback);
- pa_stream_drain(this->stream, __xine_pa_stream_success_callback, &completion_callback);
- pthread_mutex_lock(&completion_callback);
- pthread_mutex_destroy(&completion_callback);
- }
+ pa_threaded_mainloop_lock(this->mainloop);
+ if (this->stream) {
pa_stream_disconnect(this->stream);
pa_stream_unref(this->stream);
this->stream = NULL;
-
- pa_context_unref(this->pa_class->context);
}
+
+ pa_threaded_mainloop_unlock(this->mainloop);
}
static uint32_t ao_pulse_get_capabilities (ao_driver_t *this_gen) {
pulse_driver_t *this = (pulse_driver_t *) this_gen;
+
return this->capabilities;
}
-static void ao_pulse_exit(ao_driver_t *this_gen)
-{
+static void ao_pulse_exit(ao_driver_t *this_gen) {
pulse_driver_t *this = (pulse_driver_t *) this_gen;
- free (this);
+ ao_pulse_close(this_gen);
+
+ pa_threaded_mainloop_lock(this->mainloop);
+
+ if (this->context) {
+ pa_context_disconnect(this->context);
+ pa_context_unref(this->context);
+ }
+
+ pa_threaded_mainloop_unlock(this->mainloop);
+
+ pa_threaded_mainloop_free(this->mainloop);
+
+ free(this->host);
+ free(this->sink);
+ free(this);
+}
+
+static int wait_for_operation(pulse_driver_t *this, pa_operation *o) {
+
+ for (;;) {
+
+ if (!this->stream ||
+ !this->context ||
+ pa_context_get_state(this->context) != PA_CONTEXT_READY ||
+ pa_stream_get_state(this->stream) != PA_STREAM_READY)
+ return -1;
+
+ if (pa_operation_get_state(o) != PA_OPERATION_RUNNING)
+ return 0;
+
+ pa_threaded_mainloop_wait(this->mainloop);
+ }
}
static int ao_pulse_get_property (ao_driver_t *this_gen, int property) {
pulse_driver_t *this = (pulse_driver_t *) this_gen;
int result = 0;
+ pa_operation *o = NULL;
- if ( ! this->stream || ! this->pa_class->context )
+ pa_threaded_mainloop_lock(this->mainloop);
+
+ if (!this->stream ||
+ !this->context ||
+ pa_context_get_state(this->context) != PA_CONTEXT_READY ||
+ pa_stream_get_state(this->stream) != PA_STREAM_READY) {
+ pa_threaded_mainloop_unlock(this->mainloop);
return 0;
+ }
switch(property) {
- case AO_PROP_PCM_VOL:
- case AO_PROP_MIXER_VOL:
- {
- pthread_mutex_lock(&this->info_mutex);
- pa_operation *o = pa_context_get_sink_input_info(this->pa_class->context,
- pa_stream_get_index(this->stream),
- __xine_pa_sink_info_callback, this);
- if ( ! o ) return 0;
- pthread_mutex_lock(&this->info_mutex); pthread_mutex_unlock(&this->info_mutex);
-
- result = (pa_sw_volume_to_linear(this->swvolume)*100);
- }
- break;
- case AO_PROP_MUTE_VOL:
- result = pa_cvolume_is_muted(&this->cvolume);
- break;
+ case AO_PROP_MUTE_VOL:
+ case AO_PROP_PCM_VOL:
+ case AO_PROP_MIXER_VOL:
+
+ o = pa_context_get_sink_input_info(this->context, pa_stream_get_index(this->stream),
+ __xine_pa_sink_info_callback, this);
+
+ break;
+ }
+
+ if (o) {
+ wait_for_operation(this, o);
+ pa_operation_unref(o);
}
-
+
+ switch(property) {
+
+ case AO_PROP_MUTE_VOL:
+ result = this->muted;
+ break;
+
+ case AO_PROP_PCM_VOL:
+ case AO_PROP_MIXER_VOL:
+ result = (int) (pa_sw_volume_to_linear(this->swvolume)*100);
+ break;
+ }
+
+ pa_threaded_mainloop_unlock(this->mainloop);
+
return result;
}
static int ao_pulse_set_property (ao_driver_t *this_gen, int property, int value) {
pulse_driver_t *this = (pulse_driver_t *) this_gen;
int result = ~value;
+ pa_operation *o = NULL;
- if ( ! this->stream || ! this->pa_class->context )
- return result;
+ pa_threaded_mainloop_lock(this->mainloop);
+
+ if (!this->stream ||
+ !this->context ||
+ pa_context_get_state(this->context) != PA_CONTEXT_READY ||
+ pa_stream_get_state(this->stream) != PA_STREAM_READY) {
+ pa_threaded_mainloop_unlock(this->mainloop);
+ return 0;
+ }
switch(property) {
- case AO_PROP_PCM_VOL:
- case AO_PROP_MIXER_VOL:
- this->swvolume = pa_sw_volume_from_linear((double)value/100.0);
- pa_cvolume_set(&this->cvolume, pa_stream_get_sample_spec(this->stream)->channels, this->swvolume);
+ case AO_PROP_PCM_VOL:
+ case AO_PROP_MIXER_VOL:
- pa_context_set_sink_input_volume(this->pa_class->context, pa_stream_get_index(this->stream),
- &this->cvolume, __xine_pa_context_success_callback, this);
+ this->swvolume = pa_sw_volume_from_linear((double)value/100.0);
+ pa_cvolume_set(&this->cvolume, pa_stream_get_sample_spec(this->stream)->channels, this->swvolume);
- result = value;
- break;
+ o = pa_context_set_sink_input_volume(this->context, pa_stream_get_index(this->stream),
+ &this->cvolume, __xine_pa_context_success_callback, this);
- case AO_PROP_MUTE_VOL:
- if ( value )
- pa_cvolume_mute(&this->cvolume, pa_stream_get_sample_spec(this->stream)->channels);
- else
- pa_cvolume_set(&this->cvolume, pa_stream_get_sample_spec(this->stream)->channels, this->swvolume);
+ result = value;
+ break;
+
+ case AO_PROP_MUTE_VOL:
- pa_context_set_sink_input_volume(this->pa_class->context, pa_stream_get_index(this->stream),
- &this->cvolume, __xine_pa_context_success_callback, this);
-
- result = value;
- break;
+ this->muted = value;
+
+ o = pa_context_set_sink_input_mute(this->context, pa_stream_get_index(this->stream),
+ value, __xine_pa_context_success_callback, this);
+
+ result = value;
+ }
+
+ if (o) {
+ wait_for_operation(this, o);
+ pa_operation_unref(o);
}
-
+
+ pa_threaded_mainloop_unlock(this->mainloop);
+
return result;
}
static int ao_pulse_ctrl(ao_driver_t *this_gen, int cmd, ...) {
pulse_driver_t *this = (pulse_driver_t *) this_gen;
+ pa_operation *o = NULL;
+
+ pa_threaded_mainloop_lock(this->mainloop);
- if ( ! this->stream ) return 0;
+ if (!this->stream ||
+ !this->context ||
+ pa_context_get_state(this->context) != PA_CONTEXT_READY ||
+ pa_stream_get_state(this->stream) != PA_STREAM_READY) {
+ pa_threaded_mainloop_unlock(this->mainloop);
+ return 0;
+ }
switch (cmd) {
- case AO_CTRL_FLUSH_BUFFERS:
- _x_assert(this->stream && this->pa_class->context);
+ case AO_CTRL_FLUSH_BUFFERS:
- if(pa_stream_get_state(this->stream) == PA_STREAM_READY) {
- pthread_mutex_t completion_callback = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&completion_callback);
- pa_stream_flush(this->stream, __xine_pa_stream_success_callback, &completion_callback);
+ o = pa_stream_flush(this->stream, __xine_pa_stream_success_callback, this);
+ break;
- pthread_mutex_lock(&completion_callback);
- pthread_mutex_destroy(&completion_callback);
- }
+ case AO_CTRL_PLAY_RESUME:
+ case AO_CTRL_PLAY_PAUSE:
- this->frames_written = 0;
+ o = pa_stream_cork(this->stream, cmd == AO_CTRL_PLAY_PAUSE, __xine_pa_stream_success_callback, this);
+ break;
+ }
- break;
+ if (o) {
+ wait_for_operation(this, o);
+ pa_operation_unref(o);
}
+ pa_threaded_mainloop_unlock(this->mainloop);
+
return 0;
}
static ao_driver_t *open_plugin (audio_driver_class_t *class_gen, const void *data) {
pulse_class_t *class = (pulse_class_t *) class_gen;
pulse_driver_t *this;
- char *device;
+ const char* device;
+ int r;
lprintf ("audio_pulse_out: open_plugin called\n");
this = (pulse_driver_t *) xine_xmalloc (sizeof (pulse_driver_t));
if (!this)
return NULL;
+
this->xine = class->xine;
+ this->host = NULL;
+ this->sink = NULL;
+ this->context = NULL;
+ this->mainloop = NULL;
+
+ device = class->xine->config->register_string(class->xine->config,
+ "audio.pulseaudio_device",
+ "",
+ _("device used for pulseaudio"),
+ _("use 'server[:sink]' for setting the "
+ "pulseaudio sink device."),
+ 10, NULL,
+ NULL);
+
+ if (device && *device) {
+ char *sep = strrchr(device, ':');
+ if ( sep ) {
+ if (!(this->host = strndup(device, sep-device))) {
+ free(this);
+ return NULL;
+ }
+
+ if (!(this->sink = strdup(sep+1))) {
+ free(this->host);
+ free(this);
+ return NULL;
+ }
+ } else {
+
+ if (!(this->host = strdup(device))) {
+ free(this);
+ return NULL;
+ }
+ }
+ }
+
+ this->mainloop = pa_threaded_mainloop_new();
+ _x_assert(this->mainloop);
+ pa_threaded_mainloop_start(this->mainloop);
/*
* set capabilities
*/
- this->capabilities = AO_CAP_MODE_MONO | AO_CAP_MODE_STEREO | AO_CAP_MODE_4CHANNEL |
- AO_CAP_MODE_4_1CHANNEL | AO_CAP_MODE_5CHANNEL |
- AO_CAP_MODE_5_1CHANNEL | AO_CAP_MIXER_VOL |
- AO_CAP_PCM_VOL | AO_CAP_MUTE_VOL | AO_CAP_8BITS |
- AO_CAP_16BITS | AO_CAP_FLOAT32;
+ this->capabilities =
+ AO_CAP_MODE_MONO | AO_CAP_MODE_STEREO | AO_CAP_MODE_4CHANNEL |
+ AO_CAP_MODE_4_1CHANNEL | AO_CAP_MODE_5CHANNEL | AO_CAP_MODE_5_1CHANNEL |
+ AO_CAP_MIXER_VOL | AO_CAP_PCM_VOL | AO_CAP_MUTE_VOL |
+ AO_CAP_8BITS | AO_CAP_16BITS | AO_CAP_FLOAT32;
this->sample_rate = 0;
- this->host = NULL;
- this->sink = NULL;
-
+
this->ao_driver.get_capabilities = ao_pulse_get_capabilities;
this->ao_driver.get_property = ao_pulse_get_property;
this->ao_driver.set_property = ao_pulse_set_property;
@@ -541,33 +790,22 @@ static ao_driver_t *open_plugin (audio_driver_class_t *class_gen, const void *da
this->ao_driver.close = ao_pulse_close;
this->ao_driver.exit = ao_pulse_exit;
this->ao_driver.get_gap_tolerance = ao_pulse_get_gap_tolerance;
- this->ao_driver.control = ao_pulse_ctrl;
-
- device = this->xine->config->register_string(this->xine->config,
- "audio.pulseaudio_device",
- "",
- _("device used for pulseaudio"),
- _("use 'server[:sink]' for setting the "
- "pulseaudio sink device."),
- 10, NULL,
- NULL);
-
- if (device && *device) {
- char *sep = strchr(device, ':');
- if ( sep ) {
- this->host = strndup(device, sep-device);
- this->sink = strdup(&sep[1]);
- } else
- this->host = strdup(device);
- }
-
- pthread_mutex_init(&this->info_mutex, NULL);
+ this->ao_driver.control = ao_pulse_ctrl;
xprintf (class->xine, XINE_VERBOSITY_DEBUG, "audio_pulse_out: host %s sink %s\n",
this->host ? this->host : "(null)", this->sink ? this->sink : "(null)");
this->pa_class = class;
+ pa_threaded_mainloop_lock(this->mainloop);
+ r = connect_context(this);
+ pa_threaded_mainloop_unlock(this->mainloop);
+
+ if (r < 0) {
+ ao_pulse_exit((ao_driver_t *) this);
+ return NULL;
+ }
+
return &this->ao_driver;
}
@@ -579,13 +817,7 @@ static void dispose_class (audio_driver_class_t *this_gen) {
pulse_class_t *this = (pulse_class_t *) this_gen;
- if ( this->context )
- pa_context_unref(this->context);
-
- pa_threaded_mainloop_stop(this->mainloop);
- pa_threaded_mainloop_free(this->mainloop);
-
- free (this);
+ free(this);
}
static void *init_class (xine_t *xine, void *data) {
@@ -598,25 +830,17 @@ static void *init_class (xine_t *xine, void *data) {
if (!this)
return NULL;
+ this->xine = xine;
this->driver_class.open_plugin = open_plugin;
this->driver_class.dispose = dispose_class;
this->driver_class.identifier = "pulseaudio";
this->driver_class.description = N_("xine audio output plugin using pulseaudio sound server");
- this->xine = xine;
-
- this->mainloop = pa_threaded_mainloop_new();
- _x_assert(this->mainloop);
-
- pa_threaded_mainloop_start(this->mainloop);
-
- this->context = NULL;
-
return this;
}
static const ao_info_t ao_info_pulse = {
- 6
+ 12
};
/*
@@ -628,5 +852,3 @@ const plugin_info_t xine_plugin_info[] EXPORTED = {
{ PLUGIN_AUDIO_OUT, 9, "pulseaudio", XINE_VERSION_CODE, &ao_info_pulse, init_class },
{ PLUGIN_NONE, 0, "", 0, NULL, NULL }
};
-
-
diff --git a/src/combined/ffmpeg/ff_audio_decoder.c b/src/combined/ffmpeg/ff_audio_decoder.c
index b7f966325..27fe18d9c 100644
--- a/src/combined/ffmpeg/ff_audio_decoder.c
+++ b/src/combined/ffmpeg/ff_audio_decoder.c
@@ -78,6 +78,7 @@ static const ff_codec_t ff_audio_lookup[] = {
{BUF_AUDIO_14_4, CODEC_ID_RA_144, "Real 14.4 (ffmpeg)"},
{BUF_AUDIO_28_8, CODEC_ID_RA_288, "Real 28.8 (ffmpeg)"},
{BUF_AUDIO_MPEG, CODEC_ID_MP3, "MP3 (ffmpeg)"},
+ {BUF_AUDIO_MP3ADU, CODEC_ID_MP3ADU, "MPEG-3 adu (ffmpeg)"},
{BUF_AUDIO_MSADPCM, CODEC_ID_ADPCM_MS, "MS ADPCM (ffmpeg)"},
{BUF_AUDIO_QTIMAADPCM, CODEC_ID_ADPCM_IMA_QT, "QT IMA ADPCM (ffmpeg)"},
{BUF_AUDIO_MSIMAADPCM, CODEC_ID_ADPCM_IMA_WAV, "MS IMA ADPCM (ffmpeg)"},
@@ -198,8 +199,8 @@ static void ff_audio_decode_data (audio_decoder_t *this_gen, buf_element_t *buf)
this->audio_channels = this->buf[0x37];
/* this->audio_bits = buf->content[0x35] */
- this->context->block_align = _X_BE_16(&this->buf[0x2A]);
-
+ this->context->block_align = _X_BE_32(&this->buf[0x18]);
+
this->context->extradata_size = 5*sizeof(short);
this->context->extradata = xine_xmalloc(this->context->extradata_size);
@@ -210,7 +211,49 @@ static void ff_audio_decode_data (audio_decoder_t *this_gen, buf_element_t *buf)
ptr[2] = _X_BE_16(&this->buf[0x16]); /* subpacket flavour */
ptr[3] = _X_BE_32(&this->buf[0x18]); /* coded frame size */
ptr[4] = 0; /* codec's data length */
+
+ xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
+ "ffmpeg_audio_dec: 28_8 audio channels %d bits %d sample rate %d block align %d\n",
+ this->audio_channels, this->audio_bits, this->audio_sample_rate,
+ this->context->block_align);
break;
+ case BUF_AUDIO_COOK:
+ {
+ int version;
+ int data_len;
+ int extradata;
+
+ version = _X_BE_16 (this->buf+4);
+ if (version == 4) {
+ this->audio_sample_rate = _X_BE_16 (this->buf+48);
+ this->audio_bits = _X_BE_16 (this->buf+52);
+ this->audio_channels = _X_BE_16 (this->buf+54);
+ data_len = _X_BE_32 (this->buf+67);
+ extradata = 71;
+ } else {
+ this->audio_sample_rate = _X_BE_16 (this->buf+54);
+ this->audio_bits = _X_BE_16 (this->buf+58);
+ this->audio_channels = _X_BE_16 (this->buf+60);
+ data_len = _X_BE_32 (this->buf+74);
+ extradata = 78;
+ }
+ this->context->block_align = _X_BE_16 (this->buf+44);
+
+ xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
+ "ffmpeg_audio_dec: cook audio channels %d bits %d sample rate %d block align %d\n",
+ this->audio_channels, this->audio_bits, this->audio_sample_rate,
+ this->context->block_align);
+
+ if (extradata + data_len > this->size)
+ break; /* abort early - extradata length is bad */
+
+ this->context->extradata_size = data_len;
+ this->context->extradata = xine_xmalloc(this->context->extradata_size +
+ FF_INPUT_BUFFER_PADDING_SIZE);
+ xine_fast_memcpy (this->context->extradata, this->buf + extradata,
+ this->context->extradata_size);
+ break;
+ }
default:
xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
"ffmpeg_audio_dec: unknown header with buf type 0x%X\n", codec_type);
@@ -227,6 +270,7 @@ static void ff_audio_decode_data (audio_decoder_t *this_gen, buf_element_t *buf)
this->context->sample_rate = this->audio_sample_rate;
this->context->channels = this->audio_channels;
this->context->codec_id = this->codec->id;
+ this->context->codec_type = this->codec->type;
this->context->codec_tag = _x_stream_info_get(this->stream, XINE_STREAM_INFO_AUDIO_FOURCC);
this->size = 0;
@@ -266,7 +310,26 @@ static void ff_audio_decode_data (audio_decoder_t *this_gen, buf_element_t *buf)
this->decoder_ok = 1;
}
+ if( buf->decoder_flags & BUF_FLAG_PREVIEW )
+ return;
+
+ ff_audio_ensure_buffer_size(this, this->size + buf->size);
+ xine_fast_memcpy (&this->buf[this->size], buf->content, buf->size);
+ this->size += buf->size;
+
if (!this->output_open) {
+ if (!this->audio_bits || !this->audio_sample_rate || !this->audio_channels) {
+ avcodec_decode_audio (this->context,
+ (int16_t *)this->decode_buffer,
+ &decode_buffer_size,
+ &this->buf[0],
+ this->size);
+ this->audio_bits = this->context->bits_per_sample;
+ this->audio_sample_rate = this->context->sample_rate;
+ this->audio_channels = this->context->channels;
+ if (!this->audio_bits || !this->audio_sample_rate || !this->audio_channels)
+ return;
+ }
this->output_open = (this->stream->audio_out->open) (this->stream->audio_out,
this->stream, this->audio_bits, this->audio_sample_rate,
_x_ao_channels2mode(this->audio_channels));
@@ -276,13 +339,6 @@ static void ff_audio_decode_data (audio_decoder_t *this_gen, buf_element_t *buf)
if (!this->output_open)
return;
- if( buf->decoder_flags & BUF_FLAG_PREVIEW )
- return;
-
- ff_audio_ensure_buffer_size(this, this->size + buf->size);
- xine_fast_memcpy (&this->buf[this->size], buf->content, buf->size);
- this->size += buf->size;
-
if (buf->decoder_flags & BUF_FLAG_FRAME_END) { /* time to decode a frame */
offset = 0;
@@ -323,7 +379,7 @@ static void ff_audio_decode_data (audio_decoder_t *this_gen, buf_element_t *buf)
/* fill up this buffer */
xine_fast_memcpy(audio_buffer->mem, &this->decode_buffer[out],
- bytes_to_send);
+ bytes_to_send);
/* byte count / 2 (bytes / sample) / channels */
audio_buffer->num_frames = bytes_to_send / 2 / this->audio_channels;
@@ -354,7 +410,8 @@ static void ff_audio_reset (audio_decoder_t *this_gen) {
if( this->context && this->decoder_ok ) {
pthread_mutex_lock (&ffmpeg_lock);
avcodec_close (this->context);
- avcodec_open (this->context, this->codec);
+ if (avcodec_open (this->context, this->codec) < 0)
+ this->decoder_ok = 0;
pthread_mutex_unlock (&ffmpeg_lock);
}
}
@@ -468,5 +525,5 @@ static const uint32_t supported_audio_types[] = {
decoder_info_t dec_info_ffmpeg_audio = {
supported_audio_types, /* supported types */
- 6 /* priority */
+ 7 /* priority */
};
diff --git a/src/combined/ffmpeg/ff_video_decoder.c b/src/combined/ffmpeg/ff_video_decoder.c
index fcc6b9283..951e12deb 100644
--- a/src/combined/ffmpeg/ff_video_decoder.c
+++ b/src/combined/ffmpeg/ff_video_decoder.c
@@ -44,11 +44,7 @@
#include "ffmpeg_decoder.h"
#include "ff_mpeg_parser.h"
-#ifdef HAVE_FFMPEG_AVCODEC_H
-# include <postprocess.h>
-#else
-# include <libpostproc/postprocess.h>
-#endif
+#include <postprocess.h>
#define VIDEOBUFSIZE (128*1024)
#define SLICE_BUFFER_SIZE (1194*1024)
@@ -943,6 +939,26 @@ static void ff_handle_header_buffer (ff_video_decoder_t *this, buf_element_t *bu
this->context->slice_offset = xine_xmalloc(sizeof(int)*SLICE_OFFSET_SIZE);
this->slice_offset_size = SLICE_OFFSET_SIZE;
+ this->context->extradata_size = this->size - 26;
+ if (this->context->extradata_size < 8) {
+ this->context->extradata_size= 8;
+ this->context->extradata = malloc(this->context->extradata_size +
+ FF_INPUT_BUFFER_PADDING_SIZE);
+ ((uint32_t *)this->context->extradata)[0] = 0;
+ if (codec_type == BUF_VIDEO_RV10)
+ ((uint32_t *)this->context->extradata)[1] = 0x10000000;
+ else
+ ((uint32_t *)this->context->extradata)[1] = 0x10003001;
+ } else {
+ this->context->extradata = malloc(this->context->extradata_size +
+ FF_INPUT_BUFFER_PADDING_SIZE);
+ memcpy(this->context->extradata, this->buf + 26,
+ this->context->extradata_size);
+ }
+
+ xprintf(this->stream->xine, XINE_VERBOSITY_LOG,
+ "ffmpeg_video_dec: buf size %d\n", this->size);
+
lprintf("w=%d, h=%d\n", this->bih.biWidth, this->bih.biHeight);
break;
diff --git a/src/combined/ffmpeg/ffmpeg_decoder.h b/src/combined/ffmpeg/ffmpeg_decoder.h
index adf0908dd..bfe71a6b1 100644
--- a/src/combined/ffmpeg/ffmpeg_decoder.h
+++ b/src/combined/ffmpeg/ffmpeg_decoder.h
@@ -25,11 +25,7 @@
#include "config.h"
#endif
-#ifdef HAVE_FFMPEG_AVCODEC_H
-# include <avcodec.h>
-#else
-# include <libavcodec/avcodec.h>
-#endif
+#include <avcodec.h>
typedef struct ff_codec_s {
uint32_t type;
diff --git a/src/combined/wavpack_combined.c b/src/combined/wavpack_combined.c
index 8a4b488ae..ca54635e7 100644
--- a/src/combined/wavpack_combined.c
+++ b/src/combined/wavpack_combined.c
@@ -33,7 +33,7 @@ static const uint32_t audio_types[] = {
static const decoder_info_t decoder_info_wv = {
audio_types, /* supported types */
- 7 /* priority */
+ 8 /* priority */
};
const plugin_info_t xine_plugin_info[] EXPORTED = {
diff --git a/src/combined/wavpack_demuxer.c b/src/combined/wavpack_demuxer.c
index 403d136d1..e32c17e4e 100644
--- a/src/combined/wavpack_demuxer.c
+++ b/src/combined/wavpack_demuxer.c
@@ -368,8 +368,8 @@ void *demux_wv_init_plugin (xine_t *const xine, void *const data) {
this->demux_class.open_plugin = open_plugin;
this->demux_class.description = N_("Wavpack demux plugin");
this->demux_class.identifier = "Wavpack";
- this->demux_class.mimetypes = "audio/x-wavpack";
- this->demux_class.extensions = "wv";
+ this->demux_class.mimetypes = "audio/x-wavpack: wv,wvp: WavPack audio;";
+ this->demux_class.extensions = "wv wvp";
this->demux_class.dispose = default_demux_class_dispose;
return this;
diff --git a/src/combined/xine_ogg_demuxer.c b/src/combined/xine_ogg_demuxer.c
index 88fcea08a..52788612f 100644
--- a/src/combined/xine_ogg_demuxer.c
+++ b/src/combined/xine_ogg_demuxer.c
@@ -1208,7 +1208,7 @@ static void decode_theora_header (demux_ogg_t *this, const int stream_num, ogg_p
static void decode_flac_header (demux_ogg_t *this, const int stream_num, ogg_packet *op) {
xine_flac_metadata_header header;
- xine_flac_streaminfo_block streaminfo;
+ xine_flac_streaminfo_block streaminfo = {};
buf_element_t *buf;
xine_waveformatex wave;
@@ -2110,6 +2110,9 @@ static void *ogg_init_class (xine_t *xine, void *data) {
this->demux_class.identifier = "OGG";
this->demux_class.mimetypes =
"application/ogg: ogx: Ogg Stream;"
+ "application/x-ogm: ogx: Ogg Stream;"
+ "application/x-ogm-audio: oga: Ogg Audio;"
+ "application/x-ogm-video: ogv: Ogg Video;"
"application/x-ogg: ogx: Ogg Stream;"
"audio/ogg: oga: Ogg Audio;"
"audio/x-ogg: oga: Ogg Audio;"
diff --git a/src/demuxers/Makefile.am b/src/demuxers/Makefile.am
index 596d7dbd0..e2ee826ec 100644
--- a/src/demuxers/Makefile.am
+++ b/src/demuxers/Makefile.am
@@ -8,7 +8,7 @@ AM_LDFLAGS = $(xineplug_ldflags)
# ---------
# All of xine demuxer plugins should be named like the scheme "xineplug_dmx_"
-noinst_HEADERS = asfheader.h qtpalette.h group_games.h group_audio.h id3.h ebml.h matroska.h iff.h flacutils.h
+noinst_HEADERS = asfheader.h qtpalette.h group_games.h group_audio.h id3.h ebml.h matroska.h iff.h flacutils.h real_common.h
if ENABLE_ASF
asf_module = xineplug_dmx_asf.la
diff --git a/src/demuxers/asfheader.c b/src/demuxers/asfheader.c
index 75ad11c75..d602445a0 100644
--- a/src/demuxers/asfheader.c
+++ b/src/demuxers/asfheader.c
@@ -394,7 +394,7 @@ static int asf_header_parse_stream_extended_properties(asf_header_t *header, uin
if (asf_stream_extension->stream_name_count) {
asf_stream_extension->stream_names = malloc (asf_stream_extension->stream_name_count * sizeof(void*));
for (i = 0; i < asf_stream_extension->stream_name_count; i++) {
- uint16_t lang_index, length;
+ uint16_t lang_index, length = 0;
asf_reader_get_16(&reader, &lang_index);
asf_reader_get_16(&reader, &length);
asf_stream_extension->stream_names[i] = (char*)asf_reader_get_bytes(&reader, length); /* store them */
@@ -406,7 +406,7 @@ static int asf_header_parse_stream_extended_properties(asf_header_t *header, uin
for (i = 0; i < asf_stream_extension->payload_extension_system_count; i++) {
GUID guid;
uint16_t data_size;
- uint32_t length;
+ uint32_t length = 0;
asf_reader_get_guid(&reader, &guid);
asf_reader_get_16(&reader, &data_size);
asf_reader_get_32(&reader, &length);
@@ -422,7 +422,7 @@ static int asf_header_parse_stream_extended_properties(asf_header_t *header, uin
/* embeded stream properties */
if (asf_reader_get_size(&reader) >= 24) {
GUID guid;
- uint64_t object_length;
+ uint64_t object_length = 0;
asf_reader_get_guid(&reader, &guid);
asf_reader_get_64(&reader, &object_length);
@@ -485,8 +485,8 @@ static int asf_header_parse_stream_bitrate_properties(asf_header_t *header_pub,
lprintf (" bitrate count: %d\n", bitrate_count);
for(i = 0; i < bitrate_count; i++) {
- uint16_t flags;
- uint32_t bitrate;
+ uint16_t flags = 0;
+ uint32_t bitrate = 0;
int stream_number;
uint8_t *bitrate_pointer;
@@ -528,7 +528,7 @@ static int asf_header_parse_header_extension(asf_header_t *header, uint8_t *buff
GUID guid;
int object_id;
- uint64_t object_length, object_data_length;
+ uint64_t object_length = 0, object_data_length;
if (asf_reader_get_size(&reader) < 24) {
printf("invalid buffer size\n");
@@ -633,7 +633,7 @@ asf_header_t *asf_header_new (uint8_t *buffer, int buffer_len) {
GUID guid;
int object_id;
- uint64_t object_length, object_data_length;
+ uint64_t object_length = 0, object_data_length;
if (asf_reader_get_size(&reader) < 24) {
printf("invalid buffer size\n");
diff --git a/src/demuxers/demux_4xm.c b/src/demuxers/demux_4xm.c
index 6256cb042..264806421 100644
--- a/src/demuxers/demux_4xm.c
+++ b/src/demuxers/demux_4xm.c
@@ -159,7 +159,7 @@ static int open_fourxm_file(demux_fourxm_t *fourxm) {
/* read the whole header */
header_size = _X_LE_32(&preview[4]) - 4;
header = xine_xmalloc(header_size);
- if (fourxm->input->read(fourxm->input, header, header_size) != header_size) {
+ if (!header || fourxm->input->read(fourxm->input, header, header_size) != header_size) {
free(header);
return 0;
}
diff --git a/src/demuxers/demux_aiff.c b/src/demuxers/demux_aiff.c
index 51bc624e3..06ff65680 100644
--- a/src/demuxers/demux_aiff.c
+++ b/src/demuxers/demux_aiff.c
@@ -46,6 +46,10 @@
#define COMM_TAG FOURCC_TAG('C', 'O', 'M', 'M')
#define SSND_TAG FOURCC_TAG('S', 'S', 'N', 'D')
#define APCM_TAG FOURCC_TAG('A', 'P', 'C', 'M')
+#define NAME_TAG FOURCC_TAG('N', 'A', 'M', 'E')
+#define AUTH_TAG FOURCC_TAG('A', 'U', 'T', 'H')
+#define COPY_TAG FOURCC_TAG('(', 'c', ')', ' ')
+#define ANNO_TAG FOURCC_TAG('A', 'N', 'N', 'O')
#define PREAMBLE_SIZE 8
#define AIFF_SIGNATURE_SIZE 12
@@ -80,6 +84,24 @@ typedef struct {
demux_class_t demux_class;
} demux_aiff_class_t;
+/* converts IEEE 80bit extended into int, based on FFMPEG code */
+int extended_to_int(const unsigned char p[10])
+{
+ uint64_t m = 0;
+ int e, i;
+
+ for (i = 0; i < 8; i++)
+ m = (m<<8) + p[2+i];;
+ e = (((int)p[0]&0x7f)<<8) | p[1];
+ if (e == 0x7fff && m)
+ return 0.0/0.0;
+ e -= 16383 + 63;
+
+ if (p[0]&0x80)
+ m= -m;
+ return (int) ldexp(m, e);
+}
+
/* returns 1 if the AIFF file was opened successfully, 0 otherwise */
static int open_aiff_file(demux_aiff_t *this) {
@@ -87,6 +109,7 @@ static int open_aiff_file(demux_aiff_t *this) {
unsigned char preamble[PREAMBLE_SIZE];
unsigned int chunk_type;
unsigned int chunk_size;
+ unsigned char extended_sample_rate[10];
if (_x_demux_read_header(this->input, signature, AIFF_SIGNATURE_SIZE) != AIFF_SIGNATURE_SIZE)
return 0;
@@ -135,7 +158,8 @@ static int open_aiff_file(demux_aiff_t *this) {
this->audio_channels = _X_BE_16(&buffer[0]);
this->audio_frames = _X_BE_32(&buffer[2]);
this->audio_bits = _X_BE_16(&buffer[6]);
- this->audio_sample_rate = _X_BE_16(&buffer[0x0A]);
+ memcpy(&extended_sample_rate, &buffer[8], sizeof(extended_sample_rate));
+ this->audio_sample_rate = extended_to_int(extended_sample_rate);
this->audio_bytes_per_second = this->audio_channels *
(this->audio_bits / 8) * this->audio_sample_rate;
@@ -150,11 +174,18 @@ static int open_aiff_file(demux_aiff_t *this) {
(this->audio_bits / 8);
this->running_time = (this->audio_frames / this->audio_sample_rate) * 1000;
- this->audio_block_align = PCM_BLOCK_ALIGN;
+ /* we should send only complete frames to decoder, as it
+ * doesn't handle underconsumption yet */
+ this->audio_block_align = PCM_BLOCK_ALIGN - PCM_BLOCK_ALIGN % (this->audio_bits / 8 * this->audio_channels);
break;
} else {
+ /* if chunk contains metadata, it will be word-aligned (as seen at sox and ffmpeg) */
+ if ( ((chunk_type == NAME_TAG) || (chunk_type==AUTH_TAG) ||
+ (chunk_type == COPY_TAG) || (chunk_type==ANNO_TAG)) && (chunk_size&1))
+ chunk_size++;
+
/* unrecognized; skip it */
this->input->seek(this->input, chunk_size, SEEK_CUR);
}
diff --git a/src/demuxers/demux_avi.c b/src/demuxers/demux_avi.c
index 27dfce443..e06caf94f 100644
--- a/src/demuxers/demux_avi.c
+++ b/src/demuxers/demux_avi.c
@@ -973,6 +973,10 @@ static avi_t *AVI_init(demux_avi_t *this) {
xine_waveformatex *wavex;
wavex = (xine_waveformatex *)malloc(n);
+ if (!wavex) {
+ this->AVI_errno = AVI_ERR_NO_MEM;
+ return 0;
+ }
memcpy((void *)wavex, hdrl_data+i, n);
_x_waveformatex_le2me( wavex );
@@ -1237,6 +1241,9 @@ static avi_t *AVI_init(demux_avi_t *this) {
/* read from file */
chunk_start = en = malloc (AVI->video_superindex->aIndex[j].dwSize+hdrl_len);
+ if (!chunk_start)
+ ERR_EXIT(AVI_ERR_NO_MEM);
+
if (this->input->seek(this->input, AVI->video_superindex->aIndex[j].qwOffset, SEEK_SET) == (off_t)-1) {
lprintf("cannot seek to 0x%" PRIx64 "\n", AVI->video_superindex->aIndex[j].qwOffset);
free(chunk_start);
@@ -1308,6 +1315,9 @@ static avi_t *AVI_init(demux_avi_t *this) {
/* read from file */
chunk_start = en = malloc (audio->audio_superindex->aIndex[j].dwSize+hdrl_len);
+ if (!chunk_start)
+ ERR_EXIT(AVI_ERR_NO_MEM);
+
if (this->input->seek(this->input, audio->audio_superindex->aIndex[j].qwOffset, SEEK_SET) == (off_t)-1) {
lprintf("cannot seek to 0x%" PRIx64 "\n", audio->audio_superindex->aIndex[j].qwOffset);
free(chunk_start);
diff --git a/src/demuxers/demux_dts.c b/src/demuxers/demux_dts.c
index 9d3313a72..750d212f5 100644
--- a/src/demuxers/demux_dts.c
+++ b/src/demuxers/demux_dts.c
@@ -140,29 +140,63 @@ static int open_dts_file(demux_dts_t *this) {
}
}
+ /* DTS bitstream encoding version
+ * -1 - not detected
+ * 0 - 16 bits and big endian
+ * 1 - 16 bits and low endian (detection not implemented)
+ * 2 - 14 bits and big endian (detection not implemented)
+ * 3 - 14 bits and low endian
+ */
+ int dts_version = -1;
+
/* Look for a valid DTS syncword */
for (i=offset; i<peak_size-1; i++) {
+ /* 16 bits and big endian bitstream */
+ if (syncword == 0x7ffe8001) {
+ dts_version = 0;
+ break;
+ }
/* 14 bits and little endian bitstream */
- if ((syncword == 0xff1f00e8) &&
- ((peak[i] & 0xf0) == 0xf0) && (peak[i+1] == 0x07)) {
- this->data_start = i-4;
- lprintf("found DTS syncword at offset %d\n", i-4);
- break;
+ else if ((syncword == 0xff1f00e8) &&
+ ((peak[i] & 0xf0) == 0xf0) && (peak[i+1] == 0x07)) {
+ dts_version = 3;
+ break;
}
syncword = (syncword << 8) | peak[i];
}
+ if (dts_version == -1) {
+ xprintf (this->stream->xine, XINE_VERBOSITY_LOG,
+ LOG_MODULE ": unsupported DTS stream type, or not a DTS stream\n");
+ return 0;
+ }
+
+ this->data_start = i-4;
+ lprintf("found DTS syncword at offset %d\n", i-4);
+
if (i < peak_size-9) {
unsigned int nblks, fsize, sfreq;
+ switch (dts_version)
+ {
+ case 0: /* BE16 */
+ nblks = ((peak[this->data_start+4] & 0x01) << 6) |
+ ((peak[this->data_start+5] & 0xfc) >> 2);
+ fsize = (((peak[this->data_start+5] & 0x03) << 12) |(peak[this->data_start+6] << 4) |
+ ((peak[this->data_start+7] & 0xf0) >> 4)) + 1;
+ sfreq = (peak[this->data_start+8] & 0x3c) >> 2;
+ break;
- /* 14 bits and little endian bitstream */
- nblks = ((peak[this->data_start+4] & 0x07) << 4) |
- ((peak[this->data_start+7] & 0x3c) >> 2);
- fsize = (((peak[this->data_start+7] & 0x03) << 12) |
- (peak[this->data_start+6] << 4) |
- ((peak[this->data_start+9] & 0x3c) >> 2)) + 1;
- sfreq = peak[this->data_start+8] & 0x0f;
+ case 3: /* LE14 */
+ nblks = ((peak[this->data_start+4] & 0x07) << 4) |
+ ((peak[this->data_start+7] & 0x3c) >> 2);
+ fsize = (((peak[this->data_start+7] & 0x03) << 12) |
+ (peak[this->data_start+6] << 4) |
+ ((peak[this->data_start+9] & 0x3c) >> 2)) + 1;
+ sfreq = peak[this->data_start+8] & 0x0f;
+ break;
+
+ }
if ((sfreq > sizeof(dts_sample_rates)/sizeof(int)) ||
(dts_sample_rates[sfreq] == 0))
@@ -170,7 +204,19 @@ static int open_dts_file(demux_dts_t *this) {
/* Big assumption - this is CBR data */
this->samples_per_frame = (nblks + 1) * 32;
- this->frame_size = fsize * 8 / 14 * 2;
+
+ switch (dts_version)
+ {
+ case 0: /* BE16 */
+ case 1: /* LE16 */
+ this->frame_size = fsize * 8 / 16 * 2;
+ break;
+ case 2: /* BE14 */
+ case 3: /* LE14 */
+ this->frame_size = fsize * 8 / 14 * 2;
+ break;
+ }
+
this->sample_rate = dts_sample_rates[sfreq];
lprintf("samples per frame: %d\n", this->samples_per_frame);
diff --git a/src/demuxers/demux_film.c b/src/demuxers/demux_film.c
index 193d8850b..f7b514e4b 100644
--- a/src/demuxers/demux_film.c
+++ b/src/demuxers/demux_film.c
@@ -260,6 +260,8 @@ static int open_film_file(demux_film_t *film) {
film->sample_count = _X_BE_32(&film_header[i + 12]);
film->sample_table =
xine_xcalloc(film->sample_count, sizeof(film_sample_t));
+ if (!film->sample_table)
+ goto film_abort;
for (j = 0; j < film->sample_count; j++) {
film->sample_table[j].sample_offset =
@@ -335,11 +337,14 @@ static int open_film_file(demux_film_t *film) {
free(film->interleave_buffer);
film->interleave_buffer =
xine_xmalloc(film->sample_table[0].sample_size);
+ if (!film->interleave_buffer)
+ goto film_abort;
}
break;
default:
xine_log(film->stream->xine, XINE_LOG_MSG, _("unrecognized FILM chunk\n"));
+ film_abort:
free (film->interleave_buffer);
free (film->sample_table);
free (film_header);
diff --git a/src/demuxers/demux_flac.c b/src/demuxers/demux_flac.c
index ed974a69c..94c599562 100644
--- a/src/demuxers/demux_flac.c
+++ b/src/demuxers/demux_flac.c
@@ -166,6 +166,8 @@ static int open_flac_file(demux_flac_t *flac) {
flac->seekpoint_count = block_length / FLAC_SEEKPOINT_SIZE;
flac->seekpoints = xine_xcalloc(flac->seekpoint_count,
sizeof(flac_seekpoint_t));
+ if (flac->seekpoint_count && !flac->seekpoints)
+ return 0;
for (i = 0; i < flac->seekpoint_count; i++) {
if (flac->input->read(flac->input, buffer, FLAC_SEEKPOINT_SIZE) != FLAC_SEEKPOINT_SIZE)
return 0;
diff --git a/src/demuxers/demux_flv.c b/src/demuxers/demux_flv.c
index 38855c027..e111468aa 100644
--- a/src/demuxers/demux_flv.c
+++ b/src/demuxers/demux_flv.c
@@ -85,7 +85,7 @@ typedef struct {
off_t filesize;
flv_index_entry_t *index;
- int num_indices;
+ unsigned int num_indices;
unsigned int cur_pts;
@@ -209,7 +209,7 @@ static int parse_flv_var(demux_flv_t *this,
unsigned char *end = buf + size;
char *str;
unsigned char type;
- int len, num;
+ unsigned int len, num;
if (size < 1)
return 0;
@@ -283,6 +283,8 @@ static int parse_flv_var(demux_flv_t *this,
str = tmp + 2;
tmp += len + 2;
len = parse_flv_var(this, tmp, end-tmp, str, len);
+ if (!len)
+ return 0;
tmp += len;
}
if (*tmp++ != FLV_DATA_TYPE_ENDOBJECT)
@@ -298,6 +300,8 @@ static int parse_flv_var(demux_flv_t *this,
str = tmp + 2;
tmp += len + 2;
len = parse_flv_var(this, tmp, end-tmp, str, len);
+ if (!len)
+ return 0;
tmp += len;
}
break;
@@ -310,6 +314,8 @@ static int parse_flv_var(demux_flv_t *this,
if (this->index)
free(this->index);
this->index = xine_xcalloc(num, sizeof(flv_index_entry_t));
+ if (!this->index)
+ return 0;
this->num_indices = num;
}
for (num = 0; num < this->num_indices && tmp < end; num++) {
@@ -326,6 +332,8 @@ static int parse_flv_var(demux_flv_t *this,
if (this->index)
free(this->index);
this->index = xine_xcalloc(num, sizeof(flv_index_entry_t));
+ if (!this->index)
+ return 0;
this->num_indices = num;
}
for (num = 0; num < this->num_indices && tmp < end; num++) {
@@ -339,6 +347,8 @@ static int parse_flv_var(demux_flv_t *this,
}
while (num-- && tmp < end) {
len = parse_flv_var(this, tmp, end-tmp, NULL, 0);
+ if (!len)
+ return 0;
tmp += len;
}
break;
@@ -360,7 +370,7 @@ static void parse_flv_script(demux_flv_t *this, int size) {
unsigned char *end = buf + size;
int len;
- if (this->input->read(this->input, buf, size ) != size) {
+ if (!buf || this->input->read(this->input, buf, size ) != size) {
this->status = DEMUX_FINISHED;
free(buf);
return;
diff --git a/src/demuxers/demux_iff.c b/src/demuxers/demux_iff.c
index 665d29cd2..dcef148b4 100644
--- a/src/demuxers/demux_iff.c
+++ b/src/demuxers/demux_iff.c
@@ -401,7 +401,7 @@ static int read_iff_chunk(demux_iff_t *this) {
this->cmap_num = junk_size / PIC_SIZE_OF_COLOR_REGISTER;
this->cmap = (ColorRegister *)xine_xmalloc(junk_size);
this->video_send_palette = 1;
- if (this->input->read(this->input, (char *)this->cmap, junk_size) != junk_size)
+ if (!this->cmap || this->input->read(this->input, (char *)this->cmap, junk_size) != junk_size)
return 0;
break;
case IFF_GRAB_CHUNK:
@@ -709,11 +709,19 @@ static int demux_iff_send_chunk(demux_plugin_t *this_gen) {
/* load the whole chunk into the buffer */
if (this->audio_buffer_filled == 0) {
if (this->audio_interleave_buffer_size > 0)
+ {
this->audio_interleave_buffer =
xine_xmalloc(this->audio_interleave_buffer_size);
+ if (!this->audio_interleave_buffer)
+ return this->status = DEMUX_FINISHED;
+ }
if (this->audio_read_buffer_size > 0)
+ {
this->audio_read_buffer =
xine_xmalloc(this->audio_read_buffer_size);
+ if (!this->audio_read_buffer)
+ return this->status = DEMUX_FINISHED;
+ }
if (this->audio_read_buffer) {
if (this->input->read(this->input, this->audio_read_buffer,
this->data_size) != this->data_size) {
diff --git a/src/demuxers/demux_ipmovie.c b/src/demuxers/demux_ipmovie.c
index 4d08af6fa..88fd70811 100644
--- a/src/demuxers/demux_ipmovie.c
+++ b/src/demuxers/demux_ipmovie.c
@@ -283,9 +283,10 @@ static int process_ipmovie_chunk(demux_ipmovie_t *this) {
this->bih.biWidth = _X_LE_16(&scratch[0]) * 8;
this->bih.biHeight = _X_LE_16(&scratch[2]) * 8;
/* set up staging area for decode map */
- this->decode_map_size = (this->bih.biWidth * this->bih.biHeight) /
- (8 * 8) / 2;
+ this->decode_map_size = (this->bih.biWidth / 8) * (this->bih.biHeight / 8) / 2;
this->decode_map = xine_xmalloc(this->decode_map_size);
+ if (!this->decode_map)
+ this->status = DEMUX_FINISHED;
lprintf("video resolution: %d x %d\n",
this->bih.biWidth, this->bih.biHeight);
break;
diff --git a/src/demuxers/demux_matroska.c b/src/demuxers/demux_matroska.c
index ec932aacb..713995e97 100644
--- a/src/demuxers/demux_matroska.c
+++ b/src/demuxers/demux_matroska.c
@@ -635,9 +635,7 @@ static void init_codec_xiph(demux_matroska_t *this, matroska_track_t *track) {
}
buf->size = frame[i];
- buf->decoder_flags = BUF_FLAG_HEADER;
- if (i == 2)
- buf->decoder_flags |= BUF_FLAG_FRAME_END;
+ buf->decoder_flags = BUF_FLAG_HEADER | BUF_FLAG_FRAME_START | BUF_FLAG_FRAME_END;
buf->type = track->buf_type;
buf->pts = 0;
@@ -1179,13 +1177,10 @@ static int parse_track_entry(demux_matroska_t *this, matroska_track_t *track) {
break;
case MATROSKA_ID_TR_CODECID: {
- char *codec_id = malloc (elem.len + 1);
+ char *codec_id = ebml_alloc_read_ascii (ebml, &elem);
lprintf("CodecID\n");
- if (!ebml_read_ascii(ebml, &elem, codec_id)) {
- free(codec_id);
+ if (!codec_id)
return 0;
- }
- codec_id[elem.len] = '\0';
track->codec_id = codec_id;
}
break;
@@ -1203,13 +1198,10 @@ static int parse_track_entry(demux_matroska_t *this, matroska_track_t *track) {
break;
case MATROSKA_ID_TR_LANGUAGE: {
- char *language = malloc (elem.len + 1);
+ char *language = ebml_alloc_read_ascii (ebml, &elem);
lprintf("Language\n");
- if (!ebml_read_ascii(ebml, &elem, language)) {
- free(language);
+ if (!language)
return 0;
- }
- language[elem.len] = '\0';
track->language = language;
}
break;
@@ -2893,7 +2885,8 @@ static void *init_class (xine_t *xine, void *data) {
this->demux_class.open_plugin = open_plugin;
this->demux_class.description = N_("matroska demux plugin");
this->demux_class.identifier = "matroska";
- this->demux_class.mimetypes = "video/mkv: mkv: matroska;";
+ this->demux_class.mimetypes = "video/mkv: mkv: matroska;"
+ "video/x-matroska: mkv: matroska;";
this->demux_class.extensions = "mkv";
this->demux_class.dispose = default_demux_class_dispose;
diff --git a/src/demuxers/demux_qt.c b/src/demuxers/demux_qt.c
index ecd2c319a..b8e0acb12 100644
--- a/src/demuxers/demux_qt.c
+++ b/src/demuxers/demux_qt.c
@@ -746,8 +746,10 @@ static char *parse_data_atom(const uint8_t *data_atom) {
}
alloc_str = xine_xmalloc(alloc_size);
- xine_fast_memcpy(alloc_str, &data_atom[16], alloc_size-1);
- alloc_str[alloc_size-1] = '\0';
+ if (alloc_str) {
+ xine_fast_memcpy(alloc_str, &data_atom[16], alloc_size-1);
+ alloc_str[alloc_size-1] = '\0';
+ }
debug_meta_load("demux_qt: got a string of size %zd (%s)\n", alloc_size, alloc_str);
@@ -954,8 +956,8 @@ static qt_error parse_trak_atom (qt_trak *trak,
debug_atom_load(" qt elst atom (edit list atom): %d entries\n",
trak->edit_list_count);
- trak->edit_list_table = (edit_list_table_t *)xine_xmalloc(
- trak->edit_list_count * sizeof(edit_list_table_t));
+ trak->edit_list_table = (edit_list_table_t *)calloc(
+ trak->edit_list_count, sizeof(edit_list_table_t));
if (!trak->edit_list_table) {
last_error = QT_NO_MEMORY;
goto free_trak;
@@ -1023,6 +1025,10 @@ static qt_error parse_trak_atom (qt_trak *trak,
trak->stsd_atoms[k].video.properties_atom_size = current_stsd_atom_size - 4;
trak->stsd_atoms[k].video.properties_atom =
xine_xmalloc(trak->stsd_atoms[k].video.properties_atom_size);
+ if (!trak->stsd_atoms[k].video.properties_atom) {
+ last_error = QT_NO_MEMORY;
+ goto free_trak;
+ }
memcpy(trak->stsd_atoms[k].video.properties_atom, &trak_atom[atom_pos],
trak->stsd_atoms[k].video.properties_atom_size);
@@ -1162,6 +1168,10 @@ static qt_error parse_trak_atom (qt_trak *trak,
trak->stsd_atoms[k].audio.properties_atom_size = current_stsd_atom_size - 4;
trak->stsd_atoms[k].audio.properties_atom =
xine_xmalloc(trak->stsd_atoms[k].audio.properties_atom_size);
+ if (!trak->stsd_atoms[k].audio.properties_atom) {
+ last_error = QT_NO_MEMORY;
+ goto free_trak;
+ }
memcpy(trak->stsd_atoms[k].audio.properties_atom, &trak_atom[atom_pos],
trak->stsd_atoms[k].audio.properties_atom_size);
@@ -1278,6 +1288,10 @@ static qt_error parse_trak_atom (qt_trak *trak,
trak->stsd_atoms[k].audio.properties_atom_size = 36;
trak->stsd_atoms[k].audio.properties_atom =
xine_xmalloc(trak->stsd_atoms[k].audio.properties_atom_size);
+ if (!trak->stsd_atoms[k].audio.properties_atom) {
+ last_error = QT_NO_MEMORY;
+ goto free_trak;
+ }
memcpy(trak->stsd_atoms[k].audio.properties_atom,
&trak_atom[atom_pos + 0x20],
trak->stsd_atoms[k].audio.properties_atom_size);
@@ -1299,6 +1313,10 @@ static qt_error parse_trak_atom (qt_trak *trak,
(current_atom_size >= (0x4C + wave_size))) {
trak->stsd_atoms[k].audio.wave_size = wave_size;
trak->stsd_atoms[k].audio.wave = xine_xmalloc(wave_size);
+ if (!trak->stsd_atoms[k].audio.wave) {
+ last_error = QT_NO_MEMORY;
+ goto free_trak;
+ }
memcpy(trak->stsd_atoms[k].audio.wave, &trak_atom[atom_pos + 0x4C],
wave_size);
_x_waveformatex_le2me(trak->stsd_atoms[k].audio.wave);
@@ -1368,8 +1386,16 @@ static qt_error parse_trak_atom (qt_trak *trak,
j += mp4_read_descr_len( &trak_atom[j], &len );
debug_atom_load(" decoder config is %d (0x%X) bytes long\n",
len, len);
+ if (len > current_atom_size - (j - i)) {
+ last_error = QT_NOT_A_VALID_FILE;
+ goto free_trak;
+ }
trak->decoder_config = realloc(trak->decoder_config, len);
trak->decoder_config_len = len;
+ if (!trak->decoder_config) {
+ last_error = QT_NO_MEMORY;
+ goto free_trak;
+ }
memcpy(trak->decoder_config,&trak_atom[j],len);
}
}
@@ -1399,8 +1425,8 @@ static qt_error parse_trak_atom (qt_trak *trak,
/* allocate space and load table only if sample size is 0 */
if (trak->sample_size == 0) {
- trak->sample_size_table = (unsigned int *)malloc(
- trak->sample_size_count * sizeof(unsigned int));
+ trak->sample_size_table = (unsigned int *)calloc(
+ trak->sample_size_count, sizeof(unsigned int));
if (!trak->sample_size_table) {
last_error = QT_NO_MEMORY;
goto free_trak;
@@ -1430,8 +1456,8 @@ static qt_error parse_trak_atom (qt_trak *trak,
debug_atom_load(" qt stss atom (sample sync atom): %d sync samples\n",
trak->sync_sample_count);
- trak->sync_sample_table = (unsigned int *)malloc(
- trak->sync_sample_count * sizeof(unsigned int));
+ trak->sync_sample_table = (unsigned int *)calloc(
+ trak->sync_sample_count, sizeof(unsigned int));
if (!trak->sync_sample_table) {
last_error = QT_NO_MEMORY;
goto free_trak;
@@ -1614,6 +1640,9 @@ static qt_error parse_reference_atom (reference_t *ref,
size_t string_size = _X_BE_32(&ref_atom[i + 12]);
size_t url_offset = 0;
+ if (string_size >= current_atom_size || i + string_size >= ref_atom_size)
+ return QT_NOT_A_VALID_FILE;
+
/* if the URL starts with "http://", copy it */
if ( memcmp(&ref_atom[i + 16], "http://", 7) &&
memcmp(&ref_atom[i + 16], "rtsp://", 7) &&
@@ -2054,8 +2083,12 @@ static void parse_moov_atom(qt_info *info, unsigned char *moov_atom,
info->references = (reference_t *)realloc(info->references,
info->reference_count * sizeof(reference_t));
- parse_reference_atom(&info->references[info->reference_count - 1],
- &moov_atom[i - 4], info->base_mrl);
+ error = parse_reference_atom(&info->references[info->reference_count - 1],
+ &moov_atom[i - 4], info->base_mrl);
+ if (error != QT_OK) {
+ info->last_error = error;
+ return;
+ }
break;
default:
diff --git a/src/demuxers/demux_real.c b/src/demuxers/demux_real.c
index 41c6fb4a2..cc6a214e0 100644
--- a/src/demuxers/demux_real.c
+++ b/src/demuxers/demux_real.c
@@ -55,6 +55,8 @@
#include <xine/demux.h>
#include "bswap.h"
+#include "real_common.h"
+
#define FOURCC_TAG BE_FOURCC
#define RMF_TAG FOURCC_TAG('.', 'R', 'M', 'F')
#define PROP_TAG FOURCC_TAG('P', 'R', 'O', 'P')
@@ -113,6 +115,12 @@ typedef struct {
int index_entries;
mdpr_t *mdpr;
+ int sps, cfs, w, h;
+ int block_align;
+ int frame_size;
+ uint8_t *frame_buffer;
+ uint32_t frame_num_bytes;
+ uint32_t sub_packet_cnt;
} real_stream_t;
typedef struct {
@@ -168,14 +176,14 @@ typedef struct {
demux_class_t demux_class;
} demux_real_class_t;
-
static void real_parse_index(demux_real_t *this) {
off_t next_index_chunk = this->index_start;
off_t original_pos = this->input->get_current_pos(this->input);
unsigned char index_chunk_header[INDEX_CHUNK_HEADER_SIZE];
unsigned char index_record[INDEX_RECORD_SIZE];
- int i, entries, stream_num;
+ int i;
+ unsigned int entries, stream_num;
real_index_entry_t **index;
while(next_index_chunk) {
@@ -230,10 +238,11 @@ static void real_parse_index(demux_real_t *this) {
}
}
- if(index && entries) {
+ if(index && entries)
/* Allocate memory for index */
*index = xine_xcalloc(entries, sizeof(real_index_entry_t));
+ if(index && entries && *index) {
/* Read index */
for(i = 0; i < entries; i++) {
if(this->input->read(this->input, index_record, INDEX_RECORD_SIZE)
@@ -308,6 +317,64 @@ static void real_free_mdpr (mdpr_t *mdpr) {
free (mdpr);
}
+static void real_parse_audio_specific_data (demux_real_t *this,
+ real_stream_t * stream,
+ uint8_t * data, int len)
+{
+ int coded_frame_size;
+ int codec_data_length;
+ int coded_frame_size2;
+ int subpacket_size;
+
+ coded_frame_size = _X_BE_32 (data+24);
+ codec_data_length = _X_BE_16 (data+40);
+ coded_frame_size2 = _X_BE_16 (data+42);
+ subpacket_size = _X_BE_16 (data+44);
+
+ stream->sps = subpacket_size;
+ stream->w = coded_frame_size2;
+ stream->h = codec_data_length;
+ stream->block_align = coded_frame_size2;
+ stream->cfs = coded_frame_size;
+
+ switch (stream->buf_type) {
+ case BUF_AUDIO_COOK:
+ case BUF_AUDIO_ATRK:
+ stream->block_align = subpacket_size;
+ break;
+
+ case BUF_AUDIO_14_4:
+ break;
+
+ case BUF_AUDIO_28_8:
+ stream->block_align = stream->cfs;
+ break;
+
+ case BUF_AUDIO_SIPRO:
+ /* this->block_align = 19; */
+ break;
+
+ default:
+ xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG,
+ "demux_real: error, i don't handle buf type 0x%08x\n", stream->buf_type);
+ }
+
+ if (stream->sps) {
+ stream->frame_size = stream->w / stream->sps * stream->h * stream->sps;
+ stream->frame_buffer = xine_xmalloc (stream->frame_size);
+ stream->frame_num_bytes = 0;
+ } else {
+ stream->frame_size = stream->w * stream->h;
+ stream->frame_buffer = xine_xmalloc (stream->frame_size);
+ stream->frame_num_bytes = 0;
+ }
+ stream->sub_packet_cnt = 0;
+
+ xprintf (this->stream->xine, XINE_VERBOSITY_LOG,
+ "demux_real: buf type 0x%08x frame size %dblock align %d\n", stream->buf_type,
+ stream->frame_size, stream->block_align);
+
+}
static void real_parse_headers (demux_real_t *this) {
@@ -418,8 +485,16 @@ static void real_parse_headers (demux_real_t *this) {
mdpr = real_parse_mdpr (chunk_buffer);
lprintf ("parsing type specific data...\n");
+ if(!strcmp(mdpr->mime_type, "audio/X-MP3-draft-00")) {
+ lprintf ("mpeg layer 3 audio detected...\n");
- if(_X_BE_32(mdpr->type_specific_data) == RA_TAG) {
+ fourcc = ME_FOURCC('a', 'd', 'u', 0x55);
+ this->audio_streams[this->num_audio_streams].fourcc = fourcc;
+ this->audio_streams[this->num_audio_streams].buf_type = _x_formattag_to_buf_audio(fourcc);
+ this->audio_streams[this->num_audio_streams].index = NULL;
+ this->audio_streams[this->num_audio_streams].mdpr = mdpr;
+ this->num_audio_streams++;
+ } else if(_X_BE_32(mdpr->type_specific_data) == RA_TAG) {
int version, len;
if(this->num_audio_streams == MAX_AUDIO_STREAMS) {
@@ -457,6 +532,10 @@ static void real_parse_headers (demux_real_t *this) {
this->audio_streams[this->num_audio_streams].index = NULL;
this->audio_streams[this->num_audio_streams].mdpr = mdpr;
+ real_parse_audio_specific_data (this,
+ &this->audio_streams[this->num_audio_streams],
+ mdpr->type_specific_data,
+ mdpr->type_specific_len);
this->num_audio_streams++;
if (!this->audio_streams[this->num_audio_streams].buf_type)
@@ -745,6 +824,13 @@ unknown:
memcpy(buf->content, mdpr->type_specific_data + 79,
buf->decoder_info[2]);
+ } else if(buf->type == BUF_AUDIO_MP3ADU) {
+ buf->decoder_flags |= BUF_FLAG_STDHEADER | BUF_FLAG_FRAME_END;
+ buf->size = 0;
+ buf->decoder_info[0] = 0;
+ buf->decoder_info[1] = 0;
+ buf->decoder_info[2] = 0;
+ buf->decoder_info[3] = 0;
} else {
memcpy(buf->content, mdpr->type_specific_data,
mdpr->type_specific_len);
@@ -983,6 +1069,7 @@ static int demux_real_send_chunk(demux_plugin_t *this_gen) {
off_t offset, input_length = 0;
int normpos = 0;
+ read_next_packet:
if(this->reference_mode)
return demux_real_parse_references(this);
@@ -1320,6 +1407,64 @@ static int demux_real_send_chunk(demux_plugin_t *this_gen) {
}
free(sizes);
+ } else if (this->audio_stream->buf_type == BUF_AUDIO_COOK ||
+ this->audio_stream->buf_type == BUF_AUDIO_ATRK ||
+ this->audio_stream->buf_type == BUF_AUDIO_28_8 ||
+ this->audio_stream->buf_type == BUF_AUDIO_SIPRO) {
+ /* reorder */
+ uint8_t * buffer = this->audio_stream->frame_buffer;
+ int sps = this->audio_stream->sps;
+ int sph = this->audio_stream->h;
+ int cfs = this->audio_stream->cfs;
+ int w = this->audio_stream->w;
+ int spc = this->audio_stream->sub_packet_cnt;
+ int x, pos;
+
+ switch (this->audio_stream->buf_type) {
+ case BUF_AUDIO_28_8:
+ for (x = 0; x < sph / 2; x++) {
+ pos = x * 2 * w + spc * cfs;
+ if(this->input->read(this->input, buffer + pos, cfs) < cfs) {
+ xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
+ "demux_real: failed to read audio chunk\n");
+
+ this->status = DEMUX_FINISHED;
+ return this->status;
+ }
+ }
+ break;
+ case BUF_AUDIO_COOK:
+ case BUF_AUDIO_ATRK:
+ for (x = 0; x < w / sps; x++) {
+ pos = sps * (sph * x + ((sph + 1) / 2) * (spc & 1) + (spc >> 1));
+ if(this->input->read(this->input, buffer + pos, sps) < sps) {
+ xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
+ "demux_real: failed to read audio chunk\n");
+
+ this->status = DEMUX_FINISHED;
+ return this->status;
+ }
+ }
+ break;
+ case BUF_AUDIO_SIPRO:
+ pos = spc * w;
+ if(this->input->read(this->input, buffer + pos, w) < w) {
+ xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
+ "demux_real: failed to read audio chunk\n");
+
+ this->status = DEMUX_FINISHED;
+ return this->status;
+ }
+ if (spc == sph - 1)
+ demux_real_sipro_swap (buffer, sph * w * 2 / 96);
+ break;
+ }
+ if(++this->audio_stream->sub_packet_cnt == sph) {
+ this->audio_stream->sub_packet_cnt = 0;
+ _x_demux_send_data(this->audio_fifo, buffer, this->audio_stream->frame_size,
+ pts, this->audio_stream->buf_type, 0, normpos, input_time,
+ this->duration, 0);
+ }
} else {
if(_x_demux_read_send_data(this->audio_fifo, this->input, size, pts,
this->audio_stream->buf_type, 0, normpos,
@@ -1469,6 +1614,9 @@ static int demux_real_seek (demux_plugin_t *this_gen,
this->input->seek(this->input, index[i].offset, SEEK_SET);
if(playing) {
+ if(this->audio_stream)
+ this->audio_stream->sub_packet_cnt = 0;
+
this->buf_flag_seek = 1;
_x_demux_flush_engine(this->stream);
}
@@ -1505,6 +1653,7 @@ static void demux_real_dispose (demux_plugin_t *this_gen) {
for(i = 0; i < this->num_audio_streams; i++) {
real_free_mdpr(this->audio_streams[i].mdpr);
free(this->audio_streams[i].index);
+ free(this->audio_streams[i].frame_buffer);
}
free(this->fragment_tab);
diff --git a/src/demuxers/demux_realaudio.c b/src/demuxers/demux_realaudio.c
index 732ddfcc4..2873a522e 100644
--- a/src/demuxers/demux_realaudio.c
+++ b/src/demuxers/demux_realaudio.c
@@ -41,6 +41,8 @@
#include "bswap.h"
#include "group_audio.h"
+#include "real_common.h"
+
#define RA_FILE_HEADER_PREV_SIZE 22
typedef struct {
@@ -62,6 +64,10 @@ typedef struct {
off_t data_start;
off_t data_size;
+ int sps, cfs, w, h;
+ int frame_size;
+ uint8_t *frame_buffer;
+
unsigned char *header;
unsigned int header_size;
} demux_ra_t;
@@ -70,6 +76,9 @@ typedef struct {
demux_class_t demux_class;
} demux_ra_class_t;
+/* Map flavour to bytes per second */
+static int sipr_fl2bps[4] = {813, 1062, 625, 2000}; // 6.5, 8.5, 5, 16 kbit per second
+
/* returns 1 if the RealAudio file was opened successfully, 0 otherwise */
static int open_ra_file(demux_ra_t *this) {
unsigned char file_header[RA_FILE_HEADER_PREV_SIZE], len;
@@ -103,7 +112,7 @@ static int open_ra_file(demux_ra_t *this) {
/* allocate for and read header data */
this->header = xine_xmalloc(this->header_size);
- if (_x_demux_read_header(this->input, this->header, this->header_size) != this->header_size) {
+ if (!this->header || _x_demux_read_header(this->input, this->header, this->header_size) != this->header_size) {
xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG, "demux_realaudio: unable to read header\n");
free(this->header);
return 0;
@@ -165,20 +174,41 @@ static int open_ra_file(demux_ra_t *this) {
offset++;
/* Fourcc for version 3 comes after meta info */
- if((version == 3) && ((offset+7) <= this->header_size)) {
- if(this->header[offset+2] == 4)
- this->fourcc = _X_ME_32(&this->header[offset+3]);
- else {
- xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
- "demux_realaudio: invalid fourcc size %d\n", this->header[offset+2]);
- free(this->header);
- return 0;
+ if(version == 3) {
+ if (((offset+7) <= this->header_size)) {
+ if(this->header[offset+2] == 4)
+ this->fourcc = _X_ME_32(&this->header[offset+3]);
+ else {
+ xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
+ "demux_realaudio: invalid fourcc size %d\n", this->header[offset+2]);
+ free(this->header);
+ return 0;
+ }
+ } else {
+ this->fourcc = ME_FOURCC('l', 'p', 'c', 'J');
}
}
_x_stream_info_set(this->stream, XINE_STREAM_INFO_AUDIO_FOURCC, this->fourcc);
this->audio_type = _x_formattag_to_buf_audio(this->fourcc);
+ if (version == 4) {
+ this->sps = _X_BE_16 (this->header+44);
+ this->w = _X_BE_16 (this->header+42);
+ this->h = _X_BE_16 (this->header+40);
+ this->cfs = _X_BE_32 (this->header+24);
+ if (this->sps) {
+ this->frame_size = this->sps * this->h * this->sps;
+ this->frame_buffer = xine_xmalloc (this->frame_size);
+ } else {
+ this->frame_size = this->w * this->h;
+ this->frame_buffer = xine_xmalloc (this->frame_size);
+ }
+
+ if (this->audio_type == BUF_AUDIO_28_8 || this->audio_type == BUF_AUDIO_SIPRO)
+ this->block_align = this->cfs;
+ }
+
/* seek to start of data */
this->data_start = this->header_size;
if (this->input->seek(this->input, this->data_start, SEEK_SET) !=
@@ -212,7 +242,45 @@ static int demux_ra_send_chunk(demux_plugin_t *this_gen) {
this->seek_flag = 0;
}
- if(_x_demux_read_send_data(this->audio_fifo, this->input, this->block_align,
+ if (this->audio_type == BUF_AUDIO_28_8 || this->audio_type == BUF_AUDIO_SIPRO) {
+ int x;
+ uint8_t * buffer;
+
+ buffer = this->frame_buffer;
+ if (this->audio_type == BUF_AUDIO_SIPRO) {
+ int n;
+ int len = this->h * this->w;
+ if(this->input->read(this->input, this->frame_buffer, len) < len) {
+ xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
+ "demux_realaudio: failed to read audio chunk\n");
+
+ this->status = DEMUX_FINISHED;
+ return this->status;
+ }
+ demux_real_sipro_swap (this->frame_buffer, len * 2 / 96);
+ } else {
+ int x, y;
+ int pos;
+
+ for (y = 0; y < this->h; y++)
+ for (x = 0; x < this->h / 2; x++) {
+ pos = x * 2 * this->w + y * this->cfs;
+ if(this->input->read(this->input, this->frame_buffer + pos,
+ this->cfs) < this->cfs) {
+ xprintf(this->stream->xine, XINE_VERBOSITY_DEBUG,
+ "demux_realaudio: failed to read audio chunk\n");
+
+ this->status = DEMUX_FINISHED;
+ return this->status;
+ }
+ }
+ }
+
+ _x_demux_send_data(this->audio_fifo,
+ buffer, this->frame_size,
+ current_pts, this->audio_type, 0,
+ current_normpos, current_pts / 90, 0, 0);
+ } else if(_x_demux_read_send_data(this->audio_fifo, this->input, this->block_align,
current_pts, this->audio_type, 0, current_normpos,
current_pts / 90, 0, 0) < 0) {
this->status = DEMUX_FINISHED;
@@ -298,6 +366,7 @@ static void demux_ra_dispose (demux_plugin_t *this_gen) {
demux_ra_t *this = (demux_ra_t *) this_gen;
free(this->header);
+ free(this->frame_buffer);
free(this);
}
@@ -329,6 +398,7 @@ static demux_plugin_t *open_plugin (demux_class_t *class_gen, xine_stream_t *str
this = xine_xmalloc (sizeof (demux_ra_t));
this->stream = stream;
this->input = input;
+ this->frame_buffer = NULL;
this->demux_plugin.send_headers = demux_ra_send_headers;
this->demux_plugin.send_chunk = demux_ra_send_chunk;
diff --git a/src/demuxers/demux_vmd.c b/src/demuxers/demux_vmd.c
index c2902eac1..d1d98f534 100644
--- a/src/demuxers/demux_vmd.c
+++ b/src/demuxers/demux_vmd.c
@@ -168,7 +168,7 @@ static int open_vmd_file(demux_vmd_t *this) {
return 0;
}
- this->frame_table = xine_xmalloc(this->frame_count * sizeof(vmd_frame_t));
+ this->frame_table = calloc(this->frame_count, sizeof(vmd_frame_t));
current_offset = this->data_start = _X_LE_32(&vmd_header[20]);
this->data_size = toc_offset - this->data_start;
diff --git a/src/demuxers/demux_wav.c b/src/demuxers/demux_wav.c
index b8f0d0194..2beb43291 100644
--- a/src/demuxers/demux_wav.c
+++ b/src/demuxers/demux_wav.c
@@ -41,9 +41,11 @@
#include "bswap.h"
#include "group_audio.h"
-#define WAV_SIGNATURE_SIZE 16
+#define WAV_SIGNATURE_SIZE 12
/* this is the hex value for 'data' */
#define data_TAG 0x61746164
+/* this is the hex value for 'fmt ' */
+#define fmt_TAG 0x20746D66
#define PCM_BLOCK_ALIGN 1024
#define PREFERED_BLOCK_SIZE 4096
@@ -73,31 +75,63 @@ typedef struct {
static int demux_wav_get_stream_length (demux_plugin_t *this_gen);
+/* searches for the chunk with the given tag from the beginning of WAV file
+ * returns 1 if chunk was found, 0 otherwise,
+ * fills chunk_size and chunk_pos if chunk was found
+ * NOTE: chunk_pos is set to the position of the first byte of chunk data */
+static int find_chunk_by_tag(demux_wav_t *this, const uint32_t given_chunk_tag,
+ uint32_t *found_chunk_size, off_t *found_chunk_pos) {
+ uint32_t chunk_tag;
+ uint32_t chunk_size;
+ uint8_t chunk_preamble[8];
+
+ /* search for the chunks from the start of the WAV file */
+ this->input->seek(this->input, WAV_SIGNATURE_SIZE, SEEK_SET);
+
+ while (1) {
+ if (this->input->read(this->input, chunk_preamble, 8) != 8) {
+ return 0;
+ }
+
+ chunk_tag = _X_LE_32(&chunk_preamble[0]);
+ chunk_size = _X_LE_32(&chunk_preamble[4]);
+
+ if (chunk_tag == given_chunk_tag) {
+ if (found_chunk_size)
+ *found_chunk_size = _X_LE_32(&chunk_preamble[4]);
+ if (found_chunk_pos)
+ *found_chunk_pos = this->input->get_current_pos(this->input);
+ return 1;
+ } else {
+ this->input->seek(this->input, chunk_size, SEEK_CUR);
+ }
+ }
+}
+
/* returns 1 if the WAV file was opened successfully, 0 otherwise */
static int open_wav_file(demux_wav_t *this) {
uint8_t signature[WAV_SIGNATURE_SIZE];
uint32_t chunk_tag;
uint32_t chunk_size;
uint8_t chunk_preamble[8];
+ off_t wave_pos;
/* check the signature */
if (_x_demux_read_header(this->input, signature, WAV_SIGNATURE_SIZE) != WAV_SIGNATURE_SIZE)
return 0;
- if (memcmp(signature, "RIFF", 4) || memcmp(&signature[8], "WAVEfmt ", 8) )
+ if (memcmp(signature, "RIFF", 4) || memcmp(&signature[8], "WAVE", 4) )
return 0;
- /* file is qualified; skip over the header bytes in the stream */
- this->input->seek(this->input, WAV_SIGNATURE_SIZE, SEEK_SET);
-
- /* go after the format structure */
- if (this->input->read(this->input,
- (unsigned char *)&this->wave_size, 4) != 4)
+ /* search for the 'fmt ' chunk first */
+ wave_pos = 0;
+ if (find_chunk_by_tag(this, fmt_TAG, &this->wave_size, &wave_pos)==0)
return 0;
- this->wave_size = le2me_32(this->wave_size);
+
+ this->input->seek(this->input, wave_pos, SEEK_SET);
this->wave = xine_xmalloc( this->wave_size );
-
- if (this->input->read(this->input, (void *)this->wave, this->wave_size) !=
+
+ if (!this->wave || this->input->read(this->input, (void *)this->wave, this->wave_size) !=
this->wave_size) {
free (this->wave);
return 0;
@@ -113,28 +147,21 @@ static int open_wav_file(demux_wav_t *this) {
return 0;
}
- /* traverse through the chunks to find the 'data' chunk */
+ /* search for the 'data' chunk */
this->data_start = this->data_size = 0;
- while (this->data_start == 0) {
-
- if (this->input->read(this->input, chunk_preamble, 8) != 8) {
- free (this->wave);
- return 0;
- }
- chunk_tag = _X_LE_32(&chunk_preamble[0]);
- chunk_size = _X_LE_32(&chunk_preamble[4]);
-
- if (chunk_tag == data_TAG) {
- this->data_start = this->input->get_current_pos(this->input);
- /* Get the data length from the file itself, instead of the data
- * TAG, for broken files */
- this->data_size = this->input->get_length(this->input);
- } else {
- this->input->seek(this->input, chunk_size, SEEK_CUR);
- }
+ if (find_chunk_by_tag(this, data_TAG, &this->data_size, &this->data_start)==0)
+ {
+ free (this->wave);
+ return 0;
+ }
+ else
+ {
+ /* Get the data length from the file itself, instead of the data
+ * TAG, for broken files */
+ this->input->seek(this->input, this->data_start, SEEK_SET);
+ this->data_size = this->input->get_length(this->input);
+ return 1;
}
-
- return 1;
}
static int demux_wav_send_chunk(demux_plugin_t *this_gen) {
diff --git a/src/demuxers/demux_wc3movie.c b/src/demuxers/demux_wc3movie.c
index bb9a40306..5be59b12b 100644
--- a/src/demuxers/demux_wc3movie.c
+++ b/src/demuxers/demux_wc3movie.c
@@ -387,6 +387,12 @@ static int open_mve_file(demux_mve_t *this) {
/* load the palette chunks */
this->palettes = xine_xcalloc(this->number_of_shots, PALETTE_SIZE *
sizeof(palette_entry_t));
+
+ if (!this->shot_offsets || !this->palettes) {
+ free (this->shot_offsets);
+ return 0;
+ }
+
for (i = 0; i < this->number_of_shots; i++) {
/* make sure there was a valid palette chunk preamble */
if (this->input->read(this->input, preamble, PREAMBLE_SIZE) !=
@@ -458,8 +464,9 @@ static int open_mve_file(demux_mve_t *this) {
case BNAM_TAG:
/* load the name into the stream attributes */
- title = realloc (title, chunk_size);
- if (this->input->read(this->input, title, chunk_size) != chunk_size) {
+ free (title);
+ title = malloc (chunk_size);
+ if (!title || this->input->read(this->input, title, chunk_size) != chunk_size) {
free (title);
free (this->palettes);
free (this->shot_offsets);
diff --git a/src/demuxers/ebml.c b/src/demuxers/ebml.c
index 41a91371e..1e9a456d2 100644
--- a/src/demuxers/ebml.c
+++ b/src/demuxers/ebml.c
@@ -310,7 +310,25 @@ int ebml_read_ascii(ebml_parser_t *ebml, ebml_elem_t *elem, char *str) {
int ebml_read_utf8 (ebml_parser_t *ebml, ebml_elem_t *elem, char *str) {
return ebml_read_ascii (ebml, elem, str);
}
+#endif
+
+char *ebml_alloc_read_ascii (ebml_parser_t *ebml, ebml_elem_t *elem)
+{
+ char *text;
+ if (elem->len >= 4096)
+ return NULL;
+ text = malloc(elem->len + 1);
+ if (text)
+ {
+ text[elem->len] = '\0';
+ if (ebml_read_ascii (ebml, elem, text))
+ return text;
+ free (text);
+ }
+ return NULL;
+}
+#if 0
int ebml_read_date (ebml_parser_t *ebml, ebml_elem_t *elem, int64_t *date) {
return ebml_read_sint (ebml, elem, date);
}
@@ -414,10 +432,8 @@ int ebml_check_header(ebml_parser_t *ebml) {
}
case EBML_ID_DOCTYPE: {
- char *text = malloc(elem.len + 1);
-
- text[elem.len] = '\0';
- if (!ebml_read_ascii (ebml, &elem, text))
+ char *text = ebml_alloc_read_ascii (ebml, &elem);
+ if (!text)
return 0;
lprintf("doctype: %s\n", text);
diff --git a/src/demuxers/ebml.h b/src/demuxers/ebml.h
index 31d825e35..a090bb130 100644
--- a/src/demuxers/ebml.h
+++ b/src/demuxers/ebml.h
@@ -93,7 +93,11 @@ int ebml_read_ascii(ebml_parser_t *ebml, ebml_elem_t *elem, char *str);
#if 0
int ebml_read_utf8(ebml_parser_t *ebml, ebml_elem_t *elem, char *str);
+#endif
+
+char *ebml_alloc_read_ascii(ebml_parser_t *ebml, ebml_elem_t *elem);
+#if 0
int ebml_read_date(ebml_parser_t *ebml, ebml_elem_t *elem, int64_t *date);
#endif
diff --git a/src/demuxers/real_common.h b/src/demuxers/real_common.h
new file mode 100644
index 000000000..4945a65ff
--- /dev/null
+++ b/src/demuxers/real_common.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2008 the xine project
+ *
+ * This file is part of xine, a free video player.
+ *
+ * xine is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * xine is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ */
+
+static inline void demux_real_sipro_swap (char buffer[], int bs)
+{
+ /* bs = nybbles per subpacket */
+ static const unsigned char sipr_swaps[38][2] = {
+ {0, 63}, {1, 22}, {2, 44}, {3, 90}, {5, 81}, {7, 31}, {8, 86}, {9, 58},
+ {10, 36}, {12, 68}, {13, 39}, {14, 73}, {15, 53}, {16, 69}, {17, 57},
+ {19, 88}, {20, 34}, {21, 71}, {24, 46}, {25, 94}, {26, 54}, {28, 75},
+ {29, 50}, {32, 70}, {33, 92}, {35, 74}, {38, 85}, {40, 56}, {42, 87},
+ {43, 65}, {45, 59}, {48, 79}, {49, 93}, {51, 89}, {55, 95}, {61, 76},
+ {67, 83}, {77, 80}
+ };
+ int n;
+
+ for (n = 0; n < 38; ++n)
+ {
+ int j;
+ int i = bs * sipr_swaps[n][0];
+ int o = bs * sipr_swaps[n][1];
+ /* swap nibbles of block 'i' with 'o' TODO: optimize */
+ for (j = 0; j < bs; ++j)
+ {
+ int x = (i & 1) ? (buffer[i >> 1] >> 4) : (buffer[i >> 1] & 0x0F);
+ int y = (o & 1) ? (buffer[o >> 1] >> 4) : (buffer[o >> 1] & 0x0F);
+ if (o & 1)
+ buffer[o >> 1] = (buffer[o >> 1] & 0x0F) | (x << 4);
+ else
+ buffer[o >> 1] = (buffer[o >> 1] & 0xF0) | x;
+ if (i & 1)
+ buffer[i >> 1] = (buffer[i >> 1] & 0x0F) | (y << 4);
+ else
+ buffer[i >> 1] = (buffer[i >> 1] & 0xF0) | y;
+ ++i;
+ ++o;
+ }
+ }
+}
diff --git a/src/input/libdvdnav/dvd_reader.c b/src/input/libdvdnav/dvd_reader.c
index c15a5c3f5..4144b9133 100644
--- a/src/input/libdvdnav/dvd_reader.c
+++ b/src/input/libdvdnav/dvd_reader.c
@@ -1037,6 +1037,28 @@ int32_t DVDFileSeek( dvd_file_t *dvd_file, int32_t offset )
return offset;
}
+int32_t DVDFileSeekForce( dvd_file_t *dvd_file, int offset, int force_size )
+{
+ /* Check arguments. */
+ if( dvd_file == NULL || offset < 0 )
+ return -1;
+
+ if( dvd_file->dvd->isImageFile ) {
+ if( force_size < 0 )
+ force_size = (offset - 1) / DVD_VIDEO_LB_LEN + 1;
+ if( dvd_file->filesize < force_size) {
+ dvd_file->filesize = force_size;
+ fprintf(stderr, "libdvdread: Ignored UDF provided size of file.\n");
+ }
+ }
+
+ if( offset > dvd_file->filesize * DVD_VIDEO_LB_LEN ) {
+ return -1;
+ }
+ dvd_file->seek_pos = (uint32_t) offset;
+ return offset;
+}
+
ssize_t DVDReadBytes( dvd_file_t *dvd_file, void *data, size_t byte_size )
{
unsigned char *secbuf_base, *secbuf;
@@ -1077,7 +1099,7 @@ ssize_t DVDReadBytes( dvd_file_t *dvd_file, void *data, size_t byte_size )
memcpy( data, &(secbuf[ seek_byte ]), byte_size );
free( secbuf_base );
- dvd_file->seek_pos += byte_size;
+ DVDFileSeekForce(dvd_file, dvd_file->seek_pos + byte_size, -1);
return byte_size;
}
diff --git a/src/input/libdvdnav/dvd_reader.h b/src/input/libdvdnav/dvd_reader.h
index bb3f5053b..e1b051c00 100644
--- a/src/input/libdvdnav/dvd_reader.h
+++ b/src/input/libdvdnav/dvd_reader.h
@@ -171,6 +171,8 @@ ssize_t DVDReadBlocks( dvd_file_t *, int, size_t, unsigned char * );
*/
int32_t DVDFileSeek( dvd_file_t *, int32_t );
+int32_t DVDFileSeekForce( dvd_file_t *, int, int );
+
/**
* Reads the given number of bytes from the file. This call can only be used
* on the information files, and may not be used for reading from a VOB. This
diff --git a/src/input/libdvdnav/ifo_read.c b/src/input/libdvdnav/ifo_read.c
index 8f47d2a54..bc1ba580b 100644
--- a/src/input/libdvdnav/ifo_read.c
+++ b/src/input/libdvdnav/ifo_read.c
@@ -93,6 +93,10 @@ static inline int DVDFileSeek_( dvd_file_t *dvd_file, uint32_t offset ) {
return (DVDFileSeek(dvd_file, (int)offset) == (int)offset);
}
+static inline int32_t DVDFileSeekForce_( dvd_file_t *dvd_file, uint32_t offset, int force_size ) {
+ return (DVDFileSeekForce(dvd_file, (int)offset, force_size) == (int)offset);
+}
+
ifo_handle_t *ifoOpen(dvd_reader_t *dvd, int title) {
ifo_handle_t *ifofile;
@@ -1507,7 +1511,7 @@ static int ifoRead_VOBU_ADMAP_internal(ifo_handle_t *ifofile,
unsigned int i;
int info_length;
- if(!DVDFileSeek_(ifofile->file, sector * DVD_BLOCK_LEN))
+ if(!DVDFileSeekForce_(ifofile->file, sector * DVD_BLOCK_LEN, sector))
return 0;
if(!(DVDReadBytes(ifofile->file, vobu_admap, VOBU_ADMAP_SIZE)))
diff --git a/src/input/libreal/sdpplin.c b/src/input/libreal/sdpplin.c
index fbc64957b..4ef8f5f03 100644
--- a/src/input/libreal/sdpplin.c
+++ b/src/input/libreal/sdpplin.c
@@ -84,7 +84,14 @@ static sdpplin_stream_t *sdpplin_parse_stream(char **data) {
handled=0;
if(filter(*data,"a=control:streamid=",&buf)) {
- desc->stream_id=atoi(buf);
+ /* This way negative values are mapped to unfeasibly high
+ * values, and will be discarded afterward
+ */
+ unsigned long tmp = strtoul(buf, NULL, 10);
+ if ( tmp > UINT16_MAX )
+ lprintf("stream id out of bound: %lu\n", tmp);
+ else
+ desc->stream_id=tmp;
handled=1;
*data=nl(*data);
}
@@ -192,7 +199,10 @@ sdpplin_t *sdpplin_parse(char *data) {
}
stream=sdpplin_parse_stream(&data);
lprintf("got data for stream id %u\n", stream->stream_id);
- desc->stream[stream->stream_id]=stream;
+ if ( stream->stream_id >= desc->stream_count )
+ lprintf("stream id %u is greater than stream count %u\n", stream->stream_id, desc->stream_count);
+ else
+ desc->stream[stream->stream_id]=stream;
continue;
}
@@ -233,7 +243,14 @@ sdpplin_t *sdpplin_parse(char *data) {
}
if(filter(data,"a=StreamCount:integer;",&buf)) {
- desc->stream_count=atoi(buf);
+ /* This way negative values are mapped to unfeasibly high
+ * values, and will be discarded afterward
+ */
+ unsigned long tmp = strtoul(buf, NULL, 10);
+ if ( tmp > UINT16_MAX )
+ lprintf("stream count out of bound: %lu\n", tmp);
+ else
+ desc->stream_count = tmp;
desc->stream = calloc(desc->stream_count, sizeof(sdpplin_stream_t*));
handled=1;
data=nl(data);
diff --git a/src/input/libreal/sdpplin.h b/src/input/libreal/sdpplin.h
index cb3b434d4..72cbaf731 100644
--- a/src/input/libreal/sdpplin.h
+++ b/src/input/libreal/sdpplin.h
@@ -37,7 +37,7 @@ typedef struct {
char *id;
char *bandwidth;
- int stream_id;
+ uint16_t stream_id;
char *range;
char *length;
char *rtpmap;
@@ -81,7 +81,7 @@ typedef struct {
int flags;
int is_real_data_type;
- int stream_count;
+ uint16_t stream_count;
char *title;
char *author;
char *copyright;
diff --git a/src/libreal/xine_real_audio_decoder.c b/src/libreal/xine_real_audio_decoder.c
index b9231a2b7..a12518c1e 100644
--- a/src/libreal/xine_real_audio_decoder.c
+++ b/src/libreal/xine_real_audio_decoder.c
@@ -51,6 +51,8 @@ typedef struct {
/* empty so far */
} real_class_t;
+typedef void * ra_codec_t;
+
typedef struct realdec_decoder_s {
audio_decoder_t audio_decoder;
@@ -60,18 +62,18 @@ typedef struct realdec_decoder_s {
void *ra_handle;
- unsigned long (*raCloseCodec)(void*);
- unsigned long (*raDecode)(void*, char*,unsigned long,char*,unsigned int*,long);
- unsigned long (*raFlush)(unsigned long,unsigned long,unsigned long);
- unsigned long (*raFreeDecoder)(void*);
- void* (*raGetFlavorProperty)(void*,unsigned long,unsigned long,int*);
- unsigned long (*raInitDecoder)(void*, void*);
- unsigned long (*raOpenCodec2)(void*);
- unsigned long (*raSetFlavor)(void*,unsigned long);
- void (*raSetDLLAccessPath)(char*);
- void (*raSetPwd)(char*,char*);
+ uint32_t (*raCloseCodec)(ra_codec_t);
+ uint32_t (*raDecode)(ra_codec_t, char *, uint32_t, char *, uint32_t *, uint32_t);
+ uint32_t (*raFlush)(ra_codec_t, char *, uint32_t *);
+ uint32_t (*raFreeDecoder)(ra_codec_t);
+ void * (*raGetFlavorProperty)(ra_codec_t, uint16_t, uint16_t, uint16_t *);
+ uint32_t (*raInitDecoder)(ra_codec_t, void *);
+ uint32_t (*raOpenCodec2)(ra_codec_t *, const char *);
+ uint32_t (*raSetFlavor)(ra_codec_t, uint16_t);
+ void (*raSetDLLAccessPath)(char *);
+ void (*raSetPwd)(ra_codec_t, char *);
- void *context;
+ ra_codec_t context;
int sps, w, h;
int block_align;
@@ -92,14 +94,14 @@ typedef struct realdec_decoder_s {
} realdec_decoder_t;
typedef struct {
- int samplerate;
- short bits;
- short channels;
- int unk1;
- int subpacket_size;
- int coded_frame_size;
- int codec_data_length;
- void *extras;
+ uint32_t samplerate;
+ uint16_t bits;
+ uint16_t channels;
+ uint16_t quality;
+ uint32_t subpacket_size;
+ uint32_t coded_frame_size;
+ uint32_t codec_data_length;
+ void *extras;
} ra_init_t;
static int load_syms_linux (realdec_decoder_t *this, const char *const codec_name, const char *const codec_alternate) {
@@ -216,13 +218,14 @@ static int init_codec (realdec_decoder_t *this, buf_element_t *buf) {
_x_meta_info_set_utf8(this->stream, XINE_META_INFO_AUDIOCODEC, "Cook");
if (!load_syms_linux (this, "cook.so", "cook.so.6.0"))
return 0;
+ this->block_align = subpacket_size;
break;
case BUF_AUDIO_ATRK:
_x_meta_info_set_utf8(this->stream, XINE_META_INFO_AUDIOCODEC, "Atrac");
if (!load_syms_linux (this, "atrc.so", "atrc.so.6.0"))
return 0;
- this->block_align = 384;
+ this->block_align = subpacket_size;
break;
case BUF_AUDIO_14_4:
@@ -254,7 +257,7 @@ static int init_codec (realdec_decoder_t *this, buf_element_t *buf) {
* init codec
*/
- result = this->raOpenCodec2 (&this->context);
+ result = this->raOpenCodec2 (&this->context, NULL);
if (result) {
xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, "libareal: error in raOpenCodec2: %d\n", result);
return 0;
@@ -266,7 +269,7 @@ static int init_codec (realdec_decoder_t *this, buf_element_t *buf) {
init_data.samplerate = samples_per_sec;
init_data.bits = bits_per_sample;
init_data.channels = num_channels;
- init_data.unk1 = 100; /* ??? */
+ init_data.quality = 100; /* ??? */
init_data.subpacket_size = subpacket_size; /* subpacket size */
init_data.coded_frame_size = coded_frame_size; /* coded frame size */
init_data.codec_data_length = data_len; /* codec data length */
@@ -350,13 +353,6 @@ static int init_codec (realdec_decoder_t *this, buf_element_t *buf) {
return 1;
}
-static const unsigned char sipr_swaps[38][2]={
- {0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68},
- {13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46},
- {25,94},{26,54},{28,75},{29,50},{32,70},{33,92},{35,74},{38,85},{40,56},
- {42,87},{43,65},{45,59},{48,79},{49,93},{51,89},{55,95},{61,76},{67,83},
- {77,80} };
-
static void realdec_decode_data (audio_decoder_t *this_gen, buf_element_t *buf) {
realdec_decoder_t *this = (realdec_decoder_t *) this_gen;
@@ -383,116 +379,32 @@ static void realdec_decode_data (audio_decoder_t *this_gen, buf_element_t *buf)
this->pts = buf->pts;
size = buf->size;
-
while (size) {
+ int need;
- int needed;
-
- needed = this->frame_size - this->frame_num_bytes;
-
- if (needed>size) {
-
- memcpy (this->frame_buffer+this->frame_num_bytes, buf->content, size);
+ need = this->frame_size - this->frame_num_bytes;
+ if (size < need) {
+ memcpy (this->frame_buffer + this->frame_num_bytes,
+ buf->content + buf->size - size, size);
this->frame_num_bytes += size;
-
- lprintf ("buffering %d/%d bytes\n", this->frame_num_bytes, this->frame_size);
-
size = 0;
-
} else {
-
- int result;
- int len =-1;
- int n;
- int sps = this->sps;
- int w = this->w;
- int h = this->h;
audio_buffer_t *audio_buffer;
+ int n, len;
+ int result;
- lprintf ("buffering %d bytes\n", needed);
-
- memcpy (this->frame_buffer+this->frame_num_bytes, buf->content, needed);
-
- size -= needed;
+ memcpy (this->frame_buffer + this->frame_num_bytes,
+ buf->content + buf->size - size, need);
+ size -= need;
this->frame_num_bytes = 0;
- lprintf ("frame completed. reordering...\n");
- lprintf ("bs=%d sps=%d w=%d h=%d \n",/*sh->wf->nBlockAlign*/-1,sps,w,h);
-
- if (!sps) {
-
- int j,n;
- int bs=h*w*2/96; /* nibbles per subpacket */
- unsigned char *p=this->frame_buffer;
-
- /* 'sipr' way */
- /* demux_read_data(sh->ds, p, h*w); */
- for (n=0;n<38;n++){
- int i=bs*sipr_swaps[n][0];
- int o=bs*sipr_swaps[n][1];
- /* swap nibbles of block 'i' with 'o' TODO: optimize */
- for (j=0;j<bs;j++) {
- int x=(i&1) ? (p[(i>>1)]>>4) : (p[(i>>1)]&15);
- int y=(o&1) ? (p[(o>>1)]>>4) : (p[(o>>1)]&15);
- if (o&1)
- p[(o>>1)]=(p[(o>>1)]&0x0F)|(x<<4);
- else
- p[(o>>1)]=(p[(o>>1)]&0xF0)|x;
-
- if (i&1)
- p[(i>>1)]=(p[(i>>1)]&0x0F)|(y<<4);
- else
- p[(i>>1)]=(p[(i>>1)]&0xF0)|y;
-
- ++i;
- ++o;
- }
- }
- /*
- sh->a_in_buffer_size=
- sh->a_in_buffer_len=w*h;
- */
-
- } else {
- int x, y;
- uint8_t *s;
-
- /* 'cook' way */
-
- w /= sps; s = this->frame_buffer;
-
- for (y=0; y<h; y++)
-
- for (x=0; x<w; x++) {
-
- lprintf ("x=%d, y=%d, off %d\n",
- x, y, sps*(h*x+((h+1)/2)*(y&1)+(y>>1)));
-
- memcpy (this->frame_reordered+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)),
- s, sps);
- s+=sps;
-
- /* demux_read_data(sh->ds, sh->a_in_buffer+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)),
- sps); */
-
- }
- /*
- sh->a_in_buffer_size=
- sh->a_in_buffer_len=w*h*sps;
- */
- }
-
-#ifdef LOG
- xine_hexdump (this->frame_reordered, buf->size);
-#endif
-
n = 0;
- while (n<this->frame_size) {
+ while (n < this->frame_size) {
audio_buffer = this->stream->audio_out->get_buffer (this->stream->audio_out);
result = this->raDecode (this->context,
- this->frame_reordered+n,
+ this->frame_buffer + n,
this->block_align,
(char *) audio_buffer->mem, &len, -1);
@@ -506,7 +418,7 @@ static void realdec_decode_data (audio_decoder_t *this_gen, buf_element_t *buf)
this->stream->audio_out->put_buffer (this->stream->audio_out,
audio_buffer, this->stream);
- n+=this->block_align;
+ n += this->block_align;
}
}
}
@@ -609,5 +521,5 @@ static const uint32_t audio_types[] = {
const decoder_info_t dec_info_realaudio = {
audio_types, /* supported types */
- 7 /* priority */
+ 6 /* priority */
};
diff --git a/src/libreal/xine_real_video_decoder.c b/src/libreal/xine_real_video_decoder.c
index 28fddafda..2b5eafa16 100644
--- a/src/libreal/xine_real_video_decoder.c
+++ b/src/libreal/xine_real_video_decoder.c
@@ -63,9 +63,9 @@ typedef struct realdec_decoder_s {
uint32_t (*rvyuv_custom_message)(void*, void*);
uint32_t (*rvyuv_free)(void*);
- uint32_t (*rvyuv_hive_message)(uint32_t, uint32_t);
+ uint32_t (*rvyuv_hive_message)(uint32_t, void*);
uint32_t (*rvyuv_init)(void*, void*); /* initdata,context */
- uint32_t (*rvyuv_transform)(char*, char*, void*, uint32_t*,void*);
+ uint32_t (*rvyuv_transform)(char*, char*, void*, void*, void*);
void *context;
@@ -113,13 +113,21 @@ typedef struct cmsg_data_s {
typedef struct transform_in_s {
uint32_t len;
- uint32_t unknown1;
- uint32_t chunks;
- uint32_t* extra;
- uint32_t unknown2;
+ uint32_t interpolate;
+ uint32_t nsegments;
+ void *segments;
+ uint32_t flags;
uint32_t timestamp;
} transform_in_t;
+typedef struct {
+ uint32_t frames;
+ uint32_t notes;
+ uint32_t timestamp;
+ uint32_t width;
+ uint32_t height;
+} transform_out_t;
+
/*
* real codec loader
*/
@@ -169,7 +177,6 @@ static int init_codec (realdec_decoder_t *this, buf_element_t *buf) {
int result;
rv_init_t init_data = {11, 0, 0, 0, 0, 0, 1, 0}; /* rv30 */
-
switch (buf->type) {
case BUF_VIDEO_RV20:
_x_meta_info_set_utf8(this->stream, XINE_META_INFO_VIDEOCODEC, "Real Video 2.0");
@@ -258,7 +265,7 @@ static int init_codec (realdec_decoder_t *this, buf_element_t *buf) {
#ifdef LOG
printf ("libreal: CustomMessage cmsg_data:\n");
- xine_hexdump ((uint8_t *) cmsg_data, sizeof (cmsg_data));
+ xine_hexdump ((uint8_t *) &cmsg_data, sizeof (cmsg_data));
printf ("libreal: cmsg24:\n");
xine_hexdump ((uint8_t *) cmsg24, (buf->size - 34 + 2) * sizeof(uint32_t));
#endif
@@ -342,7 +349,7 @@ static void realdec_decode_data (video_decoder_t *this_gen, buf_element_t *buf)
int result;
vo_frame_t *img;
- uint32_t transform_out[5];
+ transform_out_t transform_out;
transform_in_t transform_in = {
this->chunk_buffer_size,
/* length of the packet (sub-packets appended) */
@@ -369,7 +376,7 @@ static void realdec_decode_data (video_decoder_t *this_gen, buf_element_t *buf)
xine_hexdump (this->chunk_buffer, this->chunk_buffer_size);
printf ("libreal: transform_in:\n");
- xine_hexdump ((uint8_t *) transform_in, 6 * 4);
+ xine_hexdump ((uint8_t *) &transform_in, sizeof(rv_xform_in_t));
printf ("libreal: chunk_table:\n");
xine_hexdump ((uint8_t *) buf->decoder_info_ptr[2],
@@ -379,21 +386,21 @@ static void realdec_decode_data (video_decoder_t *this_gen, buf_element_t *buf)
result = this->rvyuv_transform (this->chunk_buffer,
this->frame_buffer,
&transform_in,
- transform_out,
+ &transform_out,
this->context);
lprintf ("transform result: %08x\n", result);
lprintf ("transform_out:\n");
- #ifdef LOG
- xine_hexdump ((uint8_t *) transform_out, 5 * 4);
- #endif
+#ifdef LOG
+ xine_hexdump ((uint8_t *) &transform_out, 5 * 4);
+#endif
/* Sometimes the stream contains video of a different size
* to that specified in the realmedia header */
- if(transform_out[0] && ((transform_out[3] != this->width) ||
- (transform_out[4] != this->height))) {
- this->width = transform_out[3];
- this->height = transform_out[4];
+ if(transform_out.frames && ((transform_out.width != this->width) ||
+ (transform_out.height != this->height))) {
+ this->width = transform_out.width;
+ this->height = transform_out.height;
this->frame_size = this->width * this->height;
@@ -531,8 +538,7 @@ void *init_realvdec (xine_t *xine, void *data) {
* exported plugin catalog entry
*/
-static const uint32_t supported_types[] = { BUF_VIDEO_RV20,
- BUF_VIDEO_RV30,
+static const uint32_t supported_types[] = { BUF_VIDEO_RV30,
BUF_VIDEO_RV40,
0 };
diff --git a/src/vdr/input_vdr.c b/src/vdr/input_vdr.c
index 154bb9b56..ade2ecfa1 100644
--- a/src/vdr/input_vdr.c
+++ b/src/vdr/input_vdr.c
@@ -61,8 +61,19 @@
*/
+typedef struct vdr_input_plugin_s vdr_input_plugin_t;
+
typedef struct
{
+ metronom_t metronom;
+ metronom_t *stream_metronom;
+ vdr_input_plugin_t *input;
+}
+vdr_metronom_t;
+
+
+struct vdr_input_plugin_s
+{
input_plugin_t input_plugin;
xine_stream_t *stream;
@@ -111,9 +122,12 @@ typedef struct
uint16_t image16_9_zoom_x;
uint16_t image16_9_zoom_y;
-}
-vdr_input_plugin_t;
+ uint8_t find_sync_point;
+ pthread_mutex_t find_sync_point_lock;
+ vdr_metronom_t metronom;
+ int last_disc_type;
+};
typedef struct
@@ -581,7 +595,13 @@ static off_t vdr_execute_rpc_command(vdr_input_plugin_t *this)
int orig_speed = xine_get_param(this->stream, XINE_PARAM_FINE_SPEED);
if (orig_speed <= 0)
xine_set_param(this->stream, XINE_PARAM_FINE_SPEED, XINE_FINE_SPEED_NORMAL);
-fprintf(stderr, "+++ CLEAR(%d%c)\n", data->n, data->s ? 'b' : 'a');
+fprintf(stderr, "+++ CLEAR(%d%c): sync point: %02x\n", data->n, data->s ? 'b' : 'a', data->i);
+ if (!data->s)
+ {
+ pthread_mutex_lock(&this->find_sync_point_lock);
+ this->find_sync_point = data->i;
+ pthread_mutex_unlock(&this->find_sync_point_lock);
+ }
/*
if (!this->dont_change_xine_volume)
xine_set_param(this->stream, XINE_PARAM_AUDIO_VOLUME, 0);
@@ -952,33 +972,9 @@ fprintf(stderr, "ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß\n");
int height = 0;
int ratio_code = 0;
int format = 0;
-
- int orig_speed = xine_get_param(this->stream, XINE_PARAM_FINE_SPEED);
- if (XINE_SPEED_PAUSE != orig_speed)
- xine_set_param(this->stream, XINE_PARAM_FINE_SPEED, XINE_SPEED_PAUSE);
-
- if (xine_get_current_frame(this->stream, &width, &height, &ratio_code, &format, 0))
+
+ if (xine_get_current_frame_alloc(this->stream, &width, &height, &ratio_code, &format, &img, &frame_size))
{
- switch (format)
- {
- case XINE_IMGFMT_YV12:
- frame_size = width * height
- + ((width + 1) / 2) * ((height + 1) / 2)
- + ((width + 1) / 2) * ((height + 1) / 2);
- break;
-
- case XINE_IMGFMT_YUY2:
- frame_size = width * height
- + ((width + 1) / 2) * height
- + ((width + 1) / 2) * height;
- break;
- }
-
- img = xine_xmalloc(frame_size);
-
- if (!xine_get_current_frame(this->stream, &width, &height, &ratio_code, &format, img))
- frame_size = 0;
-
if (ratio_code == XINE_VO_ASPECT_SQUARE)
ratio_code = 10000;
else if (ratio_code == XINE_VO_ASPECT_4_3)
@@ -987,17 +983,15 @@ fprintf(stderr, "ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß\n");
ratio_code = 17778;
else if (ratio_code == XINE_VO_ASPECT_DVB)
ratio_code = 21100;
-
- if (0 == frame_size)
- {
- width = 0;
- height = 0;
- ratio_code = 0;
- }
}
-
- if (XINE_SPEED_PAUSE != orig_speed)
- xine_set_param(this->stream, XINE_PARAM_FINE_SPEED, orig_speed);
+
+ if (!img)
+ {
+ frame_size = 0,
+ width = 0;
+ height = 0;
+ ratio_code = 0;
+ }
{
result_grab_image_t result_grab_image;
@@ -1011,13 +1005,12 @@ fprintf(stderr, "ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß\n");
if (sizeof (result_grab_image) == vdr_write(this->fh_result, &result_grab_image, sizeof (result_grab_image)))
{
- if (frame_size == vdr_write(this->fh_result, img, frame_size))
+ if (!frame_size || (frame_size == vdr_write(this->fh_result, img, frame_size)))
ret_val = 0;
}
}
- if (img)
- free(img);
+ free(img);
if (ret_val != 0)
return ret_val;
@@ -1034,8 +1027,7 @@ fprintf(stderr, "ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß\n");
result_get_pts.header.func = data->header.func;
result_get_pts.header.len = sizeof (result_get_pts);
- result_get_pts.pts = xine_get_current_vpts(this->stream) - this->stream->metronom->get_option(this->stream->metronom, METRONOM_VPTS_OFFSET);
-
+ result_get_pts.pts = (this->last_disc_type == DISC_STREAMSTART) ? -2 : (xine_get_current_vpts(this->stream) - this->stream->metronom->get_option(this->stream->metronom, METRONOM_VPTS_OFFSET));
if (sizeof (result_get_pts) != vdr_write(this->fh_result, &result_get_pts, sizeof (result_get_pts)))
return -1;
}
@@ -1311,7 +1303,7 @@ static off_t vdr_plugin_read(input_plugin_t *this_gen,
void *buf_gen, off_t len)
{
vdr_input_plugin_t *this = (vdr_input_plugin_t *) this_gen;
- char *buf = (char *)buf_gen;
+ uint8_t *buf = (uint8_t *)buf_gen;
off_t n, total;
#ifdef LOG_READ
lprintf ("reading %lld bytes...\n", len);
@@ -1336,7 +1328,7 @@ static off_t vdr_plugin_read(input_plugin_t *this_gen,
int retries = 0;
do
{
- n = vdr_read_abort (this->stream, this->fh, &buf[total], len-total);
+ n = vdr_read_abort (this->stream, this->fh, (char *)&buf[total], len-total);
if (0 == n)
lprintf("read 0, retries: %d\n", retries);
}
@@ -1357,6 +1349,53 @@ static off_t vdr_plugin_read(input_plugin_t *this_gen,
this->curpos += n;
total += n;
}
+
+ if (this->find_sync_point
+ && total == 6)
+ {
+ pthread_mutex_lock(&this->find_sync_point_lock);
+
+ while (this->find_sync_point
+ && total == 6
+ && buf[0] == 0x00
+ && buf[1] == 0x00
+ && buf[2] == 0x01)
+ {
+ int l, sp;
+
+ if (buf[3] == 0xbe
+ && buf[4] == 0xff)
+ {
+//fprintf(stderr, "------- seen sync point: %02x, waiting for: %02x\n", buf[5], this->find_sync_point);
+ if (buf[5] == this->find_sync_point)
+ {
+ this->find_sync_point = 0;
+ break;
+ }
+ }
+
+ if ((buf[3] & 0xf0) != 0xe0
+ && (buf[3] & 0xe0) != 0xc0
+ && buf[3] != 0xbd
+ && buf[3] != 0xbe)
+ {
+ break;
+ }
+
+ l = buf[4] * 256 + buf[5];
+ if (l <= 0)
+ break;
+
+ sp = this->find_sync_point;
+ this->find_sync_point = 0;
+ this_gen->seek(this_gen, l, SEEK_CUR);
+ total = this_gen->read(this_gen, buf, 6);
+ this->find_sync_point = sp;
+ }
+
+ pthread_mutex_unlock(&this->find_sync_point_lock);
+ }
+
return total;
}
@@ -1512,6 +1551,7 @@ static void vdr_plugin_dispose(input_plugin_t *this_gen)
pthread_cond_destroy(&this->rpc_thread_shutdown_cond);
pthread_mutex_destroy(&this->rpc_thread_shutdown_lock);
+ pthread_mutex_destroy(&this->find_sync_point_lock);
pthread_mutex_destroy(&this->adjust_zoom_lock);
if (this->fh_result != -1)
@@ -1539,6 +1579,10 @@ static void vdr_plugin_dispose(input_plugin_t *this_gen)
close(this->fh);
free(this->mrl);
+
+ this->stream->metronom = this->metronom.stream_metronom;
+ this->metronom.stream_metronom = 0;
+
free(this);
}
@@ -1608,6 +1652,12 @@ static int vdr_plugin_open_fifo_mrl(input_plugin_t *this_gen)
fcntl(this->fh, F_SETFL, ~O_NONBLOCK & fcntl(this->fh, F_GETFL, 0));
+ /* eat initial handshake byte */
+ {
+ char b;
+ read(this->fh, &b, 1);
+ }
+
{
char *filename_control = 0;
asprintf(&filename_control, "%s.control", filename);
@@ -1946,6 +1996,69 @@ static void event_handler(void *user_data, const xine_event_t *event)
_("%s: input event write: %s.\n"), LOG_MODULE, strerror(errno));
}
+
+static void vdr_metronom_set_audio_rate(metronom_t *self, int64_t pts_per_smpls)
+{
+ vdr_metronom_t *this = (vdr_metronom_t *)self;
+ this->stream_metronom->set_audio_rate(this->stream_metronom, pts_per_smpls);
+}
+
+static void vdr_metronom_got_video_frame(metronom_t *self, vo_frame_t *frame)
+{
+ vdr_metronom_t *this = (vdr_metronom_t *)self;
+ this->stream_metronom->got_video_frame(this->stream_metronom, frame);
+}
+
+static int64_t vdr_metronom_got_audio_samples(metronom_t *self, int64_t pts, int nsamples)
+{
+ vdr_metronom_t *this = (vdr_metronom_t *)self;
+ return this->stream_metronom->got_audio_samples(this->stream_metronom, pts, nsamples);
+}
+
+static int64_t vdr_metronom_got_spu_packet(metronom_t *self, int64_t pts)
+{
+ vdr_metronom_t *this = (vdr_metronom_t *)self;
+ return this->stream_metronom->got_spu_packet(this->stream_metronom, pts);
+}
+
+static void vdr_metronom_handle_audio_discontinuity(metronom_t *self, int type, int64_t disc_off)
+{
+ vdr_metronom_t *this = (vdr_metronom_t *)self;
+ this->stream_metronom->handle_audio_discontinuity(this->stream_metronom, type, disc_off);
+ this->input->last_disc_type = type;
+}
+
+static void vdr_metronom_handle_video_discontinuity(metronom_t *self, int type, int64_t disc_off)
+{
+ vdr_metronom_t *this = (vdr_metronom_t *)self;
+ this->stream_metronom->handle_video_discontinuity(this->stream_metronom, type, disc_off);
+ this->input->last_disc_type = type;
+}
+
+static void vdr_metronom_set_option(metronom_t *self, int option, int64_t value)
+{
+ vdr_metronom_t *this = (vdr_metronom_t *)self;
+ this->stream_metronom->set_option(this->stream_metronom, option, value);
+}
+
+static int64_t vdr_metronom_get_option(metronom_t *self, int option)
+{
+ vdr_metronom_t *this = (vdr_metronom_t *)self;
+ return this->stream_metronom->get_option(this->stream_metronom, option);
+}
+
+static void vdr_metronom_set_master(metronom_t *self, metronom_t *master)
+{
+ vdr_metronom_t *this = (vdr_metronom_t *)self;
+ this->stream_metronom->set_master(this->stream_metronom, master);
+}
+
+static void vdr_metronom_exit(metronom_t *self)
+{
+ _x_abort();
+}
+
+
static input_plugin_t *vdr_class_get_instance(input_class_t *cls_gen, xine_stream_t *stream,
const char *data)
{
@@ -2017,6 +2130,7 @@ static input_plugin_t *vdr_class_get_instance(input_class_t *cls_gen, xine_strea
pthread_mutex_init(&this->rpc_thread_shutdown_lock, 0);
pthread_cond_init(&this->rpc_thread_shutdown_cond, 0);
+ pthread_mutex_init(&this->find_sync_point_lock, 0);
pthread_mutex_init(&this->adjust_zoom_lock, 0);
this->image4_3_zoom_x = 0;
this->image4_3_zoom_y = 0;
@@ -2027,6 +2141,21 @@ static input_plugin_t *vdr_class_get_instance(input_class_t *cls_gen, xine_strea
if (this->event_queue)
xine_event_create_listener_thread(this->event_queue, event_handler, this);
+ this->metronom.input = this;
+ this->metronom.metronom.set_audio_rate = vdr_metronom_set_audio_rate;
+ this->metronom.metronom.got_video_frame = vdr_metronom_got_video_frame;
+ this->metronom.metronom.got_audio_samples = vdr_metronom_got_audio_samples;
+ this->metronom.metronom.got_spu_packet = vdr_metronom_got_spu_packet;
+ this->metronom.metronom.handle_audio_discontinuity = vdr_metronom_handle_audio_discontinuity;
+ this->metronom.metronom.handle_video_discontinuity = vdr_metronom_handle_video_discontinuity;
+ this->metronom.metronom.set_option = vdr_metronom_set_option;
+ this->metronom.metronom.get_option = vdr_metronom_get_option;
+ this->metronom.metronom.set_master = vdr_metronom_set_master;
+ this->metronom.metronom.exit = vdr_metronom_exit;
+
+ this->metronom.stream_metronom = stream->metronom;
+ stream->metronom = &this->metronom.metronom;
+
return &this->input_plugin;
}
@@ -2039,7 +2168,7 @@ static char **vdr_class_get_autoplay_list(input_class_t *this_gen,
vdr_input_class_t *class = (vdr_input_class_t *)this_gen;
*num_files = 1;
- return class->mrls;
+ return (char **)class->mrls;
}
void *vdr_input_init_plugin(xine_t *xine, void *data)
diff --git a/src/video_dec/libmpeg2/decode.c b/src/video_dec/libmpeg2/decode.c
index 33d8b7ca9..e9700d95f 100644
--- a/src/video_dec/libmpeg2/decode.c
+++ b/src/video_dec/libmpeg2/decode.c
@@ -460,9 +460,10 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
break;
case 0xb7: /* sequence end code */
-#ifdef LOG_PAN_SCAN
- printf ("libmpeg2: sequence end code not handled\n");
-#endif
+ mpeg2_flush(mpeg2dec);
+ mpeg2dec->is_sequence_needed = 1;
+ break;
+
case 0xb8: /* group of pictures start code */
if (mpeg2_header_group_of_pictures (picture, buffer)) {
printf ("libmpeg2: bad group of pictures\n");
diff --git a/src/video_out/video_out_macosx.m b/src/video_out/video_out_macosx.m
index 9c65d579d..085387a44 100644
--- a/src/video_out/video_out_macosx.m
+++ b/src/video_out/video_out_macosx.m
@@ -36,11 +36,11 @@
#define LOG
*/
-#include "video_out.h"
-#include "vo_scale.h"
#include "xine.h"
-#include "xine_internal.h"
-#include "xineutils.h"
+#include "xine/video_out.h"
+#include "xine/vo_scale.h"
+#include "xine/xine_internal.h"
+#include "xine/xineutils.h"
#include "macosx/video_window.h"
@@ -207,7 +207,7 @@ static void macosx_display_frame(vo_driver_t *vo_driver, vo_frame_t *vo_frame) {
break;
case XINE_IMGFMT_YUY2:
xine_fast_memcpy (texture_buffer, vo_frame->base[0],
- vo_frame->pitches[0] * vo_frame->height * 2);
+ vo_frame->pitches[0] * vo_frame->height);
[driver->view updateTexture];
break;
default:
@@ -358,7 +358,7 @@ static void *init_class (xine_t *xine, void *visual) {
this->driver_class.open_plugin = open_plugin;
this->driver_class.identifier = "MacOSX";
this->driver_class.description = N_("xine video output plugin for Mac OS X");
- this->driver_class.dispose = default_video_driver_class;
+ this->driver_class.dispose = default_video_driver_class_dispose;
this->config = xine->config;
this->xine = xine;
diff --git a/src/video_out/video_out_xcbxv.c b/src/video_out/video_out_xcbxv.c
index d77917a70..e267f98fb 100644
--- a/src/video_out/video_out_xcbxv.c
+++ b/src/video_out/video_out_xcbxv.c
@@ -151,6 +151,8 @@ typedef struct {
xine_t *xine;
} xv_class_t;
+static const char *const prefer_types[] = VIDEO_DEVICE_XV_PREFER_TYPES;
+
static uint32_t xv_get_capabilities (vo_driver_t *this_gen) {
xv_driver_t *this = (xv_driver_t *) this_gen;
@@ -1145,10 +1147,15 @@ xv_find_adaptor_by_port (int port, xcb_xv_adaptor_info_iterator_t *adaptor_it)
static xcb_xv_port_t xv_autodetect_port(xv_driver_t *this,
xcb_xv_adaptor_info_iterator_t *adaptor_it,
- xcb_xv_port_t base)
+ xcb_xv_port_t base,
+ xv_prefertype prefer_type)
{
+ xcb_xv_adaptor_info_iterator_t *start = adaptor_it;
+
for (; adaptor_it->rem; xcb_xv_adaptor_info_next(adaptor_it))
- if (adaptor_it->data->type & XCB_XV_TYPE_IMAGE_MASK)
+ if (adaptor_it->data->type & XCB_XV_TYPE_IMAGE_MASK &&
+ (prefer_type == xv_prefer_none ||
+ strcasestr (xcb_xv_adaptor_info_name (adaptor_it->data), prefer_types[prefer_type])))
{
int j;
for (j = 0; j < adaptor_it->data->num_ports; ++j)
@@ -1168,6 +1175,7 @@ static vo_driver_t *open_plugin(video_driver_class_t *class_gen, const void *vis
int i;
xcb_visual_t *visual = (xcb_visual_t *) visual_gen;
xcb_xv_port_t xv_port;
+ xv_prefertype prefer_type;
const xcb_query_extension_reply_t *query_extension_reply;
@@ -1219,19 +1227,24 @@ static vo_driver_t *open_plugin(video_driver_class_t *class_gen, const void *vis
adaptor_it = xcb_xv_query_adaptors_info_iterator(query_adaptors_reply);
xv_port = config->register_num (config, "video.device.xv_port", 0,
VIDEO_DEVICE_XV_PORT_HELP,
- 10, NULL, NULL);
+ 20, NULL, NULL);
+ prefer_type = config->register_enum (config, "video.device.xv_preferred_method", 0,
+ prefer_types, VIDEO_DEVICE_XV_PREFER_TYPE_HELP,
+ 10, NULL, NULL);
if (xv_port != 0) {
if (! xv_open_port(this, xv_port)) {
xprintf(class->xine, XINE_VERBOSITY_NONE,
_("%s: could not open Xv port %d - autodetecting\n"),
LOG_MODULE, xv_port);
- xv_port = xv_autodetect_port (this, &adaptor_it, xv_port);
+ xv_port = xv_autodetect_port (this, &adaptor_it, xv_port, prefer_type);
} else
xv_find_adaptor_by_port (xv_port, &adaptor_it);
}
if (!xv_port)
- xv_port = xv_autodetect_port (this, &adaptor_it, 0);
+ xv_port = xv_autodetect_port (this, &adaptor_it, 0, prefer_type);
+ if (!xv_port)
+ xv_port = xv_autodetect_port (this, &adaptor_it, 0, xv_prefer_none);
if (!xv_port) {
xprintf(class->xine, XINE_VERBOSITY_LOG,
diff --git a/src/video_out/video_out_xv.c b/src/video_out/video_out_xv.c
index a874e4cdf..0026bd8af 100644
--- a/src/video_out/video_out_xv.c
+++ b/src/video_out/video_out_xv.c
@@ -164,6 +164,8 @@ typedef struct {
static int gX11Fail;
+static const char *const prefer_types[] = VIDEO_DEVICE_XV_PREFER_TYPES;
+
static uint32_t xv_get_capabilities (vo_driver_t *this_gen) {
xv_driver_t *this = (xv_driver_t *) this_gen;
@@ -1178,11 +1180,15 @@ static XvPortID xv_autodetect_port(xv_driver_t *this,
unsigned int adaptors,
XvAdaptorInfo *adaptor_info,
unsigned int *adaptor_num,
- XvPortID base) {
+ XvPortID base,
+ xv_prefertype prefer_type)
+{
unsigned int an, j;
for (an = 0; an < adaptors; an++)
- if (adaptor_info[an].type & XvImageMask)
+ if (adaptor_info[an].type & XvImageMask &&
+ (prefer_type == xv_prefer_none ||
+ strcasestr (adaptor_info[an].name, prefer_types[prefer_type])))
for (j = 0; j < adaptor_info[an].num_ports; j++) {
XvPortID port = adaptor_info[an].base_id + j;
if (port >= base && xv_open_port(this, port)) {
@@ -1212,6 +1218,7 @@ static vo_driver_t *open_plugin_2 (video_driver_class_t *class_gen, const void *
XvPortID xv_port;
XvAdaptorInfo *adaptor_info;
unsigned int adaptor_num;
+ xv_prefertype prefer_type;
this = (xv_driver_t *) xine_xmalloc (sizeof (xv_driver_t));
if (!this)
@@ -1251,19 +1258,24 @@ static vo_driver_t *open_plugin_2 (video_driver_class_t *class_gen, const void *
xv_port = config->register_num (config, "video.device.xv_port", 0,
VIDEO_DEVICE_XV_PORT_HELP,
- 10, NULL, NULL);
+ 20, NULL, NULL);
+ prefer_type = config->register_enum (config, "video.device.xv_preferred_method", 0,
+ prefer_types, VIDEO_DEVICE_XV_PREFER_TYPE_HELP,
+ 10, NULL, NULL);
if (xv_port != 0) {
if (! xv_open_port(this, xv_port)) {
xprintf(class->xine, XINE_VERBOSITY_NONE,
_("%s: could not open Xv port %d - autodetecting\n"),
LOG_MODULE, xv_port);
- xv_port = xv_autodetect_port(this, adaptors, adaptor_info, &adaptor_num, xv_port);
+ xv_port = xv_autodetect_port(this, adaptors, adaptor_info, &adaptor_num, xv_port, prefer_type);
} else
adaptor_num = xv_find_adaptor_by_port (xv_port, adaptors, adaptor_info);
}
if (!xv_port)
- xv_port = xv_autodetect_port(this, adaptors, adaptor_info, &adaptor_num, 0);
+ xv_port = xv_autodetect_port(this, adaptors, adaptor_info, &adaptor_num, 0, prefer_type);
+ if (!xv_port)
+ xv_port = xv_autodetect_port(this, adaptors, adaptor_info, &adaptor_num, 0, xv_prefer_none);
if (!xv_port) {
xprintf(class->xine, XINE_VERBOSITY_LOG,
diff --git a/src/video_out/video_out_xxmc.c b/src/video_out/video_out_xxmc.c
index 1ef3652a9..bd8a76046 100644
--- a/src/video_out/video_out_xxmc.c
+++ b/src/video_out/video_out_xxmc.c
@@ -45,6 +45,7 @@ static void xxmc_frame_updates(xxmc_driver_t *driver, xxmc_frame_t *frame,
static void dispose_ximage (xxmc_driver_t *this, XShmSegmentInfo *shminfo,
XvImage *myimage);
+static const char *const prefer_types[] = VIDEO_DEVICE_XV_PREFER_TYPES;
/*
* Acceleration level priority. Static for now. It may well turn out that IDCT
@@ -2263,11 +2264,15 @@ static XvPortID xxmc_autodetect_port(xxmc_driver_t *this,
unsigned int adaptors,
XvAdaptorInfo *adaptor_info,
unsigned int *adaptor_num,
- XvPortID base) {
+ XvPortID base,
+ xv_prefertype prefer_type)
+{
unsigned int an, j;
for (an = 0; an < adaptors; an++)
- if (adaptor_info[an].type & XvImageMask)
+ if (adaptor_info[an].type & XvImageMask &&
+ (prefer_type == xv_prefer_none ||
+ strcasestr (adaptor_info[an].name, prefer_types[prefer_type])))
for (j = 0; j < adaptor_info[an].num_ports; j++) {
XvPortID port = adaptor_info[an].base_id + j;
if (port >= base && xxmc_open_port(this, port)) {
@@ -2443,6 +2448,7 @@ static vo_driver_t *open_plugin (video_driver_class_t *class_gen, const void *vi
XvPortID xv_port;
XvAdaptorInfo *adaptor_info;
unsigned int adaptor_num;
+ xv_prefertype prefer_type;
cfg_entry_t *entry;
int use_more_frames;
int use_unscaled;
@@ -2480,19 +2486,24 @@ static vo_driver_t *open_plugin (video_driver_class_t *class_gen, const void *vi
xv_port = config->register_num (config, "video.device.xv_port", 0,
VIDEO_DEVICE_XV_PORT_HELP,
- 10, NULL, NULL);
+ 20, NULL, NULL);
+ prefer_type = config->register_enum (config, "video.device.xv_preferred_method", 0,
+ prefer_types, VIDEO_DEVICE_XV_PREFER_TYPE_HELP,
+ 10, NULL, NULL);
if (xv_port != 0) {
if (! xxmc_open_port(this, xv_port)) {
xprintf(class->xine, XINE_VERBOSITY_NONE,
_("%s: could not open Xv port %d - autodetecting\n"),
LOG_MODULE, xv_port);
- xv_port = xxmc_autodetect_port(this, adaptors, adaptor_info, &adaptor_num, xv_port);
+ xv_port = xxmc_autodetect_port(this, adaptors, adaptor_info, &adaptor_num, xv_port, prefer_type);
} else
adaptor_num = xxmc_find_adaptor_by_port (xv_port, adaptors, adaptor_info);
}
if (!xv_port)
- xv_port = xxmc_autodetect_port(this, adaptors, adaptor_info, &adaptor_num, 0);
+ xv_port = xxmc_autodetect_port(this, adaptors, adaptor_info, &adaptor_num, 0, prefer_type);
+ if (!xv_port)
+ xv_port = xxmc_autodetect_port(this, adaptors, adaptor_info, &adaptor_num, 0, xv_prefer_none);
if (!xv_port) {
xprintf(class->xine, XINE_VERBOSITY_LOG,
diff --git a/src/video_out/xv_common.h b/src/video_out/xv_common.h
index ee2ab9a10..259afe616 100644
--- a/src/video_out/xv_common.h
+++ b/src/video_out/xv_common.h
@@ -56,3 +56,14 @@
#define VIDEO_DEVICE_XV_PITCH_ALIGNMENT_HELP \
_("pitch alignment workaround"), \
_("Some buggy video drivers need a workaround to function properly.")
+
+typedef enum {
+ xv_prefer_none, xv_prefer_overlay, xv_prefer_textured
+} xv_prefertype;
+#define VIDEO_DEVICE_XV_PREFER_TYPES \
+ { "Any", "Overlay", "Textured Video", NULL }
+#define VIDEO_DEVICE_XV_PREFER_TYPE_HELP \
+ _("video display method preference"), \
+ _("Selects which video output method is preferred. " \
+ "Detection is done using the reported Xv adaptor names.\n" \
+ "(Only applies when auto-detecting which Xv port to use.)")
diff --git a/src/xine-engine/buffer_types.c b/src/xine-engine/buffer_types.c
index b0e01db31..15b5ff952 100644
--- a/src/xine-engine/buffer_types.c
+++ b/src/xine-engine/buffer_types.c
@@ -808,6 +808,14 @@ static const audio_db_t audio_db[] = {
},
{
{
+ ME_FOURCC('a', 'd', 'u', 0x55),
+ 0
+ },
+ BUF_AUDIO_MP3ADU,
+ "MPEG layer-3 adu"
+},
+{
+ {
ME_FOURCC('t','w','o','s'),
ME_FOURCC('i','n','2','4'),
0
diff --git a/src/xine-engine/configfile.c b/src/xine-engine/configfile.c
index a41abf193..9f67b7503 100644
--- a/src/xine-engine/configfile.c
+++ b/src/xine-engine/configfile.c
@@ -1458,7 +1458,7 @@ static char* config_register_serialized_entry (config_values_t *this, const char
if (!bytes) goto exit;
if ((value_count < 0) || (value_count > 256)) goto exit;
- enum_values = malloc (sizeof(void*) * value_count + 1);
+ enum_values = calloc (value_count + 1, sizeof(void*));
for (i = 0; i < value_count; i++) {
pos += bytes = get_string(output, output_len, pos, &enum_values[i]);
if (!bytes) goto exit;
diff --git a/src/xine-engine/demux.c b/src/xine-engine/demux.c
index 232e0342e..e641bbf77 100644
--- a/src/xine-engine/demux.c
+++ b/src/xine-engine/demux.c
@@ -198,6 +198,7 @@ void _x_demux_control_headers_done (xine_stream_t *stream) {
}
stream->demux_action_pending = 0;
+ pthread_cond_signal(&stream->demux_resume);
lprintf ("headers processed.\n");
@@ -284,12 +285,14 @@ static void *demux_loop (void *stream_gen) {
/* someone may want to interrupt us */
if( stream->demux_action_pending ) {
- pthread_mutex_unlock( &stream->demux_lock );
+ struct timeval tv;
+ struct timespec ts;
- lprintf ("sched_yield\n");
-
- sched_yield();
- pthread_mutex_lock( &stream->demux_lock );
+ gettimeofday(&tv, NULL);
+ ts.tv_sec = tv.tv_sec;
+ ts.tv_nsec = (tv.tv_usec + 100000) * 1000;
+
+ pthread_cond_timedwait (&stream->demux_resume, &stream->demux_lock, &ts);
}
}
@@ -365,6 +368,7 @@ int _x_demux_start_thread (xine_stream_t *stream) {
stream->demux_action_pending = 1;
pthread_mutex_lock( &stream->demux_lock );
stream->demux_action_pending = 0;
+ pthread_cond_signal(&stream->demux_resume);
if( !stream->demux_thread_running ) {
@@ -396,6 +400,7 @@ int _x_demux_stop_thread (xine_stream_t *stream) {
pthread_mutex_lock( &stream->demux_lock );
stream->demux_thread_running = 0;
stream->demux_action_pending = 0;
+ pthread_cond_signal(&stream->demux_resume);
/* At that point, the demuxer has sent the last audio/video buffer,
* so it's a safe place to flush the engine.
diff --git a/src/xine-engine/load_plugins.c b/src/xine-engine/load_plugins.c
index 8e4a10a60..710e6dfbf 100644
--- a/src/xine-engine/load_plugins.c
+++ b/src/xine-engine/load_plugins.c
@@ -1339,11 +1339,13 @@ input_plugin_t *_x_find_input_plugin (xine_stream_t *stream, const char *mrl) {
void _x_free_input_plugin (xine_stream_t *stream, input_plugin_t *input) {
plugin_catalog_t *catalog = stream->xine->plugin_catalog;
+ plugin_node_t *node = input->node;
input->dispose(input);
- if (input->node) {
+
+ if (node) {
pthread_mutex_lock(&catalog->lock);
- dec_node_ref(input->node);
+ dec_node_ref(node);
pthread_mutex_unlock(&catalog->lock);
}
}
@@ -1560,11 +1562,13 @@ demux_plugin_t *_x_find_demux_plugin_last_probe(xine_stream_t *stream, const cha
void _x_free_demux_plugin (xine_stream_t *stream, demux_plugin_t *demux) {
plugin_catalog_t *catalog = stream->xine->plugin_catalog;
+ plugin_node_t *node = demux->node;
demux->dispose(demux);
- if (demux->node) {
+
+ if (node) {
pthread_mutex_lock(&catalog->lock);
- dec_node_ref(demux->node);
+ dec_node_ref(node);
pthread_mutex_unlock(&catalog->lock);
}
}
@@ -2054,12 +2058,13 @@ video_decoder_t *_x_get_video_decoder (xine_stream_t *stream, uint8_t stream_typ
void _x_free_video_decoder (xine_stream_t *stream, video_decoder_t *vd) {
plugin_catalog_t *catalog = stream->xine->plugin_catalog;
+ plugin_node_t *node = vd->node;
vd->dispose (vd);
- if (vd->node) {
+ if (node) {
pthread_mutex_lock (&catalog->lock);
- dec_node_ref(vd->node);
+ dec_node_ref(node);
pthread_mutex_unlock (&catalog->lock);
}
}
@@ -2403,7 +2408,7 @@ const char *const *xine_list_post_plugins_typed(xine_t *xine, uint32_t type) {
else \
return NULL; \
} \
- return dgettext(ic->textdomain ? : XINE_TEXTDOMAIN, ic->description); \
+ return dgettext(ic->text_domain ? : XINE_TEXTDOMAIN, ic->description); \
} \
} \
return NULL; \
diff --git a/src/xine-engine/xine.c b/src/xine-engine/xine.c
index c6dc8a2ce..5c8d0be9d 100644
--- a/src/xine-engine/xine.c
+++ b/src/xine-engine/xine.c
@@ -36,6 +36,7 @@
#include <stdarg.h>
#include <stdio.h>
#include <ctype.h>
+#include <unistd.h>
#if defined (__linux__) || defined (__GLIBC__)
#include <endian.h>
#elif defined (__FreeBSD__)
@@ -138,7 +139,7 @@ static int acquire_allowed_to_block(xine_ticket_t *this) {
unsigned new_size;
for(entry = 0; entry < this->holder_thread_count; ++entry) {
- if(this->holder_threads[entry].holder == own_id) {
+ if(pthread_equal(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);
@@ -209,7 +210,7 @@ static int release_allowed_to_block(xine_ticket_t *this) {
unsigned entry;
for(entry = 0; entry < this->holder_thread_count; ++entry) {
- if(this->holder_threads[entry].holder == own_id) {
+ if(pthread_equal(this->holder_threads[entry].holder, own_id)) {
this->holder_threads[entry].count--;
return this->holder_threads[entry].count == 0;
}
@@ -670,6 +671,7 @@ xine_stream_t *xine_stream_new (xine_t *this,
pthread_mutex_init (&stream->meta_mutex, NULL);
pthread_mutex_init (&stream->demux_lock, NULL);
pthread_mutex_init (&stream->demux_mutex, NULL);
+ pthread_cond_init (&stream->demux_resume, NULL);
pthread_mutex_init (&stream->event_queues_lock, NULL);
pthread_mutex_init (&stream->counter_lock, NULL);
pthread_cond_init (&stream->counter_changed, NULL);
@@ -839,6 +841,7 @@ static inline int _x_path_looks_like_mrl (const char *path)
static int open_internal (xine_stream_t *stream, const char *mrl) {
const char *stream_setup = NULL;
+ const char *mrl_proto = NULL;
int no_cache = 0;
if (!mrl) {
@@ -862,16 +865,31 @@ static int open_internal (xine_stream_t *stream, const char *mrl) {
/*
* look for a stream_setup in MRL and try finding an input plugin
*/
+ stream_setup = strchr (mrl, '#');
if (isalpha (*mrl))
{
- stream_setup = mrl + 1;
- while (isalnum (*stream_setup) || *stream_setup == '+' || *stream_setup == '-' || *stream_setup == '.')
- ++stream_setup;
- if (stream_setup[0] == ':' && stream_setup[1] == '/')
- stream_setup = strchr (mrl, '#');
- else
- stream_setup = NULL;
+ mrl_proto = mrl + 1;
+ while (isalnum (*mrl_proto) || *mrl_proto == '+' || *mrl_proto == '-' || *mrl_proto == '.')
+ ++mrl_proto;
+ if (!mrl_proto[0] || mrl_proto[0] != ':' || mrl_proto[1] != '/')
+ mrl_proto = NULL;
+ }
+
+ /* for raw filenames we must try every '#' checking if it is part of the filename */
+ if( !mrl_proto && stream_setup) {
+ struct stat stat_buf;
+ int res;
+
+ while( stream_setup ) {
+ char *raw_filename = strndup (mrl, stream_setup - mrl);
+
+ res = stat(raw_filename, &stat_buf);
+ free(raw_filename);
+ if( !res )
+ break;
+ stream_setup = strchr(stream_setup + 1, '#');
+ }
}
{
@@ -880,12 +898,14 @@ static int open_internal (xine_stream_t *stream, const char *mrl) {
/*
* find an input plugin
*/
-
- if ((stream->input_plugin = _x_find_input_plugin (stream, input_source))) {
+ stream->input_plugin = _x_find_input_plugin (stream, input_source);
+ free(input_source);
+
+ if ( stream->input_plugin ) {
int res;
xine_log (stream->xine, XINE_LOG_MSG, _("xine: found input plugin : %s\n"),
- dgettext(stream->input_plugin->input_class->textdomain ? : XINE_TEXTDOMAIN,
+ dgettext(stream->input_plugin->input_class->text_domain ? : XINE_TEXTDOMAIN,
stream->input_plugin->input_class->description));
if (stream->input_plugin->input_class->eject_media)
stream->eject_class = stream->input_plugin->input_class;
@@ -897,7 +917,6 @@ static int open_internal (xine_stream_t *stream, const char *mrl) {
case 1: /* Open successfull */
break;
case -1: /* Open unsuccessfull, but correct plugin */
- free(input_source);
stream->err = XINE_ERROR_INPUT_FAILED;
_x_flush_events_queues (stream);
return 0;
@@ -908,8 +927,6 @@ static int open_internal (xine_stream_t *stream, const char *mrl) {
stream->err = XINE_ERROR_INPUT_FAILED;
}
}
-
- free(input_source);
}
if (!stream->input_plugin) {
@@ -1235,7 +1252,7 @@ static int open_internal (xine_stream_t *stream, const char *mrl) {
}
xine_log (stream->xine, XINE_LOG_MSG, _("xine: found demuxer plugin: %s\n"),
- dgettext(stream->demux_plugin->demux_class->textdomain ? : XINE_TEXTDOMAIN,
+ dgettext(stream->demux_plugin->demux_class->text_domain ? : XINE_TEXTDOMAIN,
stream->demux_plugin->demux_class->description));
_x_extra_info_reset( stream->current_extra_info );
@@ -1351,6 +1368,7 @@ static int play_internal (xine_stream_t *stream, int start_pos, int start_time)
pthread_mutex_lock( &stream->demux_lock );
/* demux_lock taken. now demuxer is suspended */
stream->demux_action_pending = 0;
+ pthread_cond_signal(&stream->demux_resume);
/* set normal speed again (now that demuxer/input pair is suspended)
* some input plugin may have changed speed by itself, we must ensure
@@ -1477,6 +1495,7 @@ static void xine_dispose_internal (xine_stream_t *stream) {
pthread_mutex_destroy (&stream->current_extra_info_lock);
pthread_cond_destroy (&stream->counter_changed);
pthread_mutex_destroy (&stream->demux_mutex);
+ pthread_cond_destroy (&stream->demux_resume);
pthread_mutex_destroy (&stream->demux_lock);
pthread_mutex_destroy (&stream->first_frame_lock);
pthread_cond_destroy (&stream->first_frame_reached);
@@ -1691,6 +1710,12 @@ void xine_init (xine_t *this) {
/* First of all, initialise libxdg-basedir as it's used by plugins. */
this->basedir_handle = xdgAllocHandle();
+ /*
+ * locks
+ */
+ pthread_mutex_init (&this->streams_lock, NULL);
+ pthread_mutex_init (&this->log_lock, NULL);
+
/* initialize color conversion tables and functions */
init_yuv_conversion();
@@ -1772,12 +1797,6 @@ void xine_init (xine_t *this) {
this->streams = xine_list_new();
/*
- * locks
- */
- pthread_mutex_init (&this->streams_lock, NULL);
- pthread_mutex_init (&this->log_lock, NULL);
-
- /*
* start metronom clock
*/
@@ -1963,11 +1982,12 @@ int xine_get_pos_length (xine_stream_t *stream, int *pos_stream,
return 1;
}
-int xine_get_current_frame (xine_stream_t *stream, int *width, int *height,
- int *ratio_code, int *format,
- uint8_t *img) {
+static int _x_get_current_frame_impl (xine_stream_t *stream, int *width, int *height,
+ int *ratio_code, int *format,
+ uint8_t **img, int *size, int alloc_img) {
vo_frame_t *frame;
+ int required_size;
stream->xine->port_ticket->acquire(stream->xine->port_ticket, 0);
frame = stream->video_out->get_last_frame (stream->video_out);
@@ -1993,20 +2013,62 @@ int xine_get_current_frame (xine_stream_t *stream, int *width, int *height,
*format = frame->format;
- if (img){
+ switch (*format) {
+
+ case XINE_IMGFMT_YV12:
+ required_size = *width * *height
+ + ((*width + 1) / 2) * ((*height + 1) / 2)
+ + ((*width + 1) / 2) * ((*height + 1) / 2);
+ break;
+
+ case XINE_IMGFMT_YUY2:
+ required_size = *width * *height
+ + ((*width + 1) / 2) * *height
+ + ((*width + 1) / 2) * *height;
+ break;
+
+ default:
+ if (*img || alloc_img) {
+ xprintf (stream->xine, XINE_VERBOSITY_DEBUG,
+ "xine: error, snapshot function not implemented for format 0x%x\n", frame->format);
+ _x_abort ();
+ }
+
+ required_size = 0;
+ }
+
+ if (alloc_img) {
+ /* return size if requested */
+ if (size)
+ *size = required_size;
+ /* allocate img or fail */
+ if (!(*img = xine_xmalloc (required_size)))
+ return 0;
+ } else {
+ /* fail if supplied buffer is to small */
+ if (*img && size && *size < required_size) {
+ *size = required_size;
+ return 0;
+ }
+ /* return size if requested */
+ if (size)
+ *size = required_size;
+ }
+
+ if (*img) {
switch (frame->format) {
case XINE_IMGFMT_YV12:
yv12_to_yv12(
/* Y */
frame->base[0], frame->pitches[0],
- img, frame->width,
+ *img, frame->width,
/* U */
frame->base[1], frame->pitches[1],
- img+frame->width*frame->height, frame->width/2,
+ *img+frame->width*frame->height, frame->width/2,
/* V */
frame->base[2], frame->pitches[2],
- img+frame->width*frame->height+frame->width*frame->height/4, frame->width/2,
+ *img+frame->width*frame->height+frame->width*frame->height/4, frame->width/2,
/* width x height */
frame->width, frame->height);
break;
@@ -2016,7 +2078,7 @@ int xine_get_current_frame (xine_stream_t *stream, int *width, int *height,
/* src */
frame->base[0], frame->pitches[0],
/* dst */
- img, frame->width*2,
+ *img, frame->width*2,
/* width x height */
frame->width, frame->height);
break;
@@ -2030,6 +2092,25 @@ int xine_get_current_frame (xine_stream_t *stream, int *width, int *height,
return 1;
}
+int xine_get_current_frame_alloc (xine_stream_t *stream, int *width, int *height,
+ int *ratio_code, int *format,
+ uint8_t **img, int *size) {
+ uint8_t *no_img = NULL;
+ return _x_get_current_frame_impl(stream, width, height, ratio_code, format, img ? img : &no_img, size, img != NULL);
+}
+
+int xine_get_current_frame_s (xine_stream_t *stream, int *width, int *height,
+ int *ratio_code, int *format,
+ uint8_t *img, int *size) {
+ return (!img || size) && _x_get_current_frame_impl(stream, width, height, ratio_code, format, &img, size, 0);
+}
+
+int xine_get_current_frame (xine_stream_t *stream, int *width, int *height,
+ int *ratio_code, int *format,
+ uint8_t *img) {
+ return _x_get_current_frame_impl(stream, width, height, ratio_code, format, &img, NULL, 0);
+}
+
int xine_get_video_frame (xine_stream_t *stream,
int timestamp, /* msec */
int *width, int *height,
diff --git a/src/xine-utils/Makefile.am b/src/xine-utils/Makefile.am
index 75cab2131..0c664b0be 100644
--- a/src/xine-utils/Makefile.am
+++ b/src/xine-utils/Makefile.am
@@ -32,3 +32,7 @@ libxineutils_la_SOURCES = $(pppc_files) \
sorted_array.c \
pool.c \
ring_buffer.c
+
+noinst_PROGRAMS = xmltest
+xmltest_SOURCES = xmllexer.c xmlparser.c
+xmltest_CFLAGS = -DLOG -DXINE_XML_PARSER_TEST $(AM_CFLAGS)
diff --git a/src/xine-utils/xmllexer.c b/src/xine-utils/xmllexer.c
index 75a1aafec..394ca397f 100644
--- a/src/xine-utils/xmllexer.c
+++ b/src/xine-utils/xmllexer.c
@@ -445,6 +445,8 @@ int lexer_get_token_d(char ** _tok, int * _tok_size, int fixed) {
case '\"': /* " */
case ' ':
case '\t':
+ case '\n':
+ case '\r':
case '=':
case '/':
tok[tok_pos] = '\0';
diff --git a/src/xine-utils/xmlparser.c b/src/xine-utils/xmlparser.c
index 8ef828105..0c3d12f59 100644
--- a/src/xine-utils/xmlparser.c
+++ b/src/xine-utils/xmlparser.c
@@ -837,3 +837,73 @@ void xml_parser_dump_tree (const xml_node_t *node) {
node = node->next;
} while (node);
}
+
+#ifdef XINE_XML_PARSER_TEST
+#include <sys/mman.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+void *xine_xmalloc (size_t size)
+{
+ return malloc (size);
+}
+
+int main (int argc, char **argv)
+{
+ int i, ret = 0;
+ for (i = 1; argv[i]; ++i)
+ {
+ xml_node_t *tree;
+ int fd;
+ void *buf;
+ struct stat st;
+
+ if (stat (argv[i], &st))
+ {
+ perror (argv[i]);
+ ret = 1;
+ continue;
+ }
+ if (!S_ISREG (st.st_mode))
+ {
+ printf ("%s: not a file\n", argv[i]);
+ ret = 1;
+ continue;
+ }
+ fd = open (argv[i], O_RDONLY);
+ if (!fd)
+ {
+ perror (argv[i]);
+ ret = 1;
+ continue;
+ }
+ buf = mmap (NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0);
+ if (!buf)
+ {
+ perror (argv[i]);
+ if (close (fd))
+ perror (argv[i]);
+ ret = 1;
+ continue;
+ }
+
+ xml_parser_init (buf, st.st_size, 0);
+ if (!xml_parser_build_tree (&tree))
+ {
+ puts (argv[i]);
+ xml_parser_dump_tree (tree);
+ xml_parser_free_tree (tree);
+ }
+ else
+ printf ("%s: parser failure\n", argv[i]);
+
+ if (close (fd))
+ {
+ perror (argv[i]);
+ ret = 1;
+ }
+ }
+ return ret;
+}
+#endif
diff --git a/version.sh b/version.sh
index 9e5611126..9db0b1562 100755
--- a/version.sh
+++ b/version.sh
@@ -32,6 +32,8 @@ XINE_VERSION_MAJOR=1
XINE_VERSION_MINOR=1
XINE_VERSION_SUB=90
XINE_VERSION_PATCH=
+# Release series number (usually $XINE_MAJOR.$XINE_MINOR)
+XINE_VERSION_SERIES=1.2
XINE_LT_CURRENT=2
XINE_LT_REVISION=0
@@ -50,6 +52,7 @@ echo "m4_define([XINE_VERSION_SUB], [${XINE_VERSION_SUB}])dnl"
echo "m4_define([XINE_VERSION_PATCH], [${XINE_VERSION_PATCH}])dnl"
echo "m4_define([XINE_VERSION_SUFFIX], [${XINE_VERSION_SUFFIX}])dnl"
echo "m4_define([XINE_VERSION_SPEC], [${XINE_VERSION_SPEC}])dnl"
+echo "m4_define([XINE_VERSION_SERIES], [${XINE_VERSION_SERIES}])dnl"
echo "m4_define([__XINE_LT_CURRENT], [${XINE_LT_CURRENT}])dnl"
echo "m4_define([__XINE_LT_REVISION], [${XINE_LT_REVISION}])dnl"
echo "m4_define([__XINE_LT_AGE], [${XINE_LT_AGE}])dnl"