*** libmpdemux/demuxer.c.orig 2004-11-26 07:24:00.000000000 +0900 --- libmpdemux/demuxer.c 2004-12-17 15:33:18.000000000 +0900 *************** *** 21,26 **** --- 21,35 ---- #include "../libao2/afmt.h" #include "../libvo/fastmemcpy.h" + #ifdef USE_ICONV + #include + #include + #ifdef USE_LANGINFO + #include + #endif + #include + #endif + // Should be set to 1 by demux module if ids it passes to new_sh_audio and // new_sh_video don't match aids and vids it accepts from the command line int demux_aid_vid_mismatch = 0; *************** *** 1627,1644 **** return 1; } int demux_info_print(demuxer_t *demuxer) { char **info = demuxer->info; int n; if(!info) return 0; mp_msg(MSGT_DEMUX, MSGL_INFO,MSGTR_ClipInfo); ! for(n = 0; info[2*n] != NULL ; n++) mp_msg(MSGT_DEMUX, MSGL_INFO, " %s: %s\n",info[2*n],info[2*n+1]); return 0; } --- 1636,1730 ---- return 1; } + #ifdef USE_ICONV + static char * + iconv_string(iconv_t fd, char *str) + { + const char *from; + size_t fromlen; + char *to; + size_t tolen; + size_t len = 0; + size_t done = 0; + char *result = NULL; + char *p; + int l; + + from = (char *)str; + fromlen = strlen(from); + for (;;) + { + if (len == 0 || errno == E2BIG) + { + len = len + fromlen * 2 + 40; + p = (char*)malloc((unsigned)len); + if (p != NULL && done > 0) + memcpy(p, result, done); + free(result); + result = p; + if (result == NULL) + break; + } + + to = (char *)result + done; + tolen = len - done - 2; + if (iconv(fd, (void *)&from, &fromlen, &to, &tolen) != (size_t)-1) + { + *to = 0; + break; + } + if (errno == EILSEQ) + { + *to++ = '?'; + from ++; + fromlen --; + } + else if (errno != E2BIG) + { + free(result); + result = NULL; + break; + } + done = to - (char *)result; + } + return result; + } + #endif + int demux_info_print(demuxer_t *demuxer) { char **info = demuxer->info; int n; + #ifdef USE_LANGINFO + extern char* sub_cp; + iconv_t info_conv = (iconv_t)-1; + if (sub_cp && *sub_cp) { + #ifdef USE_LANGINFO + info_conv = iconv_open(nl_langinfo(CODESET), sub_cp); + #else + info_conv = iconv_open(setlocale(LC_CTYPE, NULL), sub_cp); + #endif + } + #endif if(!info) return 0; mp_msg(MSGT_DEMUX, MSGL_INFO,MSGTR_ClipInfo); ! #ifdef USE_ICONV ! if (info_conv != (iconv_t)-1) { ! for(n = 0; info[2*n] != NULL ; n++) { ! char *ptr = iconv_string(info_conv, info[2*n+1]); ! mp_msg(MSGT_DEMUX, MSGL_INFO, " %s: %s\n",info[2*n],ptr ? ptr : info[2*n+1]); ! if (ptr) free(ptr); ! } ! } else ! #endif mp_msg(MSGT_DEMUX, MSGL_INFO, " %s: %s\n",info[2*n],info[2*n+1]); + #ifdef USE_ICONV + iconv_close(info_conv); + #endif return 0; }