From: Miguel F. <mig...@us...> - 2004-12-08 17:10:39
|
Update of /cvsroot/xine/xine-lib/src/libreal In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30376 Modified Files: audio_decoder.c xine_decoder.c Log Message: - patch from mandrake folks to use realplayer libraries on amd64 - use autodetected path as config's default. this way, user can safely move or update the real stuff without having to play with config entries. Index: audio_decoder.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libreal/audio_decoder.c,v retrieving revision 1.40 retrieving revision 1.41 diff -u -r1.40 -r1.41 --- audio_decoder.c 21 Sep 2004 14:23:20 -0000 1.40 +++ audio_decoder.c 8 Dec 2004 17:10:29 -0000 1.41 @@ -32,6 +32,9 @@ #include <fcntl.h> #include <unistd.h> #include <dlfcn.h> +#ifdef __x86_64__ + #include <elf.h> +#endif #define LOG_MODULE "real_audio_decoder" #define LOG_VERBOSE @@ -118,6 +121,49 @@ free (foo); } +#ifdef __x86_64__ +/* (gb) quick-n-dirty check to be run natively */ +static int is_x86_64_object_(FILE *f) +{ + Elf64_Ehdr *hdr = malloc(sizeof(Elf64_Ehdr)); + if (hdr == NULL) + return 0; + + if (fseek(f, 0, SEEK_SET) != 0) { + free(hdr); + return 0; + } + + if (fread(hdr, sizeof(Elf64_Ehdr), 1, f) != 1) { + free(hdr); + return 0; + } + + if (hdr->e_ident[EI_MAG0] != ELFMAG0 || + hdr->e_ident[EI_MAG1] != ELFMAG1 || + hdr->e_ident[EI_MAG2] != ELFMAG2 || + hdr->e_ident[EI_MAG3] != ELFMAG3) { + free(hdr); + return 0; + } + + return hdr->e_machine == EM_X86_64; +} + +static inline int is_x86_64_object(const char *filename) +{ + FILE *f; + int ret; + + if ((f = fopen(filename, "r")) == NULL) + return 0; + + ret = is_x86_64_object_(f); + fclose(f); + return ret; +} +#endif + static int load_syms_linux (realdec_decoder_t *this, char *codec_name) { cfg_entry_t* entry = this->stream->xine->config->lookup_entry( @@ -126,6 +172,12 @@ snprintf (path, sizeof(path), "%s/%s", entry->str_value, codec_name); +#ifdef __x86_64__ + /* check whether it's a real x86-64 library */ + if (!is_x86_64_object(path)) + return 0; +#endif + lprintf ("(audio) opening shared obj '%s'\n", path); this->ra_handle = dlopen (path, RTLD_LAZY); @@ -645,6 +697,8 @@ real_class_t *this; config_values_t *config = xine->config; char *real_codec_path; + char *default_real_codec_path = ""; + struct stat s; this = (real_class_t *) xine_xmalloc (sizeof (real_class_t)); @@ -653,8 +707,27 @@ this->decoder_class.get_description = get_description; this->decoder_class.dispose = dispose_class; + /* try some auto-detection */ + + if (!stat ("/usr/local/RealPlayer8/Codecs/drv3.so.6.0", &s)) + default_real_codec_path = "/usr/local/RealPlayer8/Codecs"; + if (!stat ("/usr/RealPlayer8/Codecs/drv3.so.6.0", &s)) + default_real_codec_path = "/usr/RealPlayer8/Codecs"; + if (!stat ("/usr/lib/RealPlayer8/Codecs/drv3.so.6.0", &s)) + default_real_codec_path = "/usr/lib/RealPlayer8/Codecs"; + if (!stat ("/opt/RealPlayer8/Codecs/drv3.so.6.0", &s)) + default_real_codec_path = "/opt/RealPlayer8/Codecs"; + if (!stat ("/usr/lib/RealPlayer9/users/Real/Codecs/drv3.so.6.0", &s)) + default_real_codec_path = "/usr/lib/RealPlayer9/users/Real/Codecs"; + if (!stat ("/usr/lib64/RealPlayer8/Codecs/drv3.so.6.0", &s)) + default_real_codec_path = "/usr/lib64/RealPlayer8/Codecs"; + if (!stat ("/usr/lib64/RealPlayer9/users/Real/Codecs/drv3.so.6.0", &s)) + default_real_codec_path = "/usr/lib64/RealPlayer9/users/Real/Codecs"; + if (!stat ("/usr/lib/win32/drv3.so.6.0", &s)) + default_real_codec_path = "/usr/lib/win32"; + real_codec_path = config->register_string (config, "codec.real_codecs_path", - "unknown", + default_real_codec_path, _("path to RealPlayer codecs"), _("If you have RealPlayer installed, specify the path " "to its codec directory here. You can easily find " @@ -665,32 +738,6 @@ "how to install the codecs."), 10, NULL, this); - if (!strcmp (real_codec_path, "unknown")) { - - struct stat s; - - /* try some auto-detection */ - - if (!stat ("/usr/local/RealPlayer8/Codecs/drv3.so.6.0", &s)) - config->update_string (config, "codec.real_codecs_path", - "/usr/local/RealPlayer8/Codecs"); - if (!stat ("/usr/RealPlayer8/Codecs/drv3.so.6.0", &s)) - config->update_string (config, "codec.real_codecs_path", - "/usr/RealPlayer8/Codecs"); - if (!stat ("/usr/lib/RealPlayer8/Codecs/drv3.so.6.0", &s)) - config->update_string (config, "codec.real_codecs_path", - "/usr/lib/RealPlayer8/Codecs"); - if (!stat ("/opt/RealPlayer8/Codecs/drv3.so.6.0", &s)) - config->update_string (config, "codec.real_codecs_path", - "/opt/RealPlayer8/Codecs"); - if (!stat ("/usr/lib/RealPlayer9/users/Real/Codecs/drv3.so.6.0", &s)) - config->update_string (config, "codec.real_codecs_path", - "/usr/lib/RealPlayer9/users/Real/Codecs"); - if (!stat ("/usr/lib/win32/drv3.so.6.0", &s)) - config->update_string (config, "codec.real_codecs_path", - "/usr/lib/win32"); - } - lprintf ("real codec path : %s\n", real_codec_path); return this; Index: xine_decoder.c =================================================================== RCS file: /cvsroot/xine/xine-lib/src/libreal/xine_decoder.c,v retrieving revision 1.73 retrieving revision 1.74 diff -u -r1.73 -r1.74 --- xine_decoder.c 21 Sep 2004 14:23:20 -0000 1.73 +++ xine_decoder.c 8 Dec 2004 17:10:29 -0000 1.74 @@ -32,6 +32,9 @@ #include <fcntl.h> #include <unistd.h> #include <dlfcn.h> +#ifdef __x86_64__ + #include <elf.h> +#endif #define LOG_MODULE "real_decoder" #define LOG_VERBOSE @@ -103,6 +106,49 @@ void __builtin_vec_delete(void *mem); void __pure_virtual(void); +#ifdef __x86_64__ +/* (gb) quick-n-dirty check to be run natively */ +static int is_x86_64_object_(FILE *f) +{ + Elf64_Ehdr *hdr = malloc(sizeof(Elf64_Ehdr)); + if (hdr == NULL) + return 0; + + if (fseek(f, 0, SEEK_SET) != 0) { + free(hdr); + return 0; + } + + if (fread(hdr, sizeof(Elf64_Ehdr), 1, f) != 1) { + free(hdr); + return 0; + } + + if (hdr->e_ident[EI_MAG0] != ELFMAG0 || + hdr->e_ident[EI_MAG1] != ELFMAG1 || + hdr->e_ident[EI_MAG2] != ELFMAG2 || + hdr->e_ident[EI_MAG3] != ELFMAG3) { + free(hdr); + return 0; + } + + return hdr->e_machine == EM_X86_64; +} + +static inline int is_x86_64_object(const char *filename) +{ + FILE *f; + int ret; + + if ((f = fopen(filename, "r")) == NULL) + return 0; + + ret = is_x86_64_object_(f); + fclose(f); + return ret; +} +#endif + /* * real codec loader */ @@ -115,6 +161,12 @@ snprintf (path, sizeof(path), "%s/%s", entry->str_value, codec_name); +#ifdef __x86_64__ + /* check whether it's a real x86-64 library */ + if (!is_x86_64_object(path)) + return 0; +#endif + lprintf ("opening shared obj '%s'\n", path); this->rv_handle = dlopen (path, RTLD_LAZY); @@ -525,6 +577,8 @@ real_class_t *this; config_values_t *config = xine->config; char *real_codec_path; + char *default_real_codec_path = ""; + struct stat s; this = (real_class_t *) xine_xmalloc (sizeof (real_class_t)); @@ -533,8 +587,27 @@ this->decoder_class.get_description = get_description; this->decoder_class.dispose = dispose_class; + /* try some auto-detection */ + + if (!stat ("/usr/local/RealPlayer8/Codecs/drv3.so.6.0", &s)) + default_real_codec_path = "/usr/local/RealPlayer8/Codecs"; + if (!stat ("/usr/RealPlayer8/Codecs/drv3.so.6.0", &s)) + default_real_codec_path = "/usr/RealPlayer8/Codecs"; + if (!stat ("/usr/lib/RealPlayer8/Codecs/drv3.so.6.0", &s)) + default_real_codec_path = "/usr/lib/RealPlayer8/Codecs"; + if (!stat ("/opt/RealPlayer8/Codecs/drv3.so.6.0", &s)) + default_real_codec_path = "/opt/RealPlayer8/Codecs"; + if (!stat ("/usr/lib/RealPlayer9/users/Real/Codecs/drv3.so.6.0", &s)) + default_real_codec_path = "/usr/lib/RealPlayer9/users/Real/Codecs"; + if (!stat ("/usr/lib64/RealPlayer8/Codecs/drv3.so.6.0", &s)) + default_real_codec_path = "/usr/lib64/RealPlayer8/Codecs"; + if (!stat ("/usr/lib64/RealPlayer9/users/Real/Codecs/drv3.so.6.0", &s)) + default_real_codec_path = "/usr/lib64/RealPlayer9/users/Real/Codecs"; + if (!stat ("/usr/lib/win32/drv3.so.6.0", &s)) + default_real_codec_path = "/usr/lib/win32"; + real_codec_path = config->register_string (config, "codec.real_codecs_path", - "unknown", + default_real_codec_path, _("path to RealPlayer codecs"), _("If you have RealPlayer installed, specify the path " "to its codec directory here. You can easily find " @@ -544,32 +617,6 @@ "for you. Consult the xine FAQ for more information on " "how to install the codecs."), 10, NULL, this); - - if (!strcmp (real_codec_path, "unknown")) { - - struct stat s; - - /* try some auto-detection */ - - if (!stat ("/usr/local/RealPlayer8/Codecs/drv3.so.6.0", &s)) - config->update_string (config, "codec.real_codecs_path", - "/usr/local/RealPlayer8/Codecs"); - if (!stat ("/usr/RealPlayer8/Codecs/drv3.so.6.0", &s)) - config->update_string (config, "codec.real_codecs_path", - "/usr/RealPlayer8/Codecs"); - if (!stat ("/usr/lib/RealPlayer8/Codecs/drv3.so.6.0", &s)) - config->update_string (config, "codec.real_codecs_path", - "/usr/lib/RealPlayer8/Codecs"); - if (!stat ("/opt/RealPlayer8/Codecs/drv3.so.6.0", &s)) - config->update_string (config, "codec.real_codecs_path", - "/opt/RealPlayer8/Codecs"); - if (!stat ("/usr/lib/RealPlayer9/users/Real/Codecs/drv3.so.6.0", &s)) - config->update_string (config, "codec.real_codecs_path", - "/usr/lib/RealPlayer9/users/Real/Codecs"); - if (!stat ("/usr/lib/win32/drv3.so.6.0", &s)) - config->update_string (config, "codec.real_codecs_path", - "/usr/lib/win32"); - } lprintf ("real codec path : %s\n", real_codec_path); |