From 6b07c59f5b492d87fe4bfa6e7905fc4c406e33f2 Mon Sep 17 00:00:00 2001 From: eddyg Date: Mon, 28 Sep 2009 22:46:32 +0000 Subject: [PATCH] Fix soft sub tx4g markup to count multi-chr utf8 chrs as one chr. Also merges italic markup if adacent. git-svn-id: svn://localhost/HandBrake/trunk@2847 b64f7644-9d1e-0410-96f1-a4d463321fa5 --- libhb/muxmp4.c | 52 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/libhb/muxmp4.c b/libhb/muxmp4.c index d4107a07..7ab95bdc 100644 --- a/libhb/muxmp4.c +++ b/libhb/muxmp4.c @@ -599,10 +599,21 @@ static void hb_muxmp4_process_subtitle_style( uint8_t *input, uint8_t *reader = input; uint8_t *writer = output; uint8_t stylecount = 0; + uint16_t utf8_count = 0; // utf8 count from start of subtitle stylerecord *stylestack = NULL; stylerecord *oldrecord = NULL; while(*reader != '\0') { + if( ( *reader & 0xc0 ) == 0x80 ) + { + /* + * Track the utf8_count when doing markup so that we get the tx3g stops + * based on UTF8 chr counts rather than bytes. + */ + utf8_count++; + hb_deep_log( 3, "MuxMP4: Counted %d UTF-8 chrs within subtitle so far", + utf8_count); + } if (*reader == '<') { /* * possible markup, peek at the next chr @@ -611,7 +622,7 @@ static void hb_muxmp4_process_subtitle_style( uint8_t *input, case 'i': if (*(reader+2) == '>') { reader += 3; - hb_makestylerecord(&stylestack, ITALIC, writer-output); + hb_makestylerecord(&stylestack, ITALIC, (writer - output - utf8_count)); } else { *writer++ = *reader++; } @@ -619,7 +630,7 @@ static void hb_muxmp4_process_subtitle_style( uint8_t *input, case 'b': if (*(reader+2) == '>') { reader += 3; - hb_makestylerecord(&stylestack, BOLD, writer-output); + hb_makestylerecord(&stylestack, BOLD, (writer - output - utf8_count)); } else { *writer++ = *reader++; } @@ -627,7 +638,7 @@ static void hb_muxmp4_process_subtitle_style( uint8_t *input, case 'u': if (*(reader+2) == '>') { reader += 3; - hb_makestylerecord(&stylestack, UNDERLINE, writer-output); + hb_makestylerecord(&stylestack, UNDERLINE, (writer - output - utf8_count)); } else { *writer++ = *reader++; } @@ -636,9 +647,37 @@ static void hb_muxmp4_process_subtitle_style( uint8_t *input, switch(*(reader+2)) { case 'i': if (*(reader+3) == '>') { + /* + * Check whether we then immediately start more markup of the same type, if so then + * lets not close it now and instead continue this markup. + */ + if ((*(reader+4) && *(reader+4) == '<') && + (*(reader+5) && *(reader+5) == 'i') && + (*(reader+6) && *(reader+6) == '>')) { + /* + * Opening italics right after, so don't close off these italics. + */ + hb_deep_log(3, "Joining two sets of italics"); + reader += (4 + 3); + continue; + } + + + if ((*(reader+4) && *(reader+4) == ' ') && + (*(reader+5) && *(reader+5) == '<') && + (*(reader+6) && *(reader+6) == 'i') && + (*(reader+7) && *(reader+7) == '>')) { + /* + * Opening italics right after, so don't close off these italics. + */ + hb_deep_log(3, "Joining two sets of italics (plus space)"); + reader += (4 + 4); + *writer++ = ' '; + continue; + } if (stylestack && stylestack->style == ITALIC) { uint8_t style_record[12]; - stylestack->stop = writer - output; + stylestack->stop = writer - output - utf8_count; hb_makestyleatom(stylestack, style_record); memcpy(style + 10 + (12 * stylecount), style_record, 12); @@ -659,7 +698,7 @@ static void hb_muxmp4_process_subtitle_style( uint8_t *input, if (*(reader+3) == '>') { if (stylestack && stylestack->style == BOLD) { uint8_t style_record[12]; - stylestack->stop = writer - output; + stylestack->stop = writer - output - utf8_count - 1; hb_makestyleatom(stylestack, style_record); memcpy(style + 10 + (12 * stylecount), style_record, 12); @@ -680,7 +719,7 @@ static void hb_muxmp4_process_subtitle_style( uint8_t *input, if (*(reader+3) == '>') { if (stylestack && stylestack->style == UNDERLINE) { uint8_t style_record[12]; - stylestack->stop = writer - output; + stylestack->stop = writer - output - utf8_count - 1; hb_makestyleatom(stylestack, style_record); memcpy(style + 10 + (12 * stylecount), style_record, 12); @@ -928,7 +967,6 @@ static int MP4Mux( hb_mux_object_t * m, hb_mux_data_t * mux_data, } mux_data->sum_dur += (buf->stop - buf->start); - hb_deep_log(3, "MuxMP4:Total time elapsed:%"PRId64, mux_data->sum_dur); } } else -- 2.11.0