mirror of
https://github.com/mpv-player/mpv
synced 2024-12-27 17:42:17 +00:00
fixes a crash and unchecked string-handling in ENCA code.
Also does a bit of cleanup. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@12910 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
bb98df0456
commit
57b8d5c7f6
@ -2018,7 +2018,7 @@ demux_mkv_open (demuxer_t *demuxer)
|
||||
char *str;
|
||||
|
||||
#ifdef USE_ICONV
|
||||
subcp_open_noenca();
|
||||
subcp_open(NULL);
|
||||
#endif
|
||||
|
||||
stream_seek(s, s->start_pos);
|
||||
|
@ -1552,7 +1552,7 @@ extern "C" int demux_mkv_open(demuxer_t *demuxer) {
|
||||
qt_image_description_t *idesc;
|
||||
|
||||
#ifdef USE_ICONV
|
||||
subcp_open_noenca();
|
||||
subcp_open(NULL);
|
||||
#endif
|
||||
|
||||
s = demuxer->stream;
|
||||
|
@ -669,7 +669,7 @@ int demux_ogg_open(demuxer_t* demuxer) {
|
||||
sh_video_t* sh_v;
|
||||
|
||||
#ifdef USE_ICONV
|
||||
subcp_open_noenca();
|
||||
subcp_open(NULL);
|
||||
#endif
|
||||
|
||||
clear_sub = -1;
|
||||
|
59
subreader.c
59
subreader.c
@ -1041,36 +1041,33 @@ extern float sub_fps;
|
||||
#ifdef USE_ICONV
|
||||
static iconv_t icdsc = (iconv_t)(-1);
|
||||
|
||||
#ifdef HAVE_ENCA
|
||||
void subcp_open_noenca ()
|
||||
{
|
||||
char enca_lang[100], enca_fallback[100];
|
||||
if (sub_cp) {
|
||||
if (sscanf(sub_cp, "enca:%2s:%s", enca_lang, enca_fallback) == 2
|
||||
|| sscanf(sub_cp, "ENCA:%2s:%s", enca_lang, enca_fallback) == 2) {
|
||||
subcp_open(enca_fallback);
|
||||
} else {
|
||||
subcp_open(sub_cp);
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
void subcp_open_noenca ()
|
||||
{
|
||||
subcp_open(sub_cp);
|
||||
}
|
||||
#endif
|
||||
|
||||
void subcp_open (char *current_sub_cp)
|
||||
void subcp_open (FILE *enca_fd)
|
||||
{
|
||||
char *tocp = "UTF-8";
|
||||
|
||||
if (current_sub_cp){
|
||||
if ((icdsc = iconv_open (tocp, current_sub_cp)) != (iconv_t)(-1)){
|
||||
if (sub_cp){
|
||||
char *cp_tmp = sub_cp;
|
||||
#ifdef HAVE_ENCA
|
||||
char enca_lang[3], enca_fallback[100];
|
||||
int free_cp_tmp = 0;
|
||||
if (sscanf(sub_cp, "enca:%2s:%99s", enca_lang, enca_fallback) == 2
|
||||
|| sscanf(sub_cp, "ENCA:%2s:%99s", enca_lang, enca_fallback) == 2) {
|
||||
if (enca_fd) {
|
||||
cp_tmp = guess_cp(enca_fd, enca_lang, enca_fallback);
|
||||
free_cp_tmp = 1;
|
||||
} else {
|
||||
cp_tmp = enca_fallback;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if ((icdsc = iconv_open (tocp, cp_tmp)) != (iconv_t)(-1)){
|
||||
mp_msg(MSGT_SUBREADER,MSGL_V,"SUB: opened iconv descriptor.\n");
|
||||
sub_utf8 = 2;
|
||||
} else
|
||||
mp_msg(MSGT_SUBREADER,MSGL_ERR,"SUB: error opening iconv descriptor.\n");
|
||||
#ifdef HAVE_ENCA
|
||||
if (free_cp_tmp && cp_tmp) free(cp_tmp);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@ -1317,9 +1314,7 @@ sub_data* sub_read_file (char *filename, float fps) {
|
||||
int n_max, n_first, i, j, sub_first, sub_orig;
|
||||
subtitle *first, *second, *sub, *return_sub;
|
||||
sub_data *subt_data;
|
||||
char enca_lang[100], enca_fallback[100];
|
||||
int uses_time = 0, sub_num = 0, sub_errs = 0;
|
||||
char *current_sub_cp=NULL;
|
||||
struct subreader sr[]=
|
||||
{
|
||||
{ sub_read_line_microdvd, NULL, "microdvd" },
|
||||
@ -1351,17 +1346,6 @@ sub_data* sub_read_file (char *filename, float fps) {
|
||||
rewind (fd);
|
||||
|
||||
#ifdef USE_ICONV
|
||||
#ifdef HAVE_ENCA
|
||||
if (sscanf(sub_cp, "enca:%2s:%s", enca_lang, enca_fallback) == 2
|
||||
|| sscanf(sub_cp, "ENCA:%2s:%s", enca_lang, enca_fallback) == 2) {
|
||||
current_sub_cp = guess_cp(fd, enca_lang, enca_fallback);
|
||||
} else {
|
||||
current_sub_cp = sub_cp ? strdup(sub_cp) : NULL;
|
||||
}
|
||||
#else
|
||||
current_sub_cp = sub_cp ? strdup(sub_cp) : NULL;
|
||||
#endif
|
||||
|
||||
sub_utf8_prev=sub_utf8;
|
||||
{
|
||||
int l,k;
|
||||
@ -1374,10 +1358,9 @@ sub_data* sub_read_file (char *filename, float fps) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (k<0) subcp_open(current_sub_cp);
|
||||
if (k<0) subcp_open(fd);
|
||||
}
|
||||
#endif
|
||||
if (current_sub_cp) free(current_sub_cp);
|
||||
|
||||
sub_num=0;n_max=32;
|
||||
first=(subtitle *)malloc(n_max*sizeof(subtitle));
|
||||
|
@ -53,8 +53,9 @@ typedef struct {
|
||||
|
||||
sub_data* sub_read_file (char *filename, float pts);
|
||||
subtitle* subcp_recode1 (subtitle *sub);
|
||||
void subcp_open (char *current_sub_cp); /* for demux_ogg.c */
|
||||
void subcp_open_noenca (); /* for demux_ogg.c */
|
||||
// enca_fd is the file enca uses to determine the codepage.
|
||||
// setting to NULL disables enca.
|
||||
void subcp_open (FILE *enca_fd); /* for demux_ogg.c */
|
||||
void subcp_close (void); /* for demux_ogg.c */
|
||||
char ** sub_filenames(char *path, char *fname);
|
||||
void list_sub_file(sub_data* subd);
|
||||
|
Loading…
Reference in New Issue
Block a user