From patchwork Thu Jun 18 00:47:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: rcombs X-Patchwork-Id: 20448 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id A3CA044AC29 for ; Thu, 18 Jun 2020 03:48:16 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 90FEB68B626; Thu, 18 Jun 2020 03:48:16 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from so254-54.mailgun.net (so254-54.mailgun.net [198.61.254.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 43DB968B5D7 for ; Thu, 18 Jun 2020 03:48:10 +0300 (EEST) DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=rcombs.me; q=dns/txt; s=mx; t=1592441292; h=Content-Transfer-Encoding: MIME-Version: Message-Id: Date: Subject: To: From: Sender; bh=P+jQZOvcqyFdfKNmlyKaodON41CHqqYcfLYQwVCTjm8=; b=v5d85lvYXKQuO7pXFAnB4lCAwnk5BUmHbMUn61wDFlpbM+BPGefUcs0vJjjIhDjS8t0GTCZh ifb6h7051bCHi1D3Ddn70Z5NgMYiKR1mN3QDwJujGvAnj+fmMmkos8OsW7vJ1B8vhcl9B1EF XEeFu0IebB402O78GGdlr3OsrwA= X-Mailgun-Sending-Ip: 198.61.254.54 X-Mailgun-Sid: WyJiZDU1MSIsICJmZm1wZWctZGV2ZWxAZmZtcGVnLm9yZyIsICJiMGJhIl0= Received: from rcombs-mbp.localdomain ( [24.14.135.13]) by smtp-out-n07.prod.us-east-1.postgun.com with SMTP id 5eeab9b2c4bb4f886d7af01b (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Thu, 18 Jun 2020 00:47:46 GMT From: rcombs To: ffmpeg-devel@ffmpeg.org Date: Wed, 17 Jun 2020 19:47:39 -0500 Message-Id: <20200618004743.95896-1-rcombs@rcombs.me> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/5] lavf: matroska subtitle muxer 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- configure | 1 + libavformat/allformats.c | 1 + libavformat/matroskaenc.c | 30 ++++++++++++++++++++++++++++++ libavformat/version.h | 4 ++-- 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/configure b/configure index 7495f35faa..28686ce2e8 100755 --- a/configure +++ b/configure @@ -3305,6 +3305,7 @@ ismv_muxer_select="mov_muxer" ivf_muxer_select="av1_metadata_bsf vp9_superframe_bsf" latm_muxer_select="aac_adtstoasc_bsf" matroska_audio_muxer_select="matroska_muxer" +matroska_subtitle_muxer_select="matroska_muxer" matroska_demuxer_select="iso_media riffdec" matroska_demuxer_suggest="bzlib lzo zlib" matroska_muxer_select="iso_media riffenc vp9_superframe_bsf aac_adtstoasc_bsf" diff --git a/libavformat/allformats.c b/libavformat/allformats.c index a7c5c9db89..9d6f6c2ad5 100644 --- a/libavformat/allformats.c +++ b/libavformat/allformats.c @@ -234,6 +234,7 @@ extern AVOutputFormat ff_md5_muxer; extern AVInputFormat ff_matroska_demuxer; extern AVOutputFormat ff_matroska_muxer; extern AVOutputFormat ff_matroska_audio_muxer; +extern AVOutputFormat ff_matroska_subtitle_muxer; extern AVInputFormat ff_mgsts_demuxer; extern AVInputFormat ff_microdvd_demuxer; extern AVOutputFormat ff_microdvd_muxer; diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index eaed02bc92..63d6b50e6a 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -2893,3 +2893,33 @@ AVOutputFormat ff_matroska_audio_muxer = { .priv_class = &mka_class, }; #endif + +#if CONFIG_MATROSKA_SUBTITLE_MUXER +static const AVClass mks_class = { + .class_name = "matroska subtitle muxer", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; +AVOutputFormat ff_matroska_subtitle_muxer = { + .name = "matroska", + .long_name = NULL_IF_CONFIG_SMALL("Matroska Subtitle"), + .extensions = "mks", + .priv_data_size = sizeof(MatroskaMuxContext), + .audio_codec = AV_CODEC_ID_NONE, + .video_codec = AV_CODEC_ID_NONE, + .subtitle_codec = AV_CODEC_ID_ASS, + .init = mkv_init, + .deinit = mkv_deinit, + .write_header = mkv_write_header, + .write_packet = mkv_write_flush_packet, + .write_trailer = mkv_write_trailer, + .check_bitstream = mkv_check_bitstream, + .flags = AVFMT_GLOBALHEADER | AVFMT_TS_NONSTRICT | + AVFMT_ALLOW_FLUSH, + .codec_tag = (const AVCodecTag* const []){ + additional_subtitle_tags, 0 + }, + .priv_class = &mks_class, +}; +#endif diff --git a/libavformat/version.h b/libavformat/version.h index 59151a71a0..3c1957b00c 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -32,8 +32,8 @@ // Major bumping may affect Ticket5467, 5421, 5451(compatibility with Chromium) // Also please add any ticket numbers that you believe might be affected here #define LIBAVFORMAT_VERSION_MAJOR 58 -#define LIBAVFORMAT_VERSION_MINOR 46 -#define LIBAVFORMAT_VERSION_MICRO 101 +#define LIBAVFORMAT_VERSION_MINOR 47 +#define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \ From patchwork Thu Jun 18 00:47:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: rcombs X-Patchwork-Id: 20449 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id B867944AC29 for ; Thu, 18 Jun 2020 03:48:19 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A367C68B633; Thu, 18 Jun 2020 03:48:19 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from so254-54.mailgun.net (so254-54.mailgun.net [198.61.254.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4B0F168B545 for ; Thu, 18 Jun 2020 03:48:11 +0300 (EEST) DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=rcombs.me; q=dns/txt; s=mx; t=1592441293; h=Content-Transfer-Encoding: MIME-Version: References: In-Reply-To: Message-Id: Date: Subject: To: From: Sender; bh=wcVakUqCbQEkMfeqw4JfzVR+5bvqildAoJLQbU6irR0=; b=CHlCGYFRMCEef3cc6NbUwI9YcUDKmtEIfKRvDiHtiRkL62KwfeEUNIvXNqaruqRBzppTMwQb Pjg7CbUPkbdJ9+ppaM23uvxyh9iTYq/MkTMlqxM2h8Zt1wpJsh/mbas2ypeIFn84f7JglNDM B6jQCKEHB9tkAfDWP5MQTV5UTNo= X-Mailgun-Sending-Ip: 198.61.254.54 X-Mailgun-Sid: WyJiZDU1MSIsICJmZm1wZWctZGV2ZWxAZmZtcGVnLm9yZyIsICJiMGJhIl0= Received: from rcombs-mbp.localdomain ( [24.14.135.13]) by smtp-out-n07.prod.us-east-1.postgun.com with SMTP id 5eeab9b2bfb34e631c3233a0 (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Thu, 18 Jun 2020 00:47:46 GMT From: rcombs To: ffmpeg-devel@ffmpeg.org Date: Wed, 17 Jun 2020 19:47:40 -0500 Message-Id: <20200618004743.95896-2-rcombs@rcombs.me> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200618004743.95896-1-rcombs@rcombs.me> References: <20200618004743.95896-1-rcombs@rcombs.me> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/5] lavf/webvtt: preserve comments 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavcodec/avpacket.c | 1 + libavcodec/packet.h | 6 ++++++ libavformat/webvttdec.c | 25 ++++++++++++++++++++++--- libavformat/webvttenc.c | 10 ++++++++-- 4 files changed, 37 insertions(+), 5 deletions(-) diff --git a/libavcodec/avpacket.c b/libavcodec/avpacket.c index dce26cb31a..5b7842e434 100644 --- a/libavcodec/avpacket.c +++ b/libavcodec/avpacket.c @@ -400,6 +400,7 @@ const char *av_packet_side_data_name(enum AVPacketSideDataType type) case AV_PKT_DATA_PRFT: return "Producer Reference Time"; case AV_PKT_DATA_ICC_PROFILE: return "ICC Profile"; case AV_PKT_DATA_DOVI_CONF: return "DOVI configuration record"; + case AV_PKT_DATA_WEBVTT_COMMENT: return "WebVTT Comment"; } return NULL; } diff --git a/libavcodec/packet.h b/libavcodec/packet.h index 41485f4527..6b282f04c9 100644 --- a/libavcodec/packet.h +++ b/libavcodec/packet.h @@ -282,6 +282,12 @@ enum AVPacketSideDataType { */ AV_PKT_DATA_DOVI_CONF, + /** + * The optional comment data that comes before the identifier or timing block + * of a WebVTT cue. Must end with a line break. + */ + AV_PKT_DATA_WEBVTT_COMMENT, + /** * The number of side data types. * This is not part of the public API/ABI in the sense that it may diff --git a/libavformat/webvttdec.c b/libavformat/webvttdec.c index bd3d45b382..38c281fe00 100644 --- a/libavformat/webvttdec.c +++ b/libavformat/webvttdec.c @@ -60,7 +60,7 @@ static int64_t read_ts(const char *s) static int webvtt_read_header(AVFormatContext *s) { WebVTTContext *webvtt = s->priv_data; - AVBPrint cue; + AVBPrint cue, com; int res = 0; AVStream *st = avformat_new_stream(s, NULL); @@ -72,6 +72,7 @@ static int webvtt_read_header(AVFormatContext *s) st->disposition |= webvtt->kind; av_bprint_init(&cue, 0, AV_BPRINT_SIZE_UNLIMITED); + av_bprint_init(&com, 0, AV_BPRINT_SIZE_UNLIMITED); for (;;) { int i; @@ -91,10 +92,15 @@ static int webvtt_read_header(AVFormatContext *s) /* ignore header chunk */ if (!strncmp(p, "\xEF\xBB\xBFWEBVTT", 9) || - !strncmp(p, "WEBVTT", 6) || - !strncmp(p, "NOTE", 4)) + !strncmp(p, "WEBVTT", 6)) continue; + if (!strncmp(p, "NOTE", 4) && + (p[4] == ' ' || p[4] == '\t' || p[4] == '\n' || p[4] == '\r')) { + av_bprintf(&com, "%s%s\n", com.len ? "\n" : "", p); + continue; + } + /* optional cue identifier (can be a number like in SRT or some kind of * chaptering id) */ for (i = 0; p[i] && p[i] != '\n' && p[i] != '\r'; i++) { @@ -159,6 +165,18 @@ static int webvtt_read_header(AVFormatContext *s) SET_SIDE_DATA(identifier, AV_PKT_DATA_WEBVTT_IDENTIFIER); SET_SIDE_DATA(settings, AV_PKT_DATA_WEBVTT_SETTINGS); + if (com.len) { + char *com_str; + if ((res = av_bprint_finalize(&com, &com_str)) < 0) + goto end; + + if ((res = av_packet_add_side_data(sub, AV_PKT_DATA_WEBVTT_COMMENT, com_str, com.len)) < 0) { + av_free(com_str); + goto end; + } + + av_bprint_init(&com, 0, AV_BPRINT_SIZE_UNLIMITED); + } } ff_subtitles_queue_finalize(s, &webvtt->q); @@ -167,6 +185,7 @@ end: if (res < 0) ff_subtitles_queue_clean(&webvtt->q); av_bprint_finalize(&cue, NULL); + av_bprint_finalize(&com, NULL); return res; } diff --git a/libavformat/webvttenc.c b/libavformat/webvttenc.c index cbd989dcb6..ecd508db65 100644 --- a/libavformat/webvttenc.c +++ b/libavformat/webvttenc.c @@ -64,11 +64,17 @@ static int webvtt_write_header(AVFormatContext *ctx) static int webvtt_write_packet(AVFormatContext *ctx, AVPacket *pkt) { AVIOContext *pb = ctx->pb; - int id_size, settings_size; - uint8_t *id, *settings; + int id_size, settings_size, comment_size; + uint8_t *id, *settings, *comment; avio_printf(pb, "\n"); + comment = av_packet_get_side_data(pkt, AV_PKT_DATA_WEBVTT_COMMENT, + &comment_size); + + if (comment && comment_size > 0) + avio_printf(pb, "%.*s\n", comment_size, comment); + id = av_packet_get_side_data(pkt, AV_PKT_DATA_WEBVTT_IDENTIFIER, &id_size); From patchwork Thu Jun 18 00:47:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: rcombs X-Patchwork-Id: 20447 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id A596F44AC29 for ; Thu, 18 Jun 2020 03:48:12 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 89F8B68B5F3; Thu, 18 Jun 2020 03:48:12 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from so254-54.mailgun.net (so254-54.mailgun.net [198.61.254.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 1CD0D68B31C for ; Thu, 18 Jun 2020 03:48:03 +0300 (EEST) DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=rcombs.me; q=dns/txt; s=mx; t=1592441290; h=Content-Transfer-Encoding: MIME-Version: References: In-Reply-To: Message-Id: Date: Subject: To: From: Sender; bh=39l+6KKPbloM46kqEcKaNAkl4W9cd28YQtA6QcFUjYQ=; b=fIwXgG4KLVk36PGgUJqEMibySt7SD9LWy8GdPBVuKGAaHPE0L96xkyXLE8ra27REdWYfjbb3 jlMSEvaESV/YYKSEPkFI7UkLuSGvK5F0+DbQHg5UKvzAgzo9WQRjjJEwrJycd+Jtvh33Tj9+ lc/0ATtOu6MeyCXU/J3Pv0A4m38= X-Mailgun-Sending-Ip: 198.61.254.54 X-Mailgun-Sid: WyJiZDU1MSIsICJmZm1wZWctZGV2ZWxAZmZtcGVnLm9yZyIsICJiMGJhIl0= Received: from rcombs-mbp.localdomain ( [24.14.135.13]) by smtp-out-n07.prod.us-east-1.postgun.com with SMTP id 5eeab9b2c76a4e7a2a4200aa (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Thu, 18 Jun 2020 00:47:46 GMT From: rcombs To: ffmpeg-devel@ffmpeg.org Date: Wed, 17 Jun 2020 19:47:41 -0500 Message-Id: <20200618004743.95896-3-rcombs@rcombs.me> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200618004743.95896-1-rcombs@rcombs.me> References: <20200618004743.95896-1-rcombs@rcombs.me> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/5] lavf/matroskadec: support standard (non-WebM) WebVTT formatting 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Fixes ticket #5641 --- libavformat/matroska.c | 11 ++-- libavformat/matroskadec.c | 111 ++++++++++++++++++++++++-------------- 2 files changed, 77 insertions(+), 45 deletions(-) diff --git a/libavformat/matroska.c b/libavformat/matroska.c index 7c56aba403..962fa496f4 100644 --- a/libavformat/matroska.c +++ b/libavformat/matroska.c @@ -60,16 +60,12 @@ const CodecTags ff_mkv_codec_tags[]={ {"A_VORBIS" , AV_CODEC_ID_VORBIS}, {"A_WAVPACK4" , AV_CODEC_ID_WAVPACK}, - {"D_WEBVTT/SUBTITLES" , AV_CODEC_ID_WEBVTT}, - {"D_WEBVTT/CAPTIONS" , AV_CODEC_ID_WEBVTT}, - {"D_WEBVTT/DESCRIPTIONS", AV_CODEC_ID_WEBVTT}, - {"D_WEBVTT/METADATA" , AV_CODEC_ID_WEBVTT}, - {"S_TEXT/UTF8" , AV_CODEC_ID_SUBRIP}, {"S_TEXT/UTF8" , AV_CODEC_ID_TEXT}, {"S_TEXT/ASCII" , AV_CODEC_ID_TEXT}, {"S_TEXT/ASS" , AV_CODEC_ID_ASS}, {"S_TEXT/SSA" , AV_CODEC_ID_ASS}, + {"S_TEXT/WEBVTT" , AV_CODEC_ID_WEBVTT}, {"S_ASS" , AV_CODEC_ID_ASS}, {"S_SSA" , AV_CODEC_ID_ASS}, {"S_VOBSUB" , AV_CODEC_ID_DVD_SUBTITLE}, @@ -77,6 +73,11 @@ const CodecTags ff_mkv_codec_tags[]={ {"S_HDMV/PGS" , AV_CODEC_ID_HDMV_PGS_SUBTITLE}, {"S_HDMV/TEXTST" , AV_CODEC_ID_HDMV_TEXT_SUBTITLE}, + {"D_WEBVTT/SUBTITLES" , AV_CODEC_ID_WEBVTT}, + {"D_WEBVTT/CAPTIONS" , AV_CODEC_ID_WEBVTT}, + {"D_WEBVTT/DESCRIPTIONS", AV_CODEC_ID_WEBVTT}, + {"D_WEBVTT/METADATA" , AV_CODEC_ID_WEBVTT}, + {"V_AV1" , AV_CODEC_ID_AV1}, {"V_DIRAC" , AV_CODEC_ID_DIRAC}, {"V_FFV1" , AV_CODEC_ID_FFV1}, diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index cff7f0cb54..1e4947e209 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -3305,62 +3305,81 @@ static int matroska_parse_webvtt(MatroskaDemuxContext *matroska, uint8_t *data, int data_len, uint64_t timecode, uint64_t duration, - int64_t pos) + int64_t pos, + uint8_t *additional, uint64_t additional_id, int additional_size) { AVPacket pktl, *pkt = &pktl; - uint8_t *id, *settings, *text, *buf; - int id_len, settings_len, text_len; + uint8_t *id, *settings, *comment, *text, *buf; + int id_len = 0, settings_len = 0, comment_len = 0, text_len; uint8_t *p, *q; int err; + int webm_style = !strncmp(track->codec_id, "D_WEBVTT/", 9); if (data_len <= 0) return AVERROR_INVALIDDATA; - p = data; - q = data + data_len; - - id = p; - id_len = -1; - while (p < q) { - if (*p == '\r' || *p == '\n') { - id_len = p - id; - if (*p == '\r') - p++; - break; + p = webm_style ? data : additional; + q = webm_style ? (data + data_len) : (additional + additional_size); + + if (p) { + id = p; + id_len = -1; + while (p < q) { + if (*p == '\r' || *p == '\n') { + id_len = p - id; + if (*p == '\r') + p++; + break; + } + p++; } + + if (p >= q || *p != '\n') + return AVERROR_INVALIDDATA; p++; - } - if (p >= q || *p != '\n') - return AVERROR_INVALIDDATA; - p++; - - settings = p; - settings_len = -1; - while (p < q) { - if (*p == '\r' || *p == '\n') { - settings_len = p - settings; - if (*p == '\r') - p++; - break; + settings = p; + settings_len = -1; + while (p < q) { + if (*p == '\r' || *p == '\n') { + settings_len = p - settings; + if (*p == '\r') + p++; + break; + } + p++; } + + if (p >= q || *p != '\n') + return AVERROR_INVALIDDATA; p++; + + if (!webm_style && p < q) { + if (q[-1] != '\r' && q[-1] != '\n') + return AVERROR_INVALIDDATA; + + comment = p; + comment_len = q - p; + } } - if (p >= q || *p != '\n') - return AVERROR_INVALIDDATA; - p++; - - text = p; - text_len = q - p; - while (text_len > 0) { - const int len = text_len - 1; - const uint8_t c = p[len]; - if (c != '\r' && c != '\n') - break; - text_len = len; + if (webm_style) { + text = p; + text_len = q - p; + + while (text_len > 0) { + const int len = text_len - 1; + const uint8_t c = p[len]; + if (c != '\r' && c != '\n') + break; + text_len = len; + } + } else { + text = data; + text_len = data_len; } + if (text_len <= 0) return AVERROR_INVALIDDATA; @@ -3393,6 +3412,17 @@ static int matroska_parse_webvtt(MatroskaDemuxContext *matroska, memcpy(buf, settings, settings_len); } + if (comment_len > 0) { + buf = av_packet_new_side_data(pkt, + AV_PKT_DATA_WEBVTT_COMMENT, + comment_len); + if (!buf) { + av_packet_unref(pkt); + return AVERROR(ENOMEM); + } + memcpy(buf, comment, comment_len); + } + // Do we need this for subtitles? // pkt->flags = AV_PKT_FLAG_KEY; @@ -3656,7 +3686,8 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf res = matroska_parse_webvtt(matroska, track, st, out_data, out_size, timecode, lace_duration, - pos); + pos, + additional, additional_id, additional_size); if (!buf) av_free(out_data); if (res) From patchwork Thu Jun 18 00:47:42 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: rcombs X-Patchwork-Id: 20445 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 742C444AC29 for ; Thu, 18 Jun 2020 03:48:04 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4D3CA68B3FF; Thu, 18 Jun 2020 03:48:04 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from so254-54.mailgun.net (so254-54.mailgun.net [198.61.254.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D5CD968B1B2 for ; Thu, 18 Jun 2020 03:47:57 +0300 (EEST) DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=rcombs.me; q=dns/txt; s=mx; t=1592441279; h=Content-Transfer-Encoding: MIME-Version: References: In-Reply-To: Message-Id: Date: Subject: To: From: Sender; bh=acUfAXPec8cSEVZn1FKP8yDBUaExZa/2t0jQyfZRNYk=; b=Gy7R1VIgpi73U9mkZJWSJ+5vaMfSYnYa6HL2R/tlMMIr4fSoIMov3Y6bYNKFQJcnbOeOrBvS IRKim4oYyvM/vEUOoo0NxlTcKsCPXPU7JjiH26HTsKdObGJGiTensx6ZjZprY3PuiXT2g/mf s+W53wvyCdGJgIvLXLsU9LVT++o= X-Mailgun-Sending-Ip: 198.61.254.54 X-Mailgun-Sid: WyJiZDU1MSIsICJmZm1wZWctZGV2ZWxAZmZtcGVnLm9yZyIsICJiMGJhIl0= Received: from rcombs-mbp.localdomain ( [24.14.135.13]) by smtp-out-n07.prod.us-east-1.postgun.com with SMTP id 5eeab9b386de6ccd44a7f2c8 (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Thu, 18 Jun 2020 00:47:47 GMT From: rcombs To: ffmpeg-devel@ffmpeg.org Date: Wed, 17 Jun 2020 19:47:42 -0500 Message-Id: <20200618004743.95896-4-rcombs@rcombs.me> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200618004743.95896-1-rcombs@rcombs.me> References: <20200618004743.95896-1-rcombs@rcombs.me> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/5] lavf/matroskaenc: mux WebVTT using standard (non-WebM) formatting 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavformat/matroskaenc.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 63d6b50e6a..94e6cc542a 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -2117,22 +2117,25 @@ static int mkv_write_vtt_blocks(AVFormatContext *s, AVIOContext *pb, const AVPac MatroskaMuxContext *mkv = s->priv_data; mkv_track *track = &mkv->tracks[pkt->stream_index]; ebml_master blockgroup; - int id_size, settings_size, size; - const char *id, *settings; + int id_size = 0, settings_size = 0, comment_size = 0, size = pkt->size; + const char *id, *settings, *comment; int64_t ts = track->write_dts ? pkt->dts : pkt->pts; const int flags = 0; - id_size = 0; id = av_packet_get_side_data(pkt, AV_PKT_DATA_WEBVTT_IDENTIFIER, &id_size); id = id ? id : ""; - settings_size = 0; settings = av_packet_get_side_data(pkt, AV_PKT_DATA_WEBVTT_SETTINGS, &settings_size); settings = settings ? settings : ""; - size = id_size + 1 + settings_size + 1 + pkt->size; + comment = av_packet_get_side_data(pkt, AV_PKT_DATA_WEBVTT_COMMENT, + &comment_size); + comment = comment ? comment : ""; + + if (mkv->mode == MODE_WEBM) + size += id_size + 1 + settings_size + 1; /* The following string is identical to the one in mkv_write_block so that * only one copy needs to exist in binaries. */ @@ -2151,7 +2154,22 @@ static int mkv_write_vtt_blocks(AVFormatContext *s, AVIOContext *pb, const AVPac put_ebml_num(pb, track->track_num, track->track_num_size); avio_wb16(pb, ts - mkv->cluster_pts); avio_w8(pb, flags); - avio_printf(pb, "%.*s\n%.*s\n%.*s", id_size, id, settings_size, settings, pkt->size, pkt->data); + if (mkv->mode == MODE_WEBM) + avio_printf(pb, "%.*s\n%.*s\n", id_size, id, settings_size, settings); + avio_write(pb, pkt->data, pkt->size); + + if (mkv->mode != MODE_WEBM && (id_size || settings_size || comment_size)) { + ebml_master block_additions = start_ebml_master(pb, MATROSKA_ID_BLOCKADDITIONS, 0); + ebml_master block_more = start_ebml_master(pb, MATROSKA_ID_BLOCKMORE, 0); + /* Until dbc50f8a our demuxer used a wrong default value + * of BlockAddID, so we write it unconditionally. */ + put_ebml_uint (pb, MATROSKA_ID_BLOCKADDID, 1); + put_ebml_id(pb, MATROSKA_ID_BLOCKADDITIONAL); + put_ebml_length(pb, id_size + 1 + settings_size + 1 + comment_size, 0); + avio_printf(pb, "%.*s\n%.*s\n%.*s", id_size, id, settings_size, settings, comment_size, comment); + end_ebml_master(pb, block_more); + end_ebml_master(pb, block_additions); + } put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, pkt->duration); end_ebml_master(pb, blockgroup); From patchwork Thu Jun 18 00:47:43 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: rcombs X-Patchwork-Id: 20446 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id A708944AC29 for ; Thu, 18 Jun 2020 03:48:08 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8D2A068B4A2; Thu, 18 Jun 2020 03:48:08 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from so254-54.mailgun.net (so254-54.mailgun.net [198.61.254.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id AB7ED68B31C for ; Thu, 18 Jun 2020 03:48:01 +0300 (EEST) DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=rcombs.me; q=dns/txt; s=mx; t=1592441285; h=Content-Transfer-Encoding: MIME-Version: References: In-Reply-To: Message-Id: Date: Subject: To: From: Sender; bh=XJKTbcLZME+ncyakzF4KMgOAgJL/WgSGl09HXvYlKGg=; b=uLaFXMqk6HsMc+OI50tpg7aPDMqNvbqsB1qOz6V/MhnUh8Kk1BadWivVlZLHaJcICcFZeM2M 5Ik/uenimw6io0T6XMAphrFF+fco00m9Od1GTpMsejUxnaeFU9X1jmiHm8P6/ay+iTuR7dtF FZlHWJBoes9Zi9WOEzLQypX6Umw= X-Mailgun-Sending-Ip: 198.61.254.54 X-Mailgun-Sid: WyJiZDU1MSIsICJmZm1wZWctZGV2ZWxAZmZtcGVnLm9yZyIsICJiMGJhIl0= Received: from rcombs-mbp.localdomain ( [24.14.135.13]) by smtp-out-n07.prod.us-east-1.postgun.com with SMTP id 5eeab9b3bfb34e631c32347a (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Thu, 18 Jun 2020 00:47:47 GMT From: rcombs To: ffmpeg-devel@ffmpeg.org Date: Wed, 17 Jun 2020 19:47:43 -0500 Message-Id: <20200618004743.95896-5-rcombs@rcombs.me> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200618004743.95896-1-rcombs@rcombs.me> References: <20200618004743.95896-1-rcombs@rcombs.me> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 5/5] lavf/webvttdec: ignore unrecognized blocks 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" The WebVTT spec expects this behavior and it fixes some files --- libavformat/webvttdec.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libavformat/webvttdec.c b/libavformat/webvttdec.c index 38c281fe00..2e832b86eb 100644 --- a/libavformat/webvttdec.c +++ b/libavformat/webvttdec.c @@ -78,7 +78,7 @@ static int webvtt_read_header(AVFormatContext *s) int i; int64_t pos; AVPacket *sub; - const char *p, *identifier, *settings; + const char *p, *identifier, *settings, *arrow; int identifier_len, settings_len; int64_t ts_start, ts_end; @@ -120,12 +120,13 @@ static int webvtt_read_header(AVFormatContext *s) p++; } + if (!(arrow = strstr(p, "-->"))) + continue; + /* cue timestamps */ if ((ts_start = read_ts(p)) == AV_NOPTS_VALUE) break; - if (!(p = strstr(p, "-->"))) - break; - p += 2; + p = arrow + 2; do p++; while (*p == ' ' || *p == '\t'); if ((ts_end = read_ts(p)) == AV_NOPTS_VALUE) break;