Mercurial > mplayer.hg
changeset 11350:007ec48cf146
Current mplayer (mine is mplayer-1.0-pre1cvs20031001) cannot play mms
stream with multibyte characters in the url.
There is a bug in string_utf16() of libmpdemux/asf_mmst_streaming.c:
the url encoding code is written for single-byte character only. It
just fill a zero byte between every two adjacent bytes of the url
string. This is wrong when the url string contains multi-byte
characters.
My patch is in the attachment, and has been tested working. It uses
iconv() to convert the url's encoding to utf-16 correctly. So can this
patch be accepted and commit into CVS?
patch by Wang WenRui <wangwr@mail.ustc.edu.cn>
author | attila |
---|---|
date | Sat, 01 Nov 2003 14:43:28 +0000 |
parents | 786407b1bc78 |
children | dce7219bed77 |
files | libmpdemux/asf_mmst_streaming.c |
diffstat | 1 files changed, 44 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/libmpdemux/asf_mmst_streaming.c Sat Nov 01 14:10:32 2003 +0000 +++ b/libmpdemux/asf_mmst_streaming.c Sat Nov 01 14:43:28 2003 +0000 @@ -22,6 +22,12 @@ #include <winsock2.h> #endif +#ifdef USE_ICONV +#include <locale.h> +#include <langinfo.h> +#include <iconv.h> +#endif + #include "url.h" #include "asf.h" @@ -103,6 +109,38 @@ } } +#ifdef USE_ICONV +static iconv_t url_conv; + +static void string_utf16_open() { + setlocale(LC_CTYPE, ""); + url_conv = iconv_open("UTF-16LE",nl_langinfo(CODESET)); +} + +static void string_utf16_close() { + + iconv_close(url_conv); +} + +static void string_utf16(char *dest, char *src, int len) { + size_t len1, len2; + char *ip, *op; + + memset(dest, 0, 1000); + len1 = len; len2 = 1000; + ip = src; op = dest; + + iconv(url_conv, &ip, &len1, &op, &len2); +} + +#else + +static void string_utf16_open() { +} + +static void string_utf16_close() { +} + static void string_utf16(char *dest, char *src, int len) { int i; @@ -116,6 +154,7 @@ dest[i*2] = 0; dest[i*2+1] = 0; } +#endif static void get_answer (int s) { @@ -462,6 +501,9 @@ * cmd 1 0x01 * */ + /* prepare for the url encoding conversion */ + string_utf16_open(); + snprintf (str, 1023, "\034\003NSPlayer/7.0.0.1956; {33715801-BAB3-9D85-24E9-03B90328270A}; Host: %s", url1->hostname); string_utf16 (data, str, strlen(str)); // send_command(s, commandno ....) @@ -557,5 +599,7 @@ packet_length1 = packet_length; printf("mmst packet_length = %d\n",packet_length); + string_utf16_close(); + return 0; }