diff --git a/libmpdemux/demux_ogg.c b/libmpdemux/demux_ogg.c index d550e66d3c..9ed49ae333 100644 --- a/libmpdemux/demux_ogg.c +++ b/libmpdemux/demux_ogg.c @@ -231,6 +231,9 @@ void demux_ogg_add_sub (char* packet) { mp_msg(MSGT_DEMUX,MSGL_DBG2,"ogg sub lines: %d first: '%s'\n", ogg_sub.lines, ogg_sub.text[0]); +#ifdef USE_ICONV + subcp_recode1(&ogg_sub); +#endif vo_sub = &ogg_sub; vo_osd_changed(OSDTYPE_SUBTITLE); } @@ -465,6 +468,10 @@ int demux_ogg_open(demuxer_t* demuxer) { sh_audio_t* sh_a; sh_video_t* sh_v; +#ifdef USE_ICONV + subcp_open(); +#endif + s = demuxer->stream; ogg_d = (ogg_demuxer_t*)calloc(1,sizeof(ogg_demuxer_t)); @@ -1006,6 +1013,10 @@ void demux_close_ogg(demuxer_t* demuxer) { if(!ogg_d) return; +#ifdef USE_ICONV + subcp_close(); +#endif + if(ogg_d->subs) free(ogg_d->subs); if(ogg_d->syncpoints) diff --git a/subreader.c b/subreader.c index 50c4456b1d..2add84f7c8 100644 --- a/subreader.c +++ b/subreader.c @@ -964,6 +964,29 @@ subtitle* subcp_recode (subtitle *sub) return sub; } +// for demux_ogg.c: +subtitle* subcp_recode1 (subtitle *sub) +{ + int l=sub->lines; + size_t ileft, oleft; + char *op, *ip; + + while (l){ + ip = icbuffer; + op = sub->text[--l]; + strcpy(ip, op); + ileft = strlen(ip); + oleft = ICBUFFSIZE - 1; + + if (iconv(icdsc, &ip, &ileft, + &op, &oleft) == (size_t)(-1)) { + mp_msg(MSGT_SUBREADER,MSGL_WARN,"SUB: error recoding line.\n"); + return sub; + } + *op='\0' ; + } + return sub; +} #endif static void adjust_subs_time(subtitle* sub, float subtime, float fps, int block){ diff --git a/subreader.h b/subreader.h index 78bfd907ac..401a0cd0ad 100644 --- a/subreader.h +++ b/subreader.h @@ -38,6 +38,7 @@ typedef struct { } subtitle; subtitle* sub_read_file (char *filename, float pts); +subtitle* subcp_recode1 (subtitle *sub); char * sub_filename(char *path, char * fname); void list_sub_file(subtitle* subs); void dump_srt(subtitle* subs, float fps);