X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fcodec%2Fsubsdec.c;h=1b4276e299a2a6668047231d29ac705ae93076ba;hb=7307480b7a9b72d0f19a155216c608121a174a98;hp=20e677d71de2c03540065b6bd30a1c5c932b8ae0;hpb=744121f4461e064e2f26f406c64c9091c95d5e43;p=vlc diff --git a/modules/codec/subsdec.c b/modules/codec/subsdec.c index 20e677d71d..1b4276e299 100644 --- a/modules/codec/subsdec.c +++ b/modules/codec/subsdec.c @@ -1,5 +1,5 @@ /***************************************************************************** - * subsdec.c : text subtitles decoder + * subsdec.c : text subtitle decoder ***************************************************************************** * Copyright (C) 2000-2006 VLC authors and VideoLAN * $Id$ @@ -31,6 +31,9 @@ # include "config.h" #endif +#include +#include + #include #include #include @@ -161,13 +164,13 @@ static const int pi_justification[] = { 0, 1, 2 }; static const char *const ppsz_justification_text[] = { N_("Center"),N_("Left"),N_("Right")}; -#define ENCODING_TEXT N_("Subtitles text encoding") +#define ENCODING_TEXT N_("Subtitle text encoding") #define ENCODING_LONGTEXT N_("Set the encoding used in text subtitles") -#define ALIGN_TEXT N_("Subtitles justification") +#define ALIGN_TEXT N_("Subtitle justification") #define ALIGN_LONGTEXT N_("Set the justification of subtitles") -#define AUTODETECT_UTF8_TEXT N_("UTF-8 subtitles autodetection") +#define AUTODETECT_UTF8_TEXT N_("UTF-8 subtitle autodetection") #define AUTODETECT_UTF8_LONGTEXT N_("This enables automatic detection of " \ - "UTF-8 encoding within subtitles files.") + "UTF-8 encoding within subtitle files.") #define FORMAT_TEXT N_("Formatted Subtitles") #define FORMAT_LONGTEXT N_("Some subtitle formats allow for text formatting. " \ "VLC partly implements this, but you can choose to disable all formatting.") @@ -177,7 +180,7 @@ static void CloseDecoder ( vlc_object_t * ); vlc_module_begin () set_shortname( N_("Subtitles")) - set_description( N_("Text subtitles decoder") ) + set_description( N_("Text subtitle decoder") ) set_capability( "decoder", 50 ) set_callbacks( OpenDecoder, CloseDecoder ) set_category( CAT_INPUT ) @@ -306,7 +309,8 @@ static int OpenDecoder( vlc_object_t *p_this ) { p_sys->iconv_handle = vlc_iconv_open ("UTF-8", encoding); if (p_sys->iconv_handle == (vlc_iconv_t)(-1)) - msg_Err (p_dec, "cannot convert from %s: %m", encoding); + msg_Err (p_dec, "cannot convert from %s: %s", encoding, + vlc_strerror_c(errno)); } free (var); @@ -565,19 +569,32 @@ static char *StripTags( char *psz_subtitle ) * returned, and the rendering engine will fall back to the * plain text version of the subtitle. */ +/* TODO: highly suboptimal, offset should be cached */ static void HtmlNPut( char **ppsz_html, const char *psz_text, int i_max ) { - const int i_len = strlen(psz_text); + char *psz_html = *ppsz_html; + if( psz_html == NULL ) + return; + + const size_t i_offset = strlen(psz_html); + const size_t i_len = strnlen(psz_text, i_max); - strncpy( *ppsz_html, psz_text, i_max ); - *ppsz_html += __MIN(i_max,i_len); + psz_html = realloc( psz_html, i_offset + i_len + 1 ); + if( psz_html != NULL ) + { + memcpy( psz_html + i_offset, psz_text, i_len ); + psz_html[i_offset + i_len] = '\0'; + } + else + free( *ppsz_html ); + *ppsz_html = psz_html; } static void HtmlPut( char **ppsz_html, const char *psz_text ) { - strcpy( *ppsz_html, psz_text ); - *ppsz_html += strlen(psz_text); + HtmlNPut( ppsz_html, psz_text, INT_MAX ); } + static void HtmlCopy( char **ppsz_html, char **ppsz_subtitle, const char *psz_text ) { HtmlPut( ppsz_html, psz_text ); @@ -586,22 +603,17 @@ static void HtmlCopy( char **ppsz_html, char **ppsz_subtitle, const char *psz_te static char *CreateHtmlSubtitle( int *pi_align, char *psz_subtitle ) { - /* */ - char *psz_tag = malloc( ( strlen( psz_subtitle ) / 3 ) + 1 ); - if( !psz_tag ) + char *psz_tag = malloc( 1 ); + if( psz_tag == NULL ) return NULL; - psz_tag[ 0 ] = '\0'; - /* */ - //Oo + 100 ??? - size_t i_buf_size = strlen( psz_subtitle ) + 100; - char *psz_html_start = malloc( i_buf_size ); - char *psz_html = psz_html_start; - if( psz_html_start == NULL ) + char *psz_html = malloc( 1 ); + if( psz_html == NULL ) { free( psz_tag ); return NULL; } + psz_tag[0] = '\0'; psz_html[0] = '\0'; bool b_has_align = false; @@ -625,22 +637,22 @@ static char *CreateHtmlSubtitle( int *pi_align, char *psz_subtitle ) else if( !strncasecmp( psz_subtitle, "", 3 ) ) { HtmlCopy( &psz_html, &psz_subtitle, "" ); - strcat( psz_tag, "b" ); + HtmlPut( &psz_tag, "b" ); } else if( !strncasecmp( psz_subtitle, "", 3 ) ) { HtmlCopy( &psz_html, &psz_subtitle, "" ); - strcat( psz_tag, "i" ); + HtmlPut( &psz_tag, "i" ); } else if( !strncasecmp( psz_subtitle, "", 3 ) ) { HtmlCopy( &psz_html, &psz_subtitle, "" ); - strcat( psz_tag, "u" ); + HtmlPut( &psz_tag, "u" ); } else if( !strncasecmp( psz_subtitle, "", 3 ) ) { HtmlCopy( &psz_html, &psz_subtitle, "" ); - strcat( psz_tag, "s" ); + HtmlPut( &psz_tag, "s" ); } else if( !strncasecmp( psz_subtitle, "" ); psz_subtitle++; } else if( !strncmp( psz_subtitle, "= 0 ) @@ -768,8 +779,8 @@ static char *CreateHtmlSubtitle( int *pi_align, char *psz_subtitle ) if( !b_match ) { /* Not well formed -- kill everything */ - free( psz_html_start ); - psz_html_start = NULL; + free( psz_html ); + psz_html = NULL; break; } *psz_lastTag = '\0'; @@ -809,7 +820,7 @@ static char *CreateHtmlSubtitle( int *pi_align, char *psz_subtitle ) { /* We have the closing tag, ignore it TODO */ psz_subtitle = &psz_stop[1]; - strcat( psz_tag, "I" ); + HtmlPut( &psz_tag, "I" ); } else { @@ -823,7 +834,7 @@ static char *CreateHtmlSubtitle( int *pi_align, char *psz_subtitle ) else if( *psz_subtitle == '>' ) HtmlPut( &psz_html, ">" ); else - *psz_html++ = *psz_subtitle; + HtmlNPut( &psz_html, psz_subtitle, 1 ); } } } @@ -887,17 +898,17 @@ static char *CreateHtmlSubtitle( int *pi_align, char *psz_subtitle ) if( psz_subtitle[3] == 'i' ) { HtmlPut( &psz_html, "" ); - strcat( psz_tag, "i" ); + HtmlPut( &psz_tag, "i" ); } if( psz_subtitle[3] == 'b' ) { HtmlPut( &psz_html, "" ); - strcat( psz_tag, "b" ); + HtmlPut( &psz_tag, "b" ); } if( psz_subtitle[3] == 'u' ) { HtmlPut( &psz_html, "" ); - strcat( psz_tag, "u" ); + HtmlPut( &psz_tag, "u" ); } psz_subtitle = strchr( psz_subtitle, '}' ) + 1; } @@ -927,10 +938,12 @@ static char *CreateHtmlSubtitle( int *pi_align, char *psz_subtitle ) } else { - *psz_html = *psz_subtitle; - if( psz_html > psz_html_start ) + HtmlNPut( &psz_html, psz_subtitle, 1 ); +#if 0 + if( *psz_html ) { /* Check for double whitespace */ +# error This test does not make sense. if( ( *psz_html == ' ' || *psz_html == '\t' ) && ( *(psz_html-1) == ' ' || *(psz_html-1) == '\t' ) ) { @@ -938,70 +951,41 @@ static char *CreateHtmlSubtitle( int *pi_align, char *psz_subtitle ) psz_html--; } } - psz_html++; +#endif psz_subtitle++; } + } - if( ( size_t )( psz_html - psz_html_start ) > i_buf_size - 50 ) + while( psz_tag && *psz_tag ) + { + /* */ + char *psz_last = &psz_tag[strlen(psz_tag)-1]; + switch( *psz_last ) { - const int i_len = psz_html - psz_html_start; - - i_buf_size += 200; - char *psz_new = realloc( psz_html_start, i_buf_size ); - if( !psz_new ) + case 'b': + HtmlPut( &psz_html, "" ); + break; + case 'i': + HtmlPut( &psz_html, "" ); + break; + case 'u': + HtmlPut( &psz_html, "" ); + break; + case 's': + HtmlPut( &psz_html, "" ); + break; + case 'f': + HtmlPut( &psz_html, "" ); + break; + case 'I': break; - psz_html_start = psz_new; - psz_html = &psz_new[i_len]; } + *psz_last = '\0'; } - if( psz_html_start ) - { - static const char *psz_text_close = ""; - static const char *psz_tag_long = "/font>"; - - /* Realloc for closing tags and shrink memory */ - const size_t i_length = (size_t)( psz_html - psz_html_start ); - - const size_t i_size = i_length + strlen(psz_tag_long) * strlen(psz_tag) + strlen(psz_text_close) + 1; - char *psz_new = realloc( psz_html_start, i_size ); - if( psz_new ) - { - psz_html_start = psz_new; - psz_html = &psz_new[i_length]; - - /* Close not well formed subtitle */ - while( *psz_tag ) - { - /* */ - char *psz_last = &psz_tag[strlen(psz_tag)-1]; - switch( *psz_last ) - { - case 'b': - HtmlPut( &psz_html, "" ); - break; - case 'i': - HtmlPut( &psz_html, "" ); - break; - case 'u': - HtmlPut( &psz_html, "" ); - break; - case 's': - HtmlPut( &psz_html, "" ); - break; - case 'f': - HtmlPut( &psz_html, "" ); - break; - case 'I': - break; - } + /* Close not well formed subtitle */ + HtmlPut( &psz_html, "" ); - *psz_last = '\0'; - } - HtmlPut( &psz_html, psz_text_close ); - } - } free( psz_tag ); - return psz_html_start; + return psz_html; } -