Index: xine-lib-1.1.12/configure.ac =================================================================== --- xine-lib-1.1.12.orig/configure.ac +++ xine-lib-1.1.12/configure.ac @@ -2560,6 +2560,28 @@ fi AM_CONDITIONAL(HAVE_W32DLL, test "x$enable_w32dll" != "xno") +dnl --------------------------------------------- +dnl let distro override plugin install helper path +dnl --------------------------------------------- +AC_ARG_WITH(install-plugins-helper, + AC_HELP_STRING([--with-install-plugins-helper], + [specify path of helper script to call to install plugins]), + [ + case "${withval}" in + yes) AC_MSG_ERROR(bad value ${withval} for --with-install-plugins-helper) ;; + no) AC_MSG_ERROR(bad value ${withval} for --with-install-plugins-helper) ;; + *) XINE_INSTALL_PLUGINS_HELPER="${withval}" ;; + esac + ], + [ + dnl Default value + XINE_INSTALL_PLUGINS_HELPER="`makeexpand "${libexecdir}/xine-install-plugins-helper"`" + ] +) +AC_MSG_NOTICE(Using $XINE_INSTALL_PLUGINS_HELPER as plugin install helper) +AC_DEFINE_UNQUOTED(XINE_INSTALL_PLUGINS_HELPER, "$XINE_INSTALL_PLUGINS_HELPER", + [plugin install helper script]) +AC_SUBST(XINE_INSTALL_PLUGINS_HELPER) dnl --------------------------------------------- dnl some include paths ( !!! DO NOT REMOVE !!! ) Index: xine-lib-1.1.12/src/xine-engine/xine.c =================================================================== --- xine-lib-1.1.12.orig/src/xine-engine/xine.c +++ xine-lib-1.1.12/src/xine-engine/xine.c @@ -1780,6 +1780,15 @@ void xine_init (xine_t *this) { 0, NULL, this); /* + * enable/disable option for the plugins helper + */ + this->config->register_bool(this->config, + "media.plugins_helper", 1, + _("Run plugins helper"), + _("Searches the internet for missing plugins"), + 0, NULL, this); + + /* * keep track of all opened streams */ this->streams = xine_list_new(); Index: xine-lib-1.1.12/src/xine-engine/video_decoder.c =================================================================== --- xine-lib-1.1.12.orig/src/xine-engine/video_decoder.c +++ xine-lib-1.1.12/src/xine-engine/video_decoder.c @@ -37,6 +37,7 @@ #include "xine_internal.h" #include "xineutils.h" +#include "install_plugins_helper.h" #include #define SPU_SLEEP_INTERVAL (90000/2) @@ -376,6 +377,10 @@ static void *video_decoder_loop (void *s stream->video_decoder_plugin = _x_get_video_decoder (stream, streamtype); _x_stream_info_set(stream, XINE_STREAM_INFO_VIDEO_HANDLED, (stream->video_decoder_plugin != NULL)); + if(buf->type != buftype_unknown && !stream->video_decoder_plugin) + _x_install_plugins_helper(stream,"decoder-video", buf->type, _x_buf_video_name( buf->type )); + + } if (stream->video_decoder_plugin) Index: xine-lib-1.1.12/src/xine-engine/audio_decoder.c =================================================================== --- xine-lib-1.1.12.orig/src/xine-engine/audio_decoder.c +++ xine-lib-1.1.12/src/xine-engine/audio_decoder.c @@ -41,6 +41,7 @@ #include "xine_internal.h" #include "xineutils.h" +#include "install_plugins_helper.h" static void *audio_decoder_loop (void *stream_gen) { @@ -339,6 +340,10 @@ static void *audio_decoder_loop (void *s _x_stream_info_set(stream, XINE_STREAM_INFO_AUDIO_HANDLED, (stream->audio_decoder_plugin != NULL)); + + if(buf->type != buftype_unknown && !stream->audio_decoder_plugin) + _x_install_plugins_helper(stream,"decoder-audio", buf->type, _x_buf_audio_name( buf->type )); + } if (audio_type != stream->audio_type) { Index: xine-lib-1.1.12/src/xine-engine/Makefile.am =================================================================== --- xine-lib-1.1.12.orig/src/xine-engine/Makefile.am +++ xine-lib-1.1.12/src/xine-engine/Makefile.am @@ -19,7 +19,7 @@ libxine_la_SOURCES = xine.c metronom.c c video_overlay.c osd.c scratch.c demux.c vo_scale.c \ xine_interface.c post.c tvmode.c broadcaster.c io_helper.c \ input_rip.c input_cache.c info_helper.c refcounter.c \ - alphablend.c + alphablend.c install_plugins_helper.c # FIXME: these are currently unused: EXTRA_DIST = lrb.c lrb.h accel_xvmc.h @@ -39,7 +39,8 @@ xineinclude_HEADERS = buffer.h metronom audio_out.h resample.h video_out.h xine_internal.h spu_decoder.h \ video_overlay.h osd.h scratch.h xine_plugin.h xineintl.h \ plugin_catalog.h audio_decoder.h video_decoder.h post.h \ - io_helper.h broadcaster.h info_helper.h refcounter.h alphablend.h + io_helper.h broadcaster.h info_helper.h refcounter.h alphablend.h \ + install_plugins_helper.h noinst_HEADERS = bswap.h ffmpeg_bswap.h Index: xine-lib-1.1.12/src/xine-engine/install_plugins_helper.h =================================================================== --- /dev/null +++ xine-lib-1.1.12/src/xine-engine/install_plugins_helper.h @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2007 Sascha Sommer + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * helper functions to query the internet for additional codecs + */ + +#ifndef PLUGINS_HELPER_H +#define PLUGINS_HELPER_H + +#include +#include "xine_internal.h" + +/* + * execute install plugins helper + */ +void _x_install_plugins_helper(xine_stream_t *stream, char* plugin_type, uint32_t type, char* plugin_desc) XINE_PROTECTED; + + +#endif Index: xine-lib-1.1.12/src/xine-engine/install_plugins_helper.c =================================================================== --- /dev/null +++ xine-lib-1.1.12/src/xine-engine/install_plugins_helper.c @@ -0,0 +1,106 @@ +/* + * Copyright (C) 2007 Sascha Sommer + * + * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + * + * helper functions to query the internet for additional plugins + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include +#include +#include + +#include "install_plugins_helper.h" + +#define PROCNAME_LEN 100 + +static const char * +get_helper(xine_stream_t *stream) +{ + const char *helper; + + helper = getenv("XINE_INSTALL_PLUGINS_HELPER"); + if (helper == NULL) + helper = XINE_INSTALL_PLUGINS_HELPER; + + xine_log (stream->xine, XINE_LOG_MSG, + _("Using plugin install helper '%s'"), helper); + + return helper; +} + +static void +get_procname(char* procname, size_t len) +{ + char name[100]; + FILE* fp; + size_t pos = 0; + snprintf(name, sizeof(name), "/proc/%u/cmdline", getpid()); + + fp = fopen(name,"rb"); + if(fp){ + while(fp && !feof(fp) && pos < sizeof(name)-1){ + procname[pos] = fgetc(fp); + if(procname[pos] == ' ') /* ignore arguments */ + break; + if(procname[pos] == '/') /* ignore the path to the executable */ + pos = 0; + else + ++pos; + } + fclose(fp); + } + procname[pos] = '\0'; +} + + +void _x_install_plugins_helper(xine_stream_t* stream,char* plugin_type, uint32_t id, char* plugin_desc) +{ + xine_cfg_entry_t cfgentry; + char* helper = get_helper(stream); + FILE* fp; + + if(helper && xine_config_lookup_entry(stream->xine, "media.plugins_helper", &cfgentry) && cfgentry.num_value + && (fp = fopen(helper,"rb") )) { + char procname[PROCNAME_LEN]; +// char* procname = getenv("_"); /* might deliver /opt/kde3/bin/start_kdeinit_wrapper etc... */ + pid_t pid; + fclose(fp); + get_procname(procname,PROCNAME_LEN); + pid = fork(); + if(pid == 0) { + size_t len = 5 + strlen(XINE_VERSION) + 1 + strlen(procname) + 1 + strlen(plugin_desc) + 1 + strlen(plugin_type) + 1 + 100 + 1; + char* str = calloc(1,len + 1); + if(str){ + snprintf(str,len,"xine|%s|%s|%s|%s=%u",XINE_VERSION,procname,plugin_desc,plugin_type,id); + if(execl(helper,"xine-install-plugins-helper",str, NULL) == -1) + xine_log(stream->xine, XINE_LOG_MSG, + _("Couldn't start plugins_helper")); + free(str); + } + }else if(pid < 0){ + xine_log(stream->xine, XINE_LOG_MSG, + _("Couldn't fork")); + }else{ + waitpid(pid, NULL, 0); + } + } +} +