From patchwork Mon Dec 19 03:05:18 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Erik_Br=C3=A5then_Solem?= X-Patchwork-Id: 1860 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.65.86 with SMTP id o83csp944188vsa; Sun, 18 Dec 2016 19:05:50 -0800 (PST) X-Received: by 10.194.86.165 with SMTP id q5mr11406020wjz.178.1482116750619; Sun, 18 Dec 2016 19:05:50 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id hk10si16789147wjb.17.2016.12.18.19.05.50; Sun, 18 Dec 2016 19:05:50 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@hotmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE dis=NONE) header.from=hotmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 26710689F6C; Mon, 19 Dec 2016 05:05:40 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from COL004-OMC1S9.hotmail.com (col004-omc1s9.hotmail.com [65.55.34.19]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 63DBA689F27 for ; Mon, 19 Dec 2016 05:05:32 +0200 (EET) Received: from EUR03-VE1-obe.outbound.protection.outlook.com ([65.55.34.8]) by COL004-OMC1S9.hotmail.com over TLS secured channel with Microsoft SMTPSVC(7.5.7601.23008); Sun, 18 Dec 2016 19:05:38 -0800 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotmail.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=KhTH2DSs6OA2QNbkJDZ7vyEn1GJEjqbdguhYA29FQHk=; b=SitTGSVeqmg699jrXbddQ3shLuBp983QGC3IOfPxCbn95aJ8uCXKGCUGHrMh7vd8YO1nth+KkV5PGhfH/MUD3Fdgz6Xr+Ili2cE9GQw1MOb2Pz47PL9udegc6uMsbVaVDxtQwiUfSbX8MpiZ3vWH0cIz1Zijsk9AmKfWY02IbpUIAWQ3MwlILqA65WUi8mY4ONpwDRvYyrVaPyJuEkECPIXSrEjQUVrVEFjLayMwxoT+NdYZBzMMYXxQTF0uDB+mYf8rhebqH6S7fvVUtCiYmHP2rq8OJdky0qt92kZcx8VEKILBtZrNhhSZTgHR76dSLtQA5QVBg78a5BNoR0WhSA== Received: from VE1EUR03FT009.eop-EUR03.prod.protection.outlook.com (10.152.18.56) by VE1EUR03HT068.eop-EUR03.prod.protection.outlook.com (10.152.18.206) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.761.6; Mon, 19 Dec 2016 03:05:18 +0000 Received: from VI1PR01MB1327.eurprd01.prod.exchangelabs.com (10.152.18.53) by VE1EUR03FT009.mail.protection.outlook.com (10.152.18.92) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.771.7 via Frontend Transport; Mon, 19 Dec 2016 03:05:18 +0000 Received: from VI1PR01MB1327.eurprd01.prod.exchangelabs.com ([10.162.119.17]) by VI1PR01MB1327.eurprd01.prod.exchangelabs.com ([10.162.119.17]) with mapi id 15.01.0789.018; Mon, 19 Dec 2016 03:05:18 +0000 From: =?iso-8859-1?Q?Erik_Br=E5then_Solem?= To: "ffmpeg-devel@ffmpeg.org" Thread-Topic: [PATCH 1/1] Updated version of patch 1840 (ticket 6021) Thread-Index: AQHSWaS6/TXaNfPUNki2dNEHxaGQJQ== Date: Mon, 19 Dec 2016 03:05:18 +0000 Message-ID: References: <20161219005755.GJ4749@nb4> In-Reply-To: <20161219005755.GJ4749@nb4> Accept-Language: nb-NO, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-slblob-mailprops: DJLbvgWm8MaORZsrM5+Sjyp6hBApj1hVo9kQ5y0wws8v+jSy/3yj6XgSwarX0WKPGQ2mfYxhzAfoMi76+r8q7yygQKLdYBYzJKLZzQGcggFuemtBTP+FfYU3hYVNN32y8SR0pqzuQgOXvQMENJK3azC4UTznRfaWT8zZIJRlhf7xj9Ae7qaBOQInzsWFkpc8U4fPNH28qrT4P/Mf6cIcDbmhtx4cRqex+i7wHBFfBhGJ58xaJXYwvKtmwKbv6/hCq4IWxk9YKkds2CV8o17hRe0EgrpxZVXNC88SEgGLkWs3lr259fJH3YL+AxfWO4qTH5qhcgYa7rbeQeq46zhxdwbuT9Nk3WP0fRG9wY4hXHVFf+LLXQHPA1CEu1pNg7hwqh0OFRLfhDlJY8NB5xVQyuvvzOaC6zXXItVCUV/xiFLjrnOrQNsdUOizCyS3lFcfye4fhx7vnEkCDpd1S9tujmQI9UIZYDJphebv/9eRDRmIfNs5ASj2mB5SGuhN4fizD8c9luQiy2fR+5CjHboGGDMELqp+VybMTrYYGruNdt4ypa4sSq9CALUKlTs/lQvLY5iVcF0yjtnh8eEcVq3rNbffmOKlAcmNSnjvLp1RmzdZRWVIGk45VPAPFCMsrbyx1QrWZpyoxe3cvT0i5L4dmw5KEEW5GfTBZlDxWtP1p3wJAj7wi+6gytjq7AeseSIkTsJAoPI6aoab4khXeRYjww== authentication-results: ffmpeg.org; dkim=none (message not signed) header.d=none; ffmpeg.org; dmarc=none action=none header.from=hotmail.com; x-incomingtopheadermarker: OriginalChecksum:027C043AB348696A280EB212BFE3F54A4CE78DBD7BC0A3D14F15430BE52FBF3A; UpperCasedChecksum:82D905FBFBBD6B952C101AADFADF54E8CF895771839226BF9DC12B7454A63133; SizeAsReceived:8078; Count:38 x-ms-exchange-messagesentrepresentingtype: 1 x-incomingheadercount: 38 x-eopattributedmessage: 0 x-microsoft-exchange-diagnostics: 1; VE1EUR03HT068; 7:q8REwOitdylVFAPPCV66p0LfwZx75r12xZdgZMopSGl8MZyc8AwfLpchdp4eAl9rmrZ4iYy+JHWWFsUIP7J7NxiFj6IAvCk8Y9bQ2KMOClQNOET3XaXi+HsaHV+vVbIM/MKYvhdAtErmRLkr9PKC4k/m5O6UOTyduQkdiS29PKJrmU82QinxTV4IvvYiFcg4EzWSdDXf+Fuo4VXx/hDFCbfF7VsMDfHRqx0MZNCo7x0/HieAiuUvytQ+ZXNdsVDxES4aHeaos6al1AI27AqS63oFUS2Ui8vDfIslJznqq11mrLaCUB3xADuO4KnrUfFzKFpxw0/Xw/TXBHLepA8d75HVrrQnLjci6ZP8bzPlOSdNtrz5sJSk4lXSwwLy+uV8VQJH2CWRdOL0SevYPhK2ep9CB3qWinL/05cGD2eHqLDquw60mzpeckB60OVevOWjUAkwBrPZlmc8HrSRHHzRiA== x-forefront-antispam-report: EFV:NLI; SFV:NSPM; SFS:(10019020)(98900003); DIR:OUT; SFP:1102; SCL:1; SRVR:VE1EUR03HT068; H:VI1PR01MB1327.eurprd01.prod.exchangelabs.com; FPR:; SPF:None; LANG:en; x-ms-office365-filtering-correlation-id: f25016bd-3540-4e0a-962a-08d427bbdc03 x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(1601124038)(1603103113)(1601125047); SRVR:VE1EUR03HT068; x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(432015012)(82015046); SRVR:VE1EUR03HT068; BCL:0; PCL:0; RULEID:; SRVR:VE1EUR03HT068; x-forefront-prvs: 01613DFDC8 spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: hotmail.com X-MS-Exchange-CrossTenant-originalarrivaltime: 19 Dec 2016 03:05:18.0852 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Internet X-MS-Exchange-CrossTenant-id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-Transport-CrossTenantHeadersStamped: VE1EUR03HT068 X-OriginalArrivalTime: 19 Dec 2016 03:05:38.0529 (UTC) FILETIME=[C666A510:01D259A4] Subject: [FFmpeg-devel] [PATCH 1/1] Updated version of patch 1840 (ticket 6021) X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: =?iso-8859-1?Q?Erik_Br=E5then_Solem?= Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Between testing and patch generation a character was deleted by mistake, which broke the patch. This updated version fixes this. Original patch description: Character offsets were interpreted as byte offsets, resulting in misplaced styling tags where multibyte characters were involved. The entire subtitle stream would even be rendered invalid if such a misplaced tag happened to split a multibyte character. This patch fixes this for UTF-8; UTF-16 was and still is broken. These are the only supported encodings according to the spec. --- libavcodec/movtextdec.c | 95 +++++++++++++++++++++++++++---------------------- 1 file changed, 53 insertions(+), 42 deletions(-) diff --git a/libavcodec/movtextdec.c b/libavcodec/movtextdec.c index 7b5b161..4cffacf 100644 --- a/libavcodec/movtextdec.c +++ b/libavcodec/movtextdec.c @@ -328,6 +328,7 @@ static int text_to_ass(AVBPrint *buf, const char *text, const char *text_end, int i = 0; int j = 0; int text_pos = 0; + int text_pos_chars = 0; if (text < text_end && m->box_flags & TWRP_BOX) { if (m->w.wrap_flag == 1) { @@ -338,50 +339,59 @@ static int text_to_ass(AVBPrint *buf, const char *text, const char *text_end, } while (text < text_end) { - if (m->box_flags & STYL_BOX) { - for (i = 0; i < m->style_entries; i++) { - if (m->s[i]->style_flag && text_pos == m->s[i]->style_end) { - av_bprintf(buf, "{\\r}"); + if ((*text & 0xC0) != 0x80) { // Boxes never split multibyte characters + if (m->box_flags & STYL_BOX) { + for (i = 0; i < m->style_entries; i++) { + if (m->s[i]->style_flag && + text_pos_chars == m->s[i]->style_end) + { + av_bprintf(buf, "{\\r}"); + } } - } - for (i = 0; i < m->style_entries; i++) { - if (m->s[i]->style_flag && text_pos == m->s[i]->style_start) { - if (m->s[i]->style_flag & STYLE_FLAG_BOLD) - av_bprintf(buf, "{\\b1}"); - if (m->s[i]->style_flag & STYLE_FLAG_ITALIC) - av_bprintf(buf, "{\\i1}"); - if (m->s[i]->style_flag & STYLE_FLAG_UNDERLINE) - av_bprintf(buf, "{\\u1}"); - av_bprintf(buf, "{\\fs%d}", m->s[i]->fontsize); - for (j = 0; j < m->ftab_entries; j++) { - if (m->s[i]->style_fontID == m->ftab[j]->fontID) - av_bprintf(buf, "{\\fn%s}", m->ftab[j]->font); + for (i = 0; i < m->style_entries; i++) { + if (m->s[i]->style_flag + && text_pos_chars == m->s[i]->style_start) + { + if (m->s[i]->style_flag & STYLE_FLAG_BOLD) + av_bprintf(buf, "{\\b1}"); + if (m->s[i]->style_flag & STYLE_FLAG_ITALIC) + av_bprintf(buf, "{\\i1}"); + if (m->s[i]->style_flag & STYLE_FLAG_UNDERLINE) + av_bprintf(buf, "{\\u1}"); + /* (No need to print font style if equal to default?) */ + av_bprintf(buf, "{\\fs%d}", m->s[i]->fontsize); + for (j = 0; j < m->ftab_entries; j++) { + if (m->s[i]->style_fontID == m->ftab[j]->fontID) + av_bprintf(buf, "{\\fn%s}", m->ftab[j]->font); + } } } } - } - if (m->box_flags & HLIT_BOX) { - if (text_pos == m->h.hlit_start) { - /* If hclr box is present, set the secondary color to the color - * specified. Otherwise, set primary color to white and secondary - * color to black. These colors will come from TextSampleModifier - * boxes in future and inverse video technique for highlight will - * be implemented. - */ - if (m->box_flags & HCLR_BOX) { - av_bprintf(buf, "{\\2c&H%02x%02x%02x&}", m->c.hlit_color[2], - m->c.hlit_color[1], m->c.hlit_color[0]); - } else { - av_bprintf(buf, "{\\1c&H000000&}{\\2c&HFFFFFF&}"); + if (m->box_flags & HLIT_BOX) { + if (text_pos_chars == m->h.hlit_start) { + /* If hclr box is present, set the secondary color to the + * color specified. Otherwise, set primary color to white + * and secondary color to black. These colors will come from + * TextSampleModifier boxes in future and inverse video + * technique for highlight will be implemented. + */ + if (m->box_flags & HCLR_BOX) { + av_bprintf(buf, "{\\2c&H%02x%02x%02x&}", + m->c.hlit_color[2], m->c.hlit_color[1], + m->c.hlit_color[0]); + } else { + av_bprintf(buf, "{\\1c&H000000&}{\\2c&HFFFFFF&}"); + } } - } - if (text_pos == m->h.hlit_end) { - if (m->box_flags & HCLR_BOX) { - av_bprintf(buf, "{\\2c&H000000&}"); - } else { - av_bprintf(buf, "{\\1c&HFFFFFF&}{\\2c&H000000&}"); + if (text_pos_chars == m->h.hlit_end) { + if (m->box_flags & HCLR_BOX) { + av_bprintf(buf, "{\\2c&H000000&}"); + } else { + av_bprintf(buf, "{\\1c&HFFFFFF&}{\\2c&H000000&}"); + } } } + text_pos_chars++; } switch (*text) { @@ -412,10 +422,10 @@ static int mov_text_init(AVCodecContext *avctx) { MovTextContext *m = avctx->priv_data; ret = mov_text_tx3g(avctx, m); if (ret == 0) { - return ff_ass_subtitle_header(avctx, m->d.font, m->d.fontsize, m->d.color, - m->d.back_color, m->d.bold, m->d.italic, - m->d.underline, ASS_DEFAULT_BORDERSTYLE, - m->d.alignment); + return ff_ass_subtitle_header(avctx, m->d.font, m->d.fontsize, + m->d.color, m->d.back_color, m->d.bold, + m->d.italic, m->d.underline, + ASS_DEFAULT_BORDERSTYLE, m->d.alignment); } else return ff_ass_subtitle_header_default(avctx); } @@ -491,7 +501,8 @@ static int mov_text_decode_frame(AVCodecContext *avctx, for (size_t i = 0; i < box_count; i++) { if (tsmb_type == box_types[i].type) { - if (m->tracksize + m->size_var + box_types[i].base_size > avpkt->size) + if (m->tracksize + m->size_var + + box_types[i].base_size > avpkt->size) break; ret_tsmb = box_types[i].decode(tsmb, m, avpkt); if (ret_tsmb == -1)