From patchwork Mon Apr 26 09:34:23 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Jan_Ekstr=C3=B6m?= X-Patchwork-Id: 27420 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:5014:0:0:0:0:0 with SMTP id e20csp3815053iob; Mon, 26 Apr 2021 02:55:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwCubo3AoCwPuVqzHp/IiKICEYZLqze5t7hWCq2BF0OIMyTfkrfJZxWNzJ9F+Qc9aBOtJ95 X-Received: by 2002:a17:906:1e49:: with SMTP id i9mr17614583ejj.536.1619430924333; Mon, 26 Apr 2021 02:55:24 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1619430924; cv=none; d=google.com; s=arc-20160816; b=mSdQkyFdOrVvLFanuJNUYXUs0X2W84qzOzc/e7xCqA2C+3hLjU82RkUidk5RhwDWlR AqsWFiqSXE8EB8niJHK5FdttHEO9SvDrp116Ea/WLaI6c/TwBPW0bha9iXDaeRxA8Uso NEWxFNpZJKobp5jVVO2xjYnFu/Tu+8iQNTIGZZ+oFZXpEZSgF7Pv2BtXdWJAl+JWoUOL l5VTFNJPmq38Rcdd6mrIDFhfGc6oI8Vonp18pfOy7VvwljTLW5ObCKSqIj9Pmk+eirvy tlpagVnL431O7xbCV9WYQgHhxN5vr25GAWlAnJ2TpneHEZifN52lSmlj10wmoaLkTWJi wirA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:dkim-signature:delivered-to; bh=m3M7yYukzz7Sv/CcRxN/C7Zc7uHikqG7to+wZDO0TlY=; b=q8BDVfVSjUrAn0+QMFnJLG7fMbhGxKiD5Q4WLgvRJCfcETPae+uDGnxBO0Wv35x9wB 7oRvrieIvsV9V/Ss1nl6uwqNboR4AX5pd3hs++yIg+kgW3ihTa/wTIFWIcBPrCtC6cYX hTBLY2orDz/4GB5jxnxnwANlY3zMU/28DciAopjBcVDmO98WXNh2AWsbWIuiRGdTclNe 9pkiHFa142WBCx6O6SMGCFis7/BSuV34iKTFOBkmKiEGWAxgJttqo3V0iWD3b5eYoCro F0RtZkx49i343w2uBkBeInKxrcF2H2bzVx7HxrlubrDp6DuXzFyJiTC6rRQ/FoR2Kr2j uPDw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b="oI/xLsIh"; 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 sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 24si16094053edv.509.2021.04.26.02.55.23; Mon, 26 Apr 2021 02:55:24 -0700 (PDT) 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=@gmail.com header.s=20161025 header.b="oI/xLsIh"; 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 sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D60F1689AB4; Mon, 26 Apr 2021 12:55:19 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ej1-f45.google.com (mail-ej1-f45.google.com [209.85.218.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 5BD6A68022A for ; Mon, 26 Apr 2021 12:55:13 +0300 (EEST) Received: by mail-ej1-f45.google.com with SMTP id n2so83482749ejy.7 for ; Mon, 26 Apr 2021 02:55:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=W2muOHdSrbSS04FtduUOCnHO6V4VHxF9ge7uIw5Jg+8=; b=oI/xLsIhVvCs8h0KB2P3dTfue/lE+9WmitnPLDSR7EcAyOiS77kOSQ7TPK9MXkDzy7 E331bG7eS+UhKrNu8oayJX1HK9+3qFwmHwMaHfz4UutL3bcydMultQ/1VVmj7qt2vY24 +gB47fNTToG1aLb09YksdP+LilMKttL6YmyeSO1Skge+HKHcpVbKX+4Nl1NLFSt2S3DJ 9OpMegltaBIKAjUVUibFU/6MKFh06BOuTE1tT+j+gcQ442ZNj4MdbmOI7IeEvTl2aJy9 BwCbDKjzLPHkD1ofb6xM9NflaGm2KrB4On4fQS97Kk77FzdXamBgf9asyyT8uikr3y5m OSYA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=W2muOHdSrbSS04FtduUOCnHO6V4VHxF9ge7uIw5Jg+8=; b=f2EHqNJxMABQGPwvYtLZVcbUbDySHtK6uy3+q8+tkYtn9OkCCfJ3H7VQs0ZGIJk26d 7rOslwLbvny5WyDG8YdI724CGWAGm5u6intcXJZiWxKJ6CXeVKjUBKEkB32gF7IoRBs4 jRd0X+2OxPi6oJ3PJF79mo5LuQeLx2aXuoUfyE/JuLfsylXOmbIkuCKsNGK80CYOFIMb rN8hfrbmg8YwAr0SWsHYiv2YjCtuZ8DRB+QYq22aWJA3Cm1yYXU4PeBqNyA3bQKeNzMO hjKCYXkbOR90F/GsbMCju40lUTeqC4DYu1ZsEBmLQN1D1Yq4Cd8KREwWvyzbGj7A1As2 aSQg== X-Gm-Message-State: AOAM530WZjkh5tVLth+q4clohB5iQJ+SPfaeQo9uvAQX7HlLP5merWFJ sHfzWBOvdSLGwQUNXVwX/KHbcTzJEDg= X-Received: by 2002:ac2:4855:: with SMTP id 21mr12001370lfy.518.1619429670214; Mon, 26 Apr 2021 02:34:30 -0700 (PDT) Received: from localhost.localdomain (91-159-194-103.elisa-laajakaista.fi. [91.159.194.103]) by smtp.gmail.com with ESMTPSA id m7sm1402883ljp.102.2021.04.26.02.34.29 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 26 Apr 2021 02:34:29 -0700 (PDT) From: =?utf-8?q?Jan_Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Mon, 26 Apr 2021 12:34:23 +0300 Message-Id: <20210426093425.17900-3-jeebjp@gmail.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210426093425.17900-1-jeebjp@gmail.com> References: <20210426093425.17900-1-jeebjp@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 2/4] avformat/ttmlenc: enable writing out additional header values X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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" X-TUID: EWYyb8Ur/hUS From: Jan Ekström This way the encoder may pass on the following values to the muxer: 1) Additional root "tt" element attributes, such as the subtitle canvas reference size. 2) Anything before the body element of the document, such as regions in the head element, which can configure styles. Signed-off-by: Jan Ekström --- libavcodec/ttmlenc.h | 5 ++++ libavformat/ttmlenc.c | 70 +++++++++++++++++++++++++++++++++++++++---- 2 files changed, 70 insertions(+), 5 deletions(-) diff --git a/libavcodec/ttmlenc.h b/libavcodec/ttmlenc.h index c1dd5ec990..c3bb11478d 100644 --- a/libavcodec/ttmlenc.h +++ b/libavcodec/ttmlenc.h @@ -25,4 +25,9 @@ #define TTMLENC_EXTRADATA_SIGNATURE "lavc-ttmlenc" #define TTMLENC_EXTRADATA_SIGNATURE_SIZE (sizeof(TTMLENC_EXTRADATA_SIGNATURE) - 1) +static const char ttml_default_namespacing[] = +" xmlns=\"http://www.w3.org/ns/ttml\"\n" +" xmlns:ttm=\"http://www.w3.org/ns/ttml#metadata\"\n" +" xmlns:tts=\"http://www.w3.org/ns/ttml#styling\"\n"; + #endif /* AVCODEC_TTMLENC_H */ diff --git a/libavformat/ttmlenc.c b/libavformat/ttmlenc.c index 940f8bbd4e..34a0107a14 100644 --- a/libavformat/ttmlenc.c +++ b/libavformat/ttmlenc.c @@ -37,6 +37,11 @@ enum TTMLPacketType { PACKET_TYPE_DOCUMENT, }; +struct TTMLHeaderParameters { + const char *tt_element_params; + const char *pre_body_elements; +}; + typedef struct TTMLMuxContext { enum TTMLPacketType input_type; unsigned int document_written; @@ -45,10 +50,9 @@ typedef struct TTMLMuxContext { static const char ttml_header_text[] = "\n" "\n" +"%s" " \n" "
\n"; @@ -72,6 +76,48 @@ static void ttml_write_time(AVIOContext *pb, const char tag[], tag, hour, min, sec, millisec); } +static int ttml_set_header_values_from_extradata( + AVCodecParameters *par, struct TTMLHeaderParameters *header_params) +{ + size_t additional_data_size = + par->extradata_size - TTMLENC_EXTRADATA_SIGNATURE_SIZE; + char *value = + (char *)par->extradata + TTMLENC_EXTRADATA_SIGNATURE_SIZE; + size_t value_size = av_strnlen(value, additional_data_size); + struct TTMLHeaderParameters local_params = { 0 }; + + if (!additional_data_size) { + // simple case, we don't have to go through local_params and just + // set default fall-back values (for old extradata format). + header_params->tt_element_params = ttml_default_namespacing; + header_params->pre_body_elements = ""; + + return 0; + } + + if (value_size == additional_data_size || + value[value_size] != '\0') + return AVERROR_INVALIDDATA; + + local_params.tt_element_params = value; + + additional_data_size -= value_size + 1; + value += value_size + 1; + if (!additional_data_size) + return AVERROR_INVALIDDATA; + + value_size = av_strnlen(value, additional_data_size); + if (value_size == additional_data_size || + value[value_size] != '\0') + return AVERROR_INVALIDDATA; + + local_params.pre_body_elements = value; + + *header_params = local_params; + + return 0; +} + static int ttml_write_header(AVFormatContext *ctx) { TTMLMuxContext *ttml_ctx = ctx->priv_data; @@ -103,8 +149,22 @@ static int ttml_write_header(AVFormatContext *ctx) avpriv_set_pts_info(st, 64, 1, 1000); - if (ttml_ctx->input_type == PACKET_TYPE_PARAGRAPH) - avio_printf(pb, ttml_header_text, printed_lang); + if (ttml_ctx->input_type == PACKET_TYPE_PARAGRAPH) { + struct TTMLHeaderParameters header_params; + int ret = ttml_set_header_values_from_extradata( + st->codecpar, &header_params); + if (ret < 0) { + av_log(ctx, AV_LOG_ERROR, + "Failed to parse TTML header values from extradata: " + "%s!\n", av_err2str(ret)); + return ret; + } + + avio_printf(pb, ttml_header_text, + header_params.tt_element_params, + printed_lang, + header_params.pre_body_elements); + } } return 0;