diff options
author | Darren Salt <linux@youmustbejoking.demon.co.uk> | 2008-04-09 18:28:49 +0100 |
---|---|---|
committer | Darren Salt <linux@youmustbejoking.demon.co.uk> | 2008-04-09 18:28:49 +0100 |
commit | 39939c95eff90545285a9a8f761d9fa6e9349358 (patch) | |
tree | b8ea1fa3f2ddf1627eeecbd889f47226b01a45d8 | |
parent | 19357940a57c565ebe319729bd08d6e4800aff5d (diff) | |
parent | 628c4cbd9d023e74a7c6805d7ec0f163f2c172d1 (diff) | |
download | xine-lib-39939c95eff90545285a9a8f761d9fa6e9349358.tar.gz xine-lib-39939c95eff90545285a9a8f761d9fa6e9349358.tar.bz2 |
Merge from 1.2 main.
88 files changed, 2991 insertions, 1516 deletions
@@ -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 @@ -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= @@ -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 @@ -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; +} @@ -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" |