I'd like to upload the attached NMU.
--
Adeodato Simó
EM: asp16 [ykwim] alu.ua.es | PK: DA6AE621
If there is a sin against life, it consists perhaps not so much in
despairing of life as in hoping for another life and in eluding the
implacable grandeur of this life.
-- Albert Camus
diff -u xine-lib-1.0.1/debian/changelog xine-lib-1.0.1/debian/changelog
--- xine-lib-1.0.1/debian/changelog
+++ xine-lib-1.0.1/debian/changelog
@@ -1,3 +1,33 @@
+xine-lib (1.0.1-1.3) unstable; urgency=low
+
+ * Non-maintainer upload.
+
+ * Backport patch from 1.0.2 that fixes hard hang-ups when a plugin listed in
+ ~/.xine/catalog.cache becomes unloadable (closes: #328454). Plugins can
+ become unloadable if DT_NEEDED libraries get uninstalled, which is
+ possible because the package lists many of these libraries in the
+ Recommends or Suggests fields only. With this fix, amarok should not
+ freeze with the XINE engine anymore (closes: #327203), and totem either
+ (closes: #328265).
+
+ Patch included in debian/patches/fix-hangs-at-load-time.diff, but since
+ there's no patch applying code in debian/rules, it's present in the
+ .diff.gz as well.
+
+ * Fix the script that invokes dpkg-shlibdeps to split dependencies among
+ Depends, Recommends, and Suggests: it generated empty fields if one of the
+ expected plugins was not actually available. (Closes: #328184)
+
+ This means that now the package now suggests libgnomevfs2-0 (closes:
+ #326935) and libflac7 (closes: #328168). Submitters may wish to reopen if
+ they want a discussion with the maintainer about the need of these being
+ strong Depends instead of Suggests.
+
+ * xineplug_flac.so now links against libflac7 instead of libflac6, which
+ closes: #325960 (the FLAC transition bug).
+
+ -- Adeodato Simó <[EMAIL PROTECTED]> Thu, 15 Sep 2005 14:54:50 +0200
+
xine-lib (1.0.1-1.2) unstable; urgency=low
* NMU.
diff -u xine-lib-1.0.1/debian/shlibdeps.sh xine-lib-1.0.1/debian/shlibdeps.sh
--- xine-lib-1.0.1/debian/shlibdeps.sh
+++ xine-lib-1.0.1/debian/shlibdeps.sh
@@ -48,13 +48,13 @@
for file in $RECOMMENDED; do
if test ! -f "$file"; then
echo "WARNING: non-existing file \"$file\" in RECOMMENDED list"
- RECOMMENDED=`echo "$var" | grep -v $file`
+ RECOMMENDED=`echo "$RECOMMENDED" | grep -v $file`
fi
done
for file in $OPTIONAL; do
if test ! -f "$file"; then
echo "WARNING: non-existing file \"$file\" in OPTIONAL list"
- OPTIONAL=`echo "$var" | grep -v $file`
+ OPTIONAL=`echo "$OPTIONAL" | grep -v $file`
fi
done
only in patch2:
unchanged:
--- xine-lib-1.0.1.orig/src/xine-engine/load_plugins.c
+++ xine-lib-1.0.1/src/xine-engine/load_plugins.c
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: load_plugins.c,v 1.193.2.2 2005/04/20 17:21:16 mroi Exp $
+ * $Id: load_plugins.c,v 1.193.2.5 2005/07/18 01:46:40 miguelfreitas Exp $
*
*
* Load input/demux/audio_out/video_out/codec plugins
@@ -42,6 +42,7 @@
#define LOG_MODULE "load_plugins"
#define LOG_VERBOSE
+
/*
#define LOG
*/
@@ -60,9 +61,10 @@
#include "xineutils.h"
#include "compat.h"
+#if 0
+
static char *plugin_name;
-#if 0
#if DONT_CATCH_SIGSEGV
#define install_segv_handler()
@@ -523,18 +525,18 @@
dir = opendir(path);
if (dir) {
struct dirent *pEntry;
- int path_len;
+ size_t path_len, str_size;
char *str = NULL;
path_len = strlen(path);
- str = malloc(path_len * 2 + 2); /* +2 for '/' and '\0' */
+ str_size = path_len * 2 + 2; /* +2 for '/' and '\0' */
+ str = malloc(str_size);
xine_fast_memcpy(str, path, path_len);
str[path_len] = '/';
str[path_len + 1] = '\0';
while ((pEntry = readdir (dir)) != NULL) {
- size_t str_size = 0;
- size_t new_str_size = 0;
+ size_t new_str_size;
void *lib = NULL;
plugin_info_t *info = NULL;
@@ -725,7 +727,8 @@
break;
}
node->plugin_class = NULL;
- dec_file_ref(node->file);
+ if (node->file)
+ dec_file_ref(node->file);
}
}
@@ -1132,28 +1135,27 @@
xine_t *xine = stream->xine;
plugin_catalog_t *catalog = xine->plugin_catalog;
plugin_node_t *node;
+ input_plugin_t *plugin = NULL;
pthread_mutex_lock (&catalog->lock);
node = xine_list_first_content (catalog->plugin_lists[PLUGIN_INPUT - 1]);
while (node) {
- input_plugin_t *plugin;
- if (!node->plugin_class && !_load_plugin_class(xine, node, NULL))
- return NULL;
- if ((plugin = ((input_class_t
*)node->plugin_class)->get_instance(node->plugin_class, stream, mrl))) {
- inc_node_ref(node);
- plugin->node = node;
- pthread_mutex_unlock (&catalog->lock);
- return plugin;
+ if (node->plugin_class || _load_plugin_class(xine, node, NULL)) {
+ if ((plugin = ((input_class_t
*)node->plugin_class)->get_instance(node->plugin_class, stream, mrl))) {
+ inc_node_ref(node);
+ plugin->node = node;
+ break;
+ }
}
-
+
node = xine_list_next_content
(stream->xine->plugin_catalog->plugin_lists[PLUGIN_INPUT - 1]);
}
pthread_mutex_unlock (&catalog->lock);
- return NULL;
+ return plugin;
}
@@ -1176,6 +1178,7 @@
int i;
int methods[3];
plugin_catalog_t *catalog = stream->xine->plugin_catalog;
+ demux_plugin_t *plugin = NULL;
methods[0] = method1;
methods[1] = method2;
@@ -1187,7 +1190,7 @@
}
i = 0;
- while (methods[i] != -1) {
+ while (methods[i] != -1 && !plugin) {
plugin_node_t *node;
@@ -1198,18 +1201,15 @@
node = xine_list_first_content (catalog->plugin_lists[PLUGIN_DEMUX - 1]);
while (node) {
- demux_plugin_t *plugin;
xprintf(stream->xine, XINE_VERBOSITY_DEBUG, "load_plugins: probing demux
'%s'\n", node->info->id);
- if (!node->plugin_class && !_load_plugin_class(stream->xine, node, NULL))
- return NULL;
-
- if ((plugin = ((demux_class_t
*)node->plugin_class)->open_plugin(node->plugin_class, stream, input))) {
- inc_node_ref(node);
- plugin->node = node;
- pthread_mutex_unlock (&catalog->lock);
- return plugin;
+ if (node->plugin_class || _load_plugin_class(stream->xine, node, NULL)) {
+ if ((plugin = ((demux_class_t
*)node->plugin_class)->open_plugin(node->plugin_class, stream, input))) {
+ inc_node_ref(node);
+ plugin->node = node;
+ break;
+ }
}
node = xine_list_next_content
(stream->xine->plugin_catalog->plugin_lists[PLUGIN_DEMUX - 1]);
@@ -1220,7 +1220,7 @@
i++;
}
- return NULL;
+ return plugin;
}
demux_plugin_t *_x_find_demux_plugin (xine_stream_t *stream, input_plugin_t
*input) {
@@ -1252,7 +1252,7 @@
plugin_catalog_t *catalog = stream->xine->plugin_catalog;
plugin_node_t *node;
- demux_plugin_t *plugin;
+ demux_plugin_t *plugin = NULL;
pthread_mutex_lock(&catalog->lock);
node = xine_list_first_content(catalog->plugin_lists[PLUGIN_DEMUX - 1]);
@@ -1260,21 +1260,19 @@
while (node) {
if (strcasecmp(node->info->id, name) == 0) {
- if (!node->plugin_class && !_load_plugin_class(stream->xine, node, NULL))
- return NULL;
-
- if ((plugin = ((demux_class_t
*)node->plugin_class)->open_plugin(node->plugin_class, stream, input))) {
- inc_node_ref(node);
- plugin->node = node;
- pthread_mutex_unlock (&catalog->lock);
- return plugin;
+ if (node->plugin_class || _load_plugin_class(stream->xine, node, NULL)) {
+ if ((plugin = ((demux_class_t
*)node->plugin_class)->open_plugin(node->plugin_class, stream, input))) {
+ inc_node_ref(node);
+ plugin->node = node;
+ break;
+ }
}
}
node = xine_list_next_content(catalog->plugin_lists[PLUGIN_DEMUX - 1]);
}
pthread_mutex_unlock(&catalog->lock);
- return NULL;
+ return plugin;
}
/*
@@ -1293,14 +1291,14 @@
xine_t *xine = stream->xine;
plugin_catalog_t *catalog = xine->plugin_catalog;
plugin_node_t *last_demux = NULL;
- demux_plugin_t *plugin;
+ demux_plugin_t *plugin = NULL;
methods[0] = METHOD_BY_CONTENT;
methods[1] = METHOD_BY_EXTENSION;
methods[2] = -1;
i = 0;
- while (methods[i] != -1) {
+ while (methods[i] != -1 && !plugin) {
plugin_node_t *node;
@@ -1319,16 +1317,14 @@
} else {
xprintf(stream->xine, XINE_VERBOSITY_DEBUG,
"load_plugin: probing '%s' (method %d)...\n", node->info->id,
stream->content_detection_method );
- if (!node->plugin_class && !_load_plugin_class(xine, node, NULL))
- return NULL;
-
- if ((plugin = ((demux_class_t
*)node->plugin_class)->open_plugin(node->plugin_class, stream, input))) {
- xprintf (stream->xine, XINE_VERBOSITY_DEBUG,
- "load_plugins: using demuxer '%s' (instead of '%s')\n",
node->info->id, last_demux_name);
- inc_node_ref(node);
- plugin->node = node;
- pthread_mutex_unlock (&catalog->lock);
- return plugin;
+ if (node->plugin_class || _load_plugin_class(xine, node, NULL)) {
+ if ((plugin = ((demux_class_t
*)node->plugin_class)->open_plugin(node->plugin_class, stream, input))) {
+ xprintf (stream->xine, XINE_VERBOSITY_DEBUG,
+ "load_plugins: using demuxer '%s' (instead of '%s')\n",
node->info->id, last_demux_name);
+ inc_node_ref(node);
+ plugin->node = node;
+ break;
+ }
}
}
@@ -1340,6 +1336,9 @@
i++;
}
+ if( plugin )
+ return plugin;
+
if( !last_demux )
return NULL;
@@ -1747,6 +1746,7 @@
plugin_node_t *node;
int i, j;
plugin_catalog_t *catalog = stream->xine->plugin_catalog;
+ video_decoder_t *vd = NULL;
lprintf ("looking for video decoder for streamtype %02x\n", stream_type);
@@ -1754,13 +1754,10 @@
for (i = 0; i < PLUGINS_PER_TYPE; i++) {
- video_decoder_t *vd=NULL;
-
node = catalog->video_decoder_map[stream_type][i];
if (!node) {
- pthread_mutex_unlock (&catalog->lock);
- return NULL;
+ break;
}
if (!node->plugin_class && !_load_plugin_class (stream->xine, node, NULL))
{
@@ -1784,8 +1781,7 @@
"load_plugins: plugin %s will be used for video streamtype %02x.\n",
node->info->id, stream_type);
- pthread_mutex_unlock (&catalog->lock);
- return vd;
+ break;
} else {
/* remove non working plugin from catalog */
xprintf(stream->xine, XINE_VERBOSITY_DEBUG,
@@ -1799,7 +1795,7 @@
}
pthread_mutex_unlock (&catalog->lock);
- return NULL;
+ return vd;
}
void _x_free_video_decoder (xine_stream_t *stream, video_decoder_t *vd) {
@@ -1821,6 +1817,7 @@
plugin_node_t *node;
int i, j;
plugin_catalog_t *catalog = stream->xine->plugin_catalog;
+ audio_decoder_t *ad = NULL;
lprintf ("looking for audio decoder for streamtype %02x\n", stream_type);
@@ -1828,13 +1825,10 @@
for (i = 0; i < PLUGINS_PER_TYPE; i++) {
- audio_decoder_t *ad;
-
node = catalog->audio_decoder_map[stream_type][i];
if (!node) {
- pthread_mutex_unlock (&catalog->lock);
- return NULL;
+ break;
}
if (!node->plugin_class && !_load_plugin_class (stream->xine, node, NULL))
{
@@ -1857,8 +1851,7 @@
xprintf(stream->xine, XINE_VERBOSITY_DEBUG,
"load_plugins: plugin %s will be used for audio streamtype %02x.\n",
node->info->id, stream_type);
- pthread_mutex_unlock (&catalog->lock);
- return ad;
+ break;
} else {
/* remove non working plugin from catalog */
xprintf(stream->xine, XINE_VERBOSITY_DEBUG,
@@ -1872,7 +1865,7 @@
}
pthread_mutex_unlock (&catalog->lock);
- return NULL;
+ return ad;
}
void _x_free_audio_decoder (xine_stream_t *stream, audio_decoder_t *ad) {
@@ -1942,7 +1935,7 @@
_unload_unref_plugins(self, self->plugin_catalog->plugin_lists[i]);
}
-#ifdef LOG
+#if 0
{
plugin_file_t *file;
@@ -1970,19 +1963,18 @@
plugin_node_t *node;
int i, j;
plugin_catalog_t *catalog = stream->xine->plugin_catalog;
+ spu_decoder_t *sd = NULL;
lprintf ("looking for spu decoder for streamtype %02x\n", stream_type);
pthread_mutex_lock (&catalog->lock);
for (i = 0; i < PLUGINS_PER_TYPE; i++) {
- spu_decoder_t *sd;
node = catalog->spu_decoder_map[stream_type][i];
if (!node) {
- pthread_mutex_unlock (&catalog->lock);
- return NULL;
+ break;
}
if (!node->plugin_class && !_load_plugin_class (stream->xine, node, NULL))
{
@@ -2005,8 +1997,7 @@
xprintf(stream->xine, XINE_VERBOSITY_DEBUG,
"load_plugins: plugin %s will be used for spu streamtype %02x.\n",
node->info->id, stream_type);
- pthread_mutex_unlock (&catalog->lock);
- return sd;
+ break;
} else {
/* remove non working plugin from catalog */
xprintf(stream->xine, XINE_VERBOSITY_DEBUG,
@@ -2020,7 +2011,7 @@
}
pthread_mutex_unlock (&catalog->lock);
- return NULL;
+ return sd;
}
void _x_free_spu_decoder (xine_stream_t *stream, spu_decoder_t *sd) {
@@ -2150,6 +2141,7 @@
xine_video_port_t **video_target) {
plugin_catalog_t *catalog = xine->plugin_catalog;
plugin_node_t *node;
+ post_plugin_t *post = NULL;
if( !name )
return NULL;
@@ -2160,13 +2152,11 @@
while (node) {
if (strcmp(node->info->id, name) == 0) {
- post_plugin_t *post;
if (!node->plugin_class && !_load_plugin_class(xine, node, NULL)) {
xprintf(xine, XINE_VERBOSITY_DEBUG,
"load_plugins: requested post plugin %s failed to load\n",
name);
- pthread_mutex_unlock(&catalog->lock);
- return NULL;
+ break;
}
post = ((post_class_t
*)node->plugin_class)->open_plugin(node->plugin_class,
@@ -2181,7 +2171,6 @@
post->xine = xine;
post->node = node;
inc_node_ref(node);
- pthread_mutex_unlock(&catalog->lock);
/* init the lists of announced connections */
i = 0;
@@ -2217,12 +2206,11 @@
/* copy the post plugin type to the public part */
post->xine_post.type = ((post_info_t *)node->info->special_info)->type;
- return &post->xine_post;
+ break;
} else {
xprintf(xine, XINE_VERBOSITY_DEBUG,
"load_plugins: post plugin %s failed to instantiate itself\n",
name);
- pthread_mutex_unlock(&catalog->lock);
- return NULL;
+ break;
}
}
@@ -2231,8 +2219,12 @@
pthread_mutex_unlock(&catalog->lock);
- xprintf(xine, XINE_VERBOSITY_DEBUG, "load_plugins: no post plugin named %s
found\n", name);
- return NULL;
+ if(post)
+ return &post->xine_post;
+ else {
+ xprintf(xine, XINE_VERBOSITY_DEBUG, "load_plugins: no post plugin named %s
found\n", name);
+ return NULL;
+ }
}
void xine_post_dispose(xine_t *xine, xine_post_t *post_gen) {
only in patch2:
unchanged:
--- xine-lib-1.0.1.orig/debian/patches/fix-hangs-at-load-time.diff
+++ xine-lib-1.0.1/debian/patches/fix-hangs-at-load-time.diff
@@ -0,0 +1,439 @@
+diff -u -Nrua xine-lib-1.0.1/src/xine-engine/load_plugins.c
xine-lib-1.0.2/src/xine-engine/load_plugins.c
+--- xine-lib-1.0.1/src/xine-engine/load_plugins.c 2005-04-26
10:09:12.000000000 +0200
++++ xine-lib-1.0.2/src/xine-engine/load_plugins.c 2005-07-18
03:46:40.000000000 +0200
+@@ -17,7 +17,7 @@
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+- * $Id: load_plugins.c,v 1.193.2.2 2005/04/20 17:21:16 mroi Exp $
++ * $Id: load_plugins.c,v 1.193.2.5 2005/07/18 01:46:40 miguelfreitas Exp $
+ *
+ *
+ * Load input/demux/audio_out/video_out/codec plugins
+@@ -42,6 +42,7 @@
+
+ #define LOG_MODULE "load_plugins"
+ #define LOG_VERBOSE
++
+ /*
+ #define LOG
+ */
+@@ -60,9 +61,10 @@
+ #include "xineutils.h"
+ #include "compat.h"
+
++#if 0
++
+ static char *plugin_name;
+
+-#if 0
+ #if DONT_CATCH_SIGSEGV
+
+ #define install_segv_handler()
+@@ -523,18 +525,18 @@
+ dir = opendir(path);
+ if (dir) {
+ struct dirent *pEntry;
+- int path_len;
++ size_t path_len, str_size;
+ char *str = NULL;
+
+ path_len = strlen(path);
+- str = malloc(path_len * 2 + 2); /* +2 for '/' and '\0' */
++ str_size = path_len * 2 + 2; /* +2 for '/' and '\0' */
++ str = malloc(str_size);
+ xine_fast_memcpy(str, path, path_len);
+ str[path_len] = '/';
+ str[path_len + 1] = '\0';
+
+ while ((pEntry = readdir (dir)) != NULL) {
+- size_t str_size = 0;
+- size_t new_str_size = 0;
++ size_t new_str_size;
+ void *lib = NULL;
+ plugin_info_t *info = NULL;
+
+@@ -725,7 +727,8 @@
+ break;
+ }
+ node->plugin_class = NULL;
+- dec_file_ref(node->file);
++ if (node->file)
++ dec_file_ref(node->file);
+ }
+ }
+
+@@ -1132,28 +1135,27 @@
+ xine_t *xine = stream->xine;
+ plugin_catalog_t *catalog = xine->plugin_catalog;
+ plugin_node_t *node;
++ input_plugin_t *plugin = NULL;
+
+ pthread_mutex_lock (&catalog->lock);
+
+ node = xine_list_first_content (catalog->plugin_lists[PLUGIN_INPUT - 1]);
+ while (node) {
+- input_plugin_t *plugin;
+
+- if (!node->plugin_class && !_load_plugin_class(xine, node, NULL))
+- return NULL;
+- if ((plugin = ((input_class_t
*)node->plugin_class)->get_instance(node->plugin_class, stream, mrl))) {
+- inc_node_ref(node);
+- plugin->node = node;
+- pthread_mutex_unlock (&catalog->lock);
+- return plugin;
++ if (node->plugin_class || _load_plugin_class(xine, node, NULL)) {
++ if ((plugin = ((input_class_t
*)node->plugin_class)->get_instance(node->plugin_class, stream, mrl))) {
++ inc_node_ref(node);
++ plugin->node = node;
++ break;
++ }
+ }
+-
++
+ node = xine_list_next_content
(stream->xine->plugin_catalog->plugin_lists[PLUGIN_INPUT - 1]);
+ }
+
+ pthread_mutex_unlock (&catalog->lock);
+
+- return NULL;
++ return plugin;
+ }
+
+
+@@ -1176,6 +1178,7 @@
+ int i;
+ int methods[3];
+ plugin_catalog_t *catalog = stream->xine->plugin_catalog;
++ demux_plugin_t *plugin = NULL;
+
+ methods[0] = method1;
+ methods[1] = method2;
+@@ -1187,7 +1190,7 @@
+ }
+
+ i = 0;
+- while (methods[i] != -1) {
++ while (methods[i] != -1 && !plugin) {
+
+ plugin_node_t *node;
+
+@@ -1198,18 +1201,15 @@
+ node = xine_list_first_content (catalog->plugin_lists[PLUGIN_DEMUX - 1]);
+
+ while (node) {
+- demux_plugin_t *plugin;
+
+ xprintf(stream->xine, XINE_VERBOSITY_DEBUG, "load_plugins: probing
demux '%s'\n", node->info->id);
+
+- if (!node->plugin_class && !_load_plugin_class(stream->xine, node,
NULL))
+- return NULL;
+-
+- if ((plugin = ((demux_class_t
*)node->plugin_class)->open_plugin(node->plugin_class, stream, input))) {
+- inc_node_ref(node);
+- plugin->node = node;
+- pthread_mutex_unlock (&catalog->lock);
+- return plugin;
++ if (node->plugin_class || _load_plugin_class(stream->xine, node, NULL))
{
++ if ((plugin = ((demux_class_t
*)node->plugin_class)->open_plugin(node->plugin_class, stream, input))) {
++ inc_node_ref(node);
++ plugin->node = node;
++ break;
++ }
+ }
+
+ node = xine_list_next_content
(stream->xine->plugin_catalog->plugin_lists[PLUGIN_DEMUX - 1]);
+@@ -1220,7 +1220,7 @@
+ i++;
+ }
+
+- return NULL;
++ return plugin;
+ }
+
+ demux_plugin_t *_x_find_demux_plugin (xine_stream_t *stream, input_plugin_t
*input) {
+@@ -1252,7 +1252,7 @@
+
+ plugin_catalog_t *catalog = stream->xine->plugin_catalog;
+ plugin_node_t *node;
+- demux_plugin_t *plugin;
++ demux_plugin_t *plugin = NULL;
+
+ pthread_mutex_lock(&catalog->lock);
+ node = xine_list_first_content(catalog->plugin_lists[PLUGIN_DEMUX - 1]);
+@@ -1260,21 +1260,19 @@
+
+ while (node) {
+ if (strcasecmp(node->info->id, name) == 0) {
+- if (!node->plugin_class && !_load_plugin_class(stream->xine, node,
NULL))
+- return NULL;
+-
+- if ((plugin = ((demux_class_t
*)node->plugin_class)->open_plugin(node->plugin_class, stream, input))) {
+- inc_node_ref(node);
+- plugin->node = node;
+- pthread_mutex_unlock (&catalog->lock);
+- return plugin;
++ if (node->plugin_class || _load_plugin_class(stream->xine, node, NULL))
{
++ if ((plugin = ((demux_class_t
*)node->plugin_class)->open_plugin(node->plugin_class, stream, input))) {
++ inc_node_ref(node);
++ plugin->node = node;
++ break;
++ }
+ }
+ }
+ node = xine_list_next_content(catalog->plugin_lists[PLUGIN_DEMUX - 1]);
+ }
+
+ pthread_mutex_unlock(&catalog->lock);
+- return NULL;
++ return plugin;
+ }
+
+ /*
+@@ -1293,14 +1291,14 @@
+ xine_t *xine = stream->xine;
+ plugin_catalog_t *catalog = xine->plugin_catalog;
+ plugin_node_t *last_demux = NULL;
+- demux_plugin_t *plugin;
++ demux_plugin_t *plugin = NULL;
+
+ methods[0] = METHOD_BY_CONTENT;
+ methods[1] = METHOD_BY_EXTENSION;
+ methods[2] = -1;
+
+ i = 0;
+- while (methods[i] != -1) {
++ while (methods[i] != -1 && !plugin) {
+
+ plugin_node_t *node;
+
+@@ -1319,16 +1317,14 @@
+ } else {
+ xprintf(stream->xine, XINE_VERBOSITY_DEBUG,
+ "load_plugin: probing '%s' (method %d)...\n", node->info->id,
stream->content_detection_method );
+- if (!node->plugin_class && !_load_plugin_class(xine, node, NULL))
+- return NULL;
+-
+- if ((plugin = ((demux_class_t
*)node->plugin_class)->open_plugin(node->plugin_class, stream, input))) {
+- xprintf (stream->xine, XINE_VERBOSITY_DEBUG,
+- "load_plugins: using demuxer '%s' (instead of '%s')\n",
node->info->id, last_demux_name);
+- inc_node_ref(node);
+- plugin->node = node;
+- pthread_mutex_unlock (&catalog->lock);
+- return plugin;
++ if (node->plugin_class || _load_plugin_class(xine, node, NULL)) {
++ if ((plugin = ((demux_class_t
*)node->plugin_class)->open_plugin(node->plugin_class, stream, input))) {
++ xprintf (stream->xine, XINE_VERBOSITY_DEBUG,
++ "load_plugins: using demuxer '%s' (instead of '%s')\n",
node->info->id, last_demux_name);
++ inc_node_ref(node);
++ plugin->node = node;
++ break;
++ }
+ }
+ }
+
+@@ -1340,6 +1336,9 @@
+ i++;
+ }
+
++ if( plugin )
++ return plugin;
++
+ if( !last_demux )
+ return NULL;
+
+@@ -1747,6 +1746,7 @@
+ plugin_node_t *node;
+ int i, j;
+ plugin_catalog_t *catalog = stream->xine->plugin_catalog;
++ video_decoder_t *vd = NULL;
+
+ lprintf ("looking for video decoder for streamtype %02x\n", stream_type);
+
+@@ -1754,13 +1754,10 @@
+
+ for (i = 0; i < PLUGINS_PER_TYPE; i++) {
+
+- video_decoder_t *vd=NULL;
+-
+ node = catalog->video_decoder_map[stream_type][i];
+
+ if (!node) {
+- pthread_mutex_unlock (&catalog->lock);
+- return NULL;
++ break;
+ }
+
+ if (!node->plugin_class && !_load_plugin_class (stream->xine, node,
NULL)) {
+@@ -1784,8 +1781,7 @@
+ "load_plugins: plugin %s will be used for video streamtype
%02x.\n",
+ node->info->id, stream_type);
+
+- pthread_mutex_unlock (&catalog->lock);
+- return vd;
++ break;
+ } else {
+ /* remove non working plugin from catalog */
+ xprintf(stream->xine, XINE_VERBOSITY_DEBUG,
+@@ -1799,7 +1795,7 @@
+ }
+
+ pthread_mutex_unlock (&catalog->lock);
+- return NULL;
++ return vd;
+ }
+
+ void _x_free_video_decoder (xine_stream_t *stream, video_decoder_t *vd) {
+@@ -1821,6 +1817,7 @@
+ plugin_node_t *node;
+ int i, j;
+ plugin_catalog_t *catalog = stream->xine->plugin_catalog;
++ audio_decoder_t *ad = NULL;
+
+ lprintf ("looking for audio decoder for streamtype %02x\n", stream_type);
+
+@@ -1828,13 +1825,10 @@
+
+ for (i = 0; i < PLUGINS_PER_TYPE; i++) {
+
+- audio_decoder_t *ad;
+-
+ node = catalog->audio_decoder_map[stream_type][i];
+
+ if (!node) {
+- pthread_mutex_unlock (&catalog->lock);
+- return NULL;
++ break;
+ }
+
+ if (!node->plugin_class && !_load_plugin_class (stream->xine, node,
NULL)) {
+@@ -1857,8 +1851,7 @@
+ xprintf(stream->xine, XINE_VERBOSITY_DEBUG,
+ "load_plugins: plugin %s will be used for audio streamtype
%02x.\n",
+ node->info->id, stream_type);
+- pthread_mutex_unlock (&catalog->lock);
+- return ad;
++ break;
+ } else {
+ /* remove non working plugin from catalog */
+ xprintf(stream->xine, XINE_VERBOSITY_DEBUG,
+@@ -1872,7 +1865,7 @@
+ }
+
+ pthread_mutex_unlock (&catalog->lock);
+- return NULL;
++ return ad;
+ }
+
+ void _x_free_audio_decoder (xine_stream_t *stream, audio_decoder_t *ad) {
+@@ -1942,7 +1935,7 @@
+ _unload_unref_plugins(self, self->plugin_catalog->plugin_lists[i]);
+ }
+
+-#ifdef LOG
++#if 0
+ {
+ plugin_file_t *file;
+
+@@ -1970,19 +1963,18 @@
+ plugin_node_t *node;
+ int i, j;
+ plugin_catalog_t *catalog = stream->xine->plugin_catalog;
++ spu_decoder_t *sd = NULL;
+
+ lprintf ("looking for spu decoder for streamtype %02x\n", stream_type);
+
+ pthread_mutex_lock (&catalog->lock);
+
+ for (i = 0; i < PLUGINS_PER_TYPE; i++) {
+- spu_decoder_t *sd;
+
+ node = catalog->spu_decoder_map[stream_type][i];
+
+ if (!node) {
+- pthread_mutex_unlock (&catalog->lock);
+- return NULL;
++ break;
+ }
+
+ if (!node->plugin_class && !_load_plugin_class (stream->xine, node,
NULL)) {
+@@ -2005,8 +1997,7 @@
+ xprintf(stream->xine, XINE_VERBOSITY_DEBUG,
+ "load_plugins: plugin %s will be used for spu streamtype %02x.\n",
+ node->info->id, stream_type);
+- pthread_mutex_unlock (&catalog->lock);
+- return sd;
++ break;
+ } else {
+ /* remove non working plugin from catalog */
+ xprintf(stream->xine, XINE_VERBOSITY_DEBUG,
+@@ -2020,7 +2011,7 @@
+ }
+
+ pthread_mutex_unlock (&catalog->lock);
+- return NULL;
++ return sd;
+ }
+
+ void _x_free_spu_decoder (xine_stream_t *stream, spu_decoder_t *sd) {
+@@ -2150,6 +2141,7 @@
+ xine_video_port_t **video_target) {
+ plugin_catalog_t *catalog = xine->plugin_catalog;
+ plugin_node_t *node;
++ post_plugin_t *post = NULL;
+
+ if( !name )
+ return NULL;
+@@ -2160,13 +2152,11 @@
+ while (node) {
+
+ if (strcmp(node->info->id, name) == 0) {
+- post_plugin_t *post;
+
+ if (!node->plugin_class && !_load_plugin_class(xine, node, NULL)) {
+ xprintf(xine, XINE_VERBOSITY_DEBUG,
+ "load_plugins: requested post plugin %s failed to load\n",
name);
+- pthread_mutex_unlock(&catalog->lock);
+- return NULL;
++ break;
+ }
+
+ post = ((post_class_t
*)node->plugin_class)->open_plugin(node->plugin_class,
+@@ -2181,7 +2171,6 @@
+ post->xine = xine;
+ post->node = node;
+ inc_node_ref(node);
+- pthread_mutex_unlock(&catalog->lock);
+
+ /* init the lists of announced connections */
+ i = 0;
+@@ -2217,12 +2206,11 @@
+ /* copy the post plugin type to the public part */
+ post->xine_post.type = ((post_info_t *)node->info->special_info)->type;
+
+- return &post->xine_post;
++ break;
+ } else {
+ xprintf(xine, XINE_VERBOSITY_DEBUG,
+ "load_plugins: post plugin %s failed to instantiate itself\n",
name);
+- pthread_mutex_unlock(&catalog->lock);
+- return NULL;
++ break;
+ }
+ }
+
+@@ -2231,8 +2219,12 @@
+
+ pthread_mutex_unlock(&catalog->lock);
+
+- xprintf(xine, XINE_VERBOSITY_DEBUG, "load_plugins: no post plugin named %s
found\n", name);
+- return NULL;
++ if(post)
++ return &post->xine_post;
++ else {
++ xprintf(xine, XINE_VERBOSITY_DEBUG, "load_plugins: no post plugin named
%s found\n", name);
++ return NULL;
++ }
+ }
+
+ void xine_post_dispose(xine_t *xine, xine_post_t *post_gen) {