From patchwork Mon Sep 20 15:00:44 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: 30382 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6506:0:0:0:0:0 with SMTP id z6csp1533034iob; Mon, 20 Sep 2021 08:03:14 -0700 (PDT) X-Google-Smtp-Source: ABdhPJznu4tMQXIMrCOQU5Lr4mKJSxeb4zEAGhqdrnT4Bc+eobGl+E5Ob5I81+DVaqZjSbweOA20 X-Received: by 2002:a1c:2351:: with SMTP id j78mr24705344wmj.40.1632150194618; Mon, 20 Sep 2021 08:03:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632150194; cv=none; d=google.com; s=arc-20160816; b=PiMttFTBt2Fcg+Y6mRCxnMob3iE97bGN3mhBAUxse3eFY8jEDRrPTSqSGcw/TtM2gV Fkk8mdt8hsBoqg/IzLpY+GEg/o0RKfuRFKOiX3FZm2sLySGdZMiOMLCtqMsdVNWj/xY9 RWPYFIPrucWC2UWxY7kmrSIZYq7ZPqfD0g6Gui08e0K3wNdBx9haPCTkUGsrpmlmOvHY /rG53KPICS6auIxKEvX4fggykWpJ+bXFxRIgnO92LP8jP3TMc/9Wj0JANZzeZjYqJhM1 OZ7G2xTdrkIv+GPz+fbaRpYID8Hhsx945QQylLrakZAScP5gyvedCWC/5Kpqzwo4WXE0 qmVQ== 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=bVrkD9iiQzfbU3ACRE6bOlQ6ZOyQLeoQu/HOnUDodyw=; b=oDJkRAA9FwYMGypDopsjlRHl3IJHCgKXOd0NGskLiozB5+5hPlfdNW4RZtbjcNWWt7 qCbLzZRBaSRxBlXTR1aveokesAhig4S1Hk/sYyc23oW7uH4TzRk5o0gBwWxFFCHs92ax SscyVZ4bLC8Ap0EzirJ78mxNYfNutlX+OkEVw1mEc5/iCZ/elJzFovECalG9+vcldY5t gYr7Gietf66R8TCGJdB6SYXqN0HZaCkNd56w1JwZT28+bBc77aKowFxbTAvzUCS1oGd5 uDsPGULZjQTYdPZRIh4K/HiT7VihntOhMI6jFD9krlWSo5pmiIw9AVH0Tr0GSNd7sMx3 ZL8Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=OODfm8Fn; 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 p15si21046114edj.97.2021.09.20.08.03.08; Mon, 20 Sep 2021 08:03:14 -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=20210112 header.b=OODfm8Fn; 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 5B0B368AF5A; Mon, 20 Sep 2021 18:02:56 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f50.google.com (mail-lf1-f50.google.com [209.85.167.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7F56368AF4C for ; Mon, 20 Sep 2021 18:02:50 +0300 (EEST) Received: by mail-lf1-f50.google.com with SMTP id e15so30454965lfr.10 for ; Mon, 20 Sep 2021 08:02:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=8E2rpL5MTo8O3ZvuS04X6nDQIAllN8uwYGQWywdig2I=; b=OODfm8FnAHk8YlvPWZVlNPDiv8DtJ3rdhnTBMz3znjolYQoyvGPVX9VxMkM2xg3Kp7 ouZDFIFllxhXVGyPaXLkezZ1e13uxbZQ1RRseBSBKHsgXjAjVbTf+cPLZ/xEdFCaeeTE h4/qNY1y3WlbvlSn4efI6IJcuiFlABpqeq1cKhL2aDFnNEcWY21/cHx7qr9EF2c5KdWo HdY2lbufcrxy2wRpa4hYDsO92KtYQ8mU5DErDRLFZg8VlcKsI6o8a67cc/fBFUmEzvqf SOTeELHCF9h6HgN0J4sYxeHrDOuCoGTV7jKYvNdhCwiqQdDR3yNiJn07wVt6HcnsA9Ov sMNQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=8E2rpL5MTo8O3ZvuS04X6nDQIAllN8uwYGQWywdig2I=; b=lXgA/jEF8NZZSPKevXEsZTcy75gfV8OTZ/szHROUgsYJbLVGA4+JKEajmQD9Sz4IjA wJG++7HS50Irusy1dWbUdnU5YiNwyEW5OGnNYfoPgZryH1yv+fvPebjc8ZygFqPAkRs7 ey+bEJffeDPGYlurzyIeojfS1INR94jTRu1tShfJjlZ4Y8uIrNYynnZoRO+Rk3gbYA8Z R+HszcYbcuyoE1/SgLBNZtzlWHiLJd2D8kKsGm0NbMeBeX9wZ5AKvtNCNqF5nwVvpMSA GfshYQr0OQXpRP4KiQ2NrFxSZYw8epadKeztpGYdyuoJ6vTmmtPoLa0ttKXq/tbBz7YJ 7pRw== X-Gm-Message-State: AOAM532SBh+eoxa2DtiyLqnIo/ZmaTU9O6Iuk6R5pXEuoVfAfmqdWe1Y lyBhOqkaMy1tmF6b1Y6yq/+SYodWbnw= X-Received: by 2002:a19:f00d:: with SMTP id p13mr20224334lfc.239.1632150055674; Mon, 20 Sep 2021 08:00:55 -0700 (PDT) Received: from localhost.localdomain (91-159-194-103.elisa-laajakaista.fi. [91.159.194.103]) by smtp.gmail.com with ESMTPSA id v26sm1318300ljv.77.2021.09.20.08.00.54 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Sep 2021 08:00:55 -0700 (PDT) From: =?utf-8?q?Jan_Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Mon, 20 Sep 2021 18:00:44 +0300 Message-Id: <20210920150048.8790-2-jeebjp@gmail.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210920150048.8790-1-jeebjp@gmail.com> References: <20210920150048.8790-1-jeebjp@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 1/5] avformat/aviobuf: add a full string reading mode to read_line_to_bprint 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: DZ05QAOm8OiT From: Jan Ekström Additionally: * rename it to read_string_to_bprint * split most of ff_read_line_to_bprint_overwrite into an internal function which can then be utilized to implement other functionality without duplicating code. Signed-off-by: Jan Ekström --- libavformat/aviobuf.c | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index 28db2c7dbd..f24a3b0fe2 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -803,7 +803,13 @@ int ff_get_chomp_line(AVIOContext *s, char *buf, int maxlen) return len; } -static int64_t read_line_to_bprint(AVIOContext *s, AVBPrint *bp) +typedef enum FFBPrintReadStringMode { + FFBPrintReadString = 0, + FFBPrintReadLine = 1, +} FFBPrintReadStringMode; + +static int64_t read_string_to_bprint(AVIOContext *s, AVBPrint *bp, + FFBPrintReadStringMode mode) { int len, end; int64_t read = 0; @@ -814,7 +820,8 @@ static int64_t read_line_to_bprint(AVIOContext *s, AVBPrint *bp) len = 0; do { c = avio_r8(s); - end = (c == '\r' || c == '\n' || c == '\0'); + end = ((mode == FFBPrintReadLine && (c == '\r' || c == '\n')) || + c == '\0'); if (!end) tmp[len++] = c; } while (!end && len < sizeof(tmp)); @@ -822,7 +829,8 @@ static int64_t read_line_to_bprint(AVIOContext *s, AVBPrint *bp) read += len; } while (!end); - if (c == '\r' && avio_r8(s) != '\n' && !avio_feof(s)) + if (mode == FFBPrintReadLine && + c == '\r' && avio_r8(s) != '\n' && !avio_feof(s)) avio_skip(s, -1); if (!c && s->error) @@ -834,12 +842,13 @@ static int64_t read_line_to_bprint(AVIOContext *s, AVBPrint *bp) return read; } -int64_t ff_read_line_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp) +static int64_t read_string_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp, + FFBPrintReadStringMode mode) { int64_t ret; av_bprint_clear(bp); - ret = read_line_to_bprint(s, bp); + ret = read_string_to_bprint(s, bp, mode); if (ret < 0) return ret; @@ -849,6 +858,11 @@ int64_t ff_read_line_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp) return bp->len; } +int64_t ff_read_line_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp) +{ + return read_string_to_bprint_overwrite(s, bp, FFBPrintReadLine); +} + int avio_get_str(AVIOContext *s, int maxlen, char *buf, int buflen) { int i; From patchwork Mon Sep 20 15:00:45 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: 30379 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6506:0:0:0:0:0 with SMTP id z6csp1532641iob; Mon, 20 Sep 2021 08:02:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzV24IX1D/oepf0/+cy8ijz5ngNCEfEXZcofosVNTYkNXggBzH3g5SGppvf71daK2HiFO3y X-Received: by 2002:a17:906:130a:: with SMTP id w10mr29880711ejb.87.1632150172268; Mon, 20 Sep 2021 08:02:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632150172; cv=none; d=google.com; s=arc-20160816; b=VcmiYdNbsfUWMqElHBDmYV8Z7SMUxATjQrybYUGkjRVL2C9xy4tlX3GLO8MjnsO1HF WhUsOPacL1hT2kVJzI1xuc33tks+JRnas3YwHhdaekGBDBKqo7R/SbToS1BM3hyZofgv 21epr++a0LdkiKJeqA7NNFnd8/k8EBVaNNWbF611gLsVLTizTF2FbHUmHn+U4xYBP0wl oSUIa1VudNKDvFrFiB6pLc19l0vznW+2naHhII4F0NR3+OD+zWgwlKQTg0tOYjYKXSIR bRL5TlD+j1CUr1jlraSlrULG/3LBmUgo1M2SfEu8TWVn8NlOlOki+rF7MbCIPHfFn/Cj TC4g== 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=rj4AwAlJp/nUCzmE9V49zlJWThCtBJgM/ctkqH6/RgA=; b=rHL0TGdiIL2t/yWaF2ZJs9+u8tyYzeNG42y8d7z45R8Apyk+2uB2Xe25WZQ3dYTmTR OfC+h/b1Xa3a3Y/TiiBIYNV7JzvAv6zKq6NtsDLCylAbeIUlzeiFC6SPvxI48a3HLV2+ fIQbUHApbrC7hcTBDihKFKg/X5gcd3w8hpKil+KXgwYtXur+Ym9tr0+e5sbzasp1ujSW lvZgQX3pPM3HLs3NdVRWVBbbXXmIJDH/HXHG8MfnMbBpGpsh604ehQFk9489QPwd+cEp FfYU4DGgMnuQXrZVlimw6Wmp+PvWa0/vqJ4XKK+izf/1hIiII9EEgfO3ZJMJpkZEFo1A 3x3w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=WItuHwBP; 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 jy11si17130773ejc.732.2021.09.20.08.02.51; Mon, 20 Sep 2021 08:02:52 -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=20210112 header.b=WItuHwBP; 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 6228568AF32; Mon, 20 Sep 2021 18:02:42 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f46.google.com (mail-lf1-f46.google.com [209.85.167.46]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C2CA168AF1F for ; Mon, 20 Sep 2021 18:02:36 +0300 (EEST) Received: by mail-lf1-f46.google.com with SMTP id b20so10364678lfv.3 for ; Mon, 20 Sep 2021 08:02:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=SkLsF7CaoqPXZEttHi5Gm0vyMkzaApUET+GfKD3/VO0=; b=WItuHwBPrNoqRpEB6LRZ5cwmfP//6IcM3BJYh431PEYGswoQCFBr+HCa+TTWromllL ieSrZMGJ5Qf1M/5vNbUmRLCtpVEtWcW3Tva/dzMnjL3UXFvYm1XIQD23fI8MlKiWntr6 /ePacQPTXdVRyP69xiSno0Yif7v60uthsFSq4k8+Qvg0Ld6TRL23jQbOPHihADPUwQPO aack9M/c/bxA5HgICvY9+/64HPt4UqZrbH7IJKPf4ProgAZ1yeYoQq5yHChvRi/PxRMw 3EB1z822zB+ZFG7Snl33W3cKWAMjL7Hj2nWMbdZPvcZG9TGHw+OAkM5Fole3d4V9y8JC Fh5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SkLsF7CaoqPXZEttHi5Gm0vyMkzaApUET+GfKD3/VO0=; b=nbYBFY8vEIDVDBb+PQwhWy/97eU0Hw+rLbRiRc2hyhsSo1bpMpVwJ810cmsX6TXLDH MZjxl4M2oNFbwLisISSbkp7u6rU20g7pfQQrSa7wm78mnczel4+eMP4vK6hnuBwyFmr+ RAO8aVY4wOObjCkW3g2/UPqPJyNvqsnTCmhTGu2fDtRq/Vu9YTMeAHUEiNYmyscXw84Q QXjd4pn0nzAVL6p14inKdkYOEyGwWUNUHjjmxlvc+M6k2Grk73HFaHY1NiKVjxJW9MQv jby5iu2n51SFrE7LjVYdTPMT6tWGr9HK3nP/cX6myVAF+y9O+mac50lfRHQsd4yjJ+hr 96Vw== X-Gm-Message-State: AOAM531FNMzlOoBlsOB5HXpoGwrlU+OTXPUOvkUpAaQxGy6CuALnxOVJ p78Rn0I9rYRB+d2XtRXfnk6mYytWKh0= X-Received: by 2002:a2e:9012:: with SMTP id h18mr297341ljg.336.1632150056539; Mon, 20 Sep 2021 08:00:56 -0700 (PDT) Received: from localhost.localdomain (91-159-194-103.elisa-laajakaista.fi. [91.159.194.103]) by smtp.gmail.com with ESMTPSA id v26sm1318300ljv.77.2021.09.20.08.00.55 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Sep 2021 08:00:55 -0700 (PDT) From: =?utf-8?q?Jan_Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Mon, 20 Sep 2021 18:00:45 +0300 Message-Id: <20210920150048.8790-3-jeebjp@gmail.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210920150048.8790-1-jeebjp@gmail.com> References: <20210920150048.8790-1-jeebjp@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 2/5] avformat/{aviobuf, avio_internal}: add ff_read_string_to_bprint_overwrite 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: 5cIETxmkfw4j From: Jan Ekström For now, same as ff_read_line_to_bprint_overwrite, but reads until the end of a null-terminated string. Signed-off-by: Jan Ekström --- libavformat/avio_internal.h | 12 ++++++++++++ libavformat/aviobuf.c | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/libavformat/avio_internal.h b/libavformat/avio_internal.h index 8b9e048f73..3b3ed3b619 100644 --- a/libavformat/avio_internal.h +++ b/libavformat/avio_internal.h @@ -245,4 +245,16 @@ struct AVBPrint; */ int64_t ff_read_line_to_bprint_overwrite(AVIOContext *s, struct AVBPrint *bp); +/** + * Read a whole null-terminated string of text from AVIOContext to an AVBPrint + * buffer overwriting its contents. Stop reading after reaching a \\0 or + * EOF. + * + * @param s the read-only AVIOContext + * @param bp the AVBPrint buffer + * @return the length of the read string not including the terminating null, + * negative on error, or if the buffer becomes truncated. + */ +int64_t ff_read_string_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp); + #endif /* AVFORMAT_AVIO_INTERNAL_H */ diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index f24a3b0fe2..3b6f9aed42 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -863,6 +863,11 @@ int64_t ff_read_line_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp) return read_string_to_bprint_overwrite(s, bp, FFBPrintReadLine); } +int64_t ff_read_string_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp) +{ + return read_string_to_bprint_overwrite(s, bp, FFBPrintReadString); +} + int avio_get_str(AVIOContext *s, int maxlen, char *buf, int buflen) { int i; From patchwork Mon Sep 20 15:00:46 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: 30378 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6506:0:0:0:0:0 with SMTP id z6csp1532358iob; Mon, 20 Sep 2021 08:02:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx8XTeOZDVP+QqkALS/9pr2fGWxOpqOz2WdE59HweBCLzB4TCgz1tbcU4DQbS30f2+7nb6b X-Received: by 2002:a17:906:6c94:: with SMTP id s20mr29926901ejr.152.1632150155812; Mon, 20 Sep 2021 08:02:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632150155; cv=none; d=google.com; s=arc-20160816; b=e8f4B4jr5geoCdYnsualdX0c0u03aPfDUBMc2WbJGLgFCyTriurpxu6RraWf6fGryN /LKwZAt+4HqaGGhQjylnDcKjgolMA0exyfybBf0EvG1naokSXQUHY0yHdmY9t++73IIb NXVQ5ZAhxhM84IdDfJGlZPp2NrDShgPTWpSf3rajuN5ksIlPROUEToG8+n/v1VRaJl6m daUhH+EnhIWQ4vVXptBbrSWrC65fcU4D/YsLbuLvB4dno0xfzQuNU9vDrYxeHzH1u4a4 gzuED4KUVMuXZtciGHRd5IICjpoYA0oOavpEXZ4wKRNutSkP5W05ZpIpHvukloJnM/KK fIDQ== 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=pfqomIcEFBiasMJE2Qdyi7uX0pydwy08BeB9RrbcbrU=; b=awStkgLzM3pEX8WWrRUfzWgJBeTVq34gzk7TvzQfWaXCApIxRnAf8Ea4gFKxwQZPGc yydV0W+MOxejsLd1s3thzoNgVlhQmlgMq9Q4xHzTxMoYufZ8e3QaGFrgldxN4L4jlxJU qhYRHFZWWfPSvHZ0wbL6unsSBKZ06tE0gqiUxYA0wlOexBxOYuREx5vL17EsWouyVlIV v3VIn8ErMu6Uwhm137CyOqW3ldmFG9o7ZzbbnEGFVKOCD6yfzqzIj8CDdOlrnjQ+0H2B HOk2FHPsFSfayGm1gZNDIm5qcYP/m3wS5YFCNl43XtbBxf/SonbjOu4Gs2S0Jv2lcKmg QdPw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=j0sSeeu+; 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 c7si17349840ejc.571.2021.09.20.08.02.25; Mon, 20 Sep 2021 08:02:35 -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=20210112 header.b=j0sSeeu+; 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 315DF68AECA; Mon, 20 Sep 2021 18:02:21 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9189668AC6A for ; Mon, 20 Sep 2021 18:02:14 +0300 (EEST) Received: by mail-lf1-f48.google.com with SMTP id g41so36261415lfv.1 for ; Mon, 20 Sep 2021 08:02:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=35WfmLINIHpt385Vox/euuNA9UaO8AaxzK72sHuFtgA=; b=j0sSeeu+YAIULGJ85x1rTLSFuQcYnrQv05GCWVJ9EA13X7t4RN1FZ1Z9c0yFJiMAGd 84pv9Y71iWaTvHCQygVcDZy0isvcCln0x6IfDmCffaIKkpYcNqR1aRquCZljrdgZxxR9 RhbzhLEAfcN9IurVTt6pfcdOmEdEgmU+id9BYrYMGPkgqQ2P8oLJ3X3mB7OXlkorMDjc JWMHDsBx4aY1CvOJX1H1fG/LbfA/Nq6W+aA5FHrlFacIVaR9jM2VWl0VbTHJvp5DaZoA k5mjIIXULriBhNLE8j91B3YIxpDO1dJlaZPDl0YbF8bh+rAUO9uSAnESaNKAT+CrgXbr i2bw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=35WfmLINIHpt385Vox/euuNA9UaO8AaxzK72sHuFtgA=; b=drrfMDJhl0FDJ1wu3VXudcB7tA74z4kdwOVi0RQvk7N/FcMLZj+8UNgcRcceIoCdVt pF867Iv8IBm10HfgRI/DJcj70kaszoG5K5UYku46EXHy5HvngQQlXygv+qfS+895AVEz EXblQ9jngE5ArNM5iyDoNCg8YrEJQbvbTCfgTfgBnI7Qn4Odd22uiRciH42juYf0/n5M SRYv4XRkD8rMIL+DEiiY4oE6b3gNTyTXF769nd7z+04rCyOHSPX8qOJF6pvsWTNLVSu5 ytnLCQn3FQLVWNcEsBBKowDTd77LGhxoWd/iTNWdggI6mY1WKZzzWfYk+p60OSRKo4OD n0Xg== X-Gm-Message-State: AOAM533Fs0lgmbAcshum8N7zaz0CcG/bYG9KayQbxNGq6AlT1dIJByQy KLxPAe0I1E85C4Q6v88HqivC36f2zg8= X-Received: by 2002:a05:6512:4008:: with SMTP id br8mr18606148lfb.23.1632150057378; Mon, 20 Sep 2021 08:00:57 -0700 (PDT) Received: from localhost.localdomain (91-159-194-103.elisa-laajakaista.fi. [91.159.194.103]) by smtp.gmail.com with ESMTPSA id v26sm1318300ljv.77.2021.09.20.08.00.56 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Sep 2021 08:00:56 -0700 (PDT) From: =?utf-8?q?Jan_Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Mon, 20 Sep 2021 18:00:46 +0300 Message-Id: <20210920150048.8790-4-jeebjp@gmail.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210920150048.8790-1-jeebjp@gmail.com> References: <20210920150048.8790-1-jeebjp@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 3/5] avformat/{aviobuf, avio_internal}: add max_len argument to ff_read_string_to_bprint_overwrite 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: 5NmQn23yZUGU From: Jan Ekström This is especially useful when reading things such as null-terminated strings from MOV/MP4-likes, where the size of the box is known, but not the exact size of the string. Signed-off-by: Jan Ekström --- libavformat/avio_internal.h | 13 ++++++++++--- libavformat/aviobuf.c | 23 +++++++++++++++-------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/libavformat/avio_internal.h b/libavformat/avio_internal.h index 3b3ed3b619..e40adc944e 100644 --- a/libavformat/avio_internal.h +++ b/libavformat/avio_internal.h @@ -247,14 +247,21 @@ int64_t ff_read_line_to_bprint_overwrite(AVIOContext *s, struct AVBPrint *bp); /** * Read a whole null-terminated string of text from AVIOContext to an AVBPrint - * buffer overwriting its contents. Stop reading after reaching a \\0 or - * EOF. + * buffer overwriting its contents. Stop reading after reaching the maximum + * length, a \\0 or EOF. * * @param s the read-only AVIOContext * @param bp the AVBPrint buffer + * @param max_len the maximum length to be read from the AVIOContext. + * Negative (< 0) values signal that there is no known maximum + * length applicable. A maximum length of zero means that the + * AVIOContext is not touched, and the function returns + * with a read length of zero. In all cases the AVBprint + * is cleared. * @return the length of the read string not including the terminating null, * negative on error, or if the buffer becomes truncated. */ -int64_t ff_read_string_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp); +int64_t ff_read_string_to_bprint_overwrite(AVIOContext *s, struct AVBPrint *bp, + int64_t max_len); #endif /* AVFORMAT_AVIO_INTERNAL_H */ diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index 3b6f9aed42..b43b24302b 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -809,13 +809,17 @@ typedef enum FFBPrintReadStringMode { } FFBPrintReadStringMode; static int64_t read_string_to_bprint(AVIOContext *s, AVBPrint *bp, - FFBPrintReadStringMode mode) + FFBPrintReadStringMode mode, + int64_t max_len) { int len, end; int64_t read = 0; char tmp[1024]; char c; + if (!max_len) + return 0; + do { len = 0; do { @@ -824,10 +828,11 @@ static int64_t read_string_to_bprint(AVIOContext *s, AVBPrint *bp, c == '\0'); if (!end) tmp[len++] = c; - } while (!end && len < sizeof(tmp)); + } while (!end && len < sizeof(tmp) && + ((max_len < 0) || (read + len < max_len))); av_bprint_append_data(bp, tmp, len); read += len; - } while (!end); + } while (!end && ((max_len < 0) || (read < max_len))); if (mode == FFBPrintReadLine && c == '\r' && avio_r8(s) != '\n' && !avio_feof(s)) @@ -843,12 +848,13 @@ static int64_t read_string_to_bprint(AVIOContext *s, AVBPrint *bp, } static int64_t read_string_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp, - FFBPrintReadStringMode mode) + FFBPrintReadStringMode mode, + int64_t max_len) { int64_t ret; av_bprint_clear(bp); - ret = read_string_to_bprint(s, bp, mode); + ret = read_string_to_bprint(s, bp, mode, max_len); if (ret < 0) return ret; @@ -860,12 +866,13 @@ static int64_t read_string_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp, int64_t ff_read_line_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp) { - return read_string_to_bprint_overwrite(s, bp, FFBPrintReadLine); + return read_string_to_bprint_overwrite(s, bp, FFBPrintReadLine, -1); } -int64_t ff_read_string_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp) +int64_t ff_read_string_to_bprint_overwrite(AVIOContext *s, AVBPrint *bp, + int64_t max_len) { - return read_string_to_bprint_overwrite(s, bp, FFBPrintReadString); + return read_string_to_bprint_overwrite(s, bp, FFBPrintReadString, max_len); } int avio_get_str(AVIOContext *s, int maxlen, char *buf, int buflen) From patchwork Mon Sep 20 15:00:47 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: 30380 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6506:0:0:0:0:0 with SMTP id z6csp1533726iob; Mon, 20 Sep 2021 08:03:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxrTpzyQ/RUew40VqBT97DuS7s/5EIbiNxGTY3SUrnQNm+CD+BsNQPXMiDDcYpXajS0q0Ay X-Received: by 2002:ac2:5e23:: with SMTP id o3mr11875445lfg.352.1632150229879; Mon, 20 Sep 2021 08:03:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632150229; cv=none; d=google.com; s=arc-20160816; b=gVctWQ5cYlMPiY9lbCwnjdvZPeNfFpF7bupzsJP3/LdhOWPBrw713Vnbj08x8qQv1/ pcWHtkb9tZLbLm/FyUD2Xj2LFBu/HF9gM3HgHd2FysAMlvbvJwNnNfmVZULaiu78SK1T eam2eodDnRwyyNZg7TKBGeJVu/TQQA3JEz2mfnB3y19PMSakycVL1t5VVaIvU5LXVu8c nffZA3l5Ovog1gidfNW0dymMJqa2NWNp9TNer6nlQ4i/k7NeUkaj5L8yTAEaiHyJExWT TvwKB7Mc+/uoA2HHg7KVeVSr4W+JK07XAV0ZKn6K87cuGYlYnoqMnegu+K1rb6O3+kMJ vVAA== 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=sZSPofAvDacFkrSTegHX09fSzUzeE+xPSxptGHTKIi8=; b=bj/Tcblc4OwlzWnuOzTk3uDoZv1W9U5f0xpR8dUTIQ1MztbFaQqRhrnQgx576aB2+D zbnUK+1m47Gy0ApyyPoTaIMVOVeDPicPcfeLpL1rikFZFqLkWMCBqBZfNEYU15SnG5ju fBXgYqySrXhl4WTQxWSjQRdjMYeAI4BWFPpLL7otvxsXRjJaf0vRdCWOmNVzWbfYLSG1 Z1ASmZ6c6yq+VJXOEXsU7M+9h+NHqSxEWm/3x865Iy+5OBtOdZ7Sy4qPvlqq+1smCNMS npvcVxJixf3nNifGZrRtVjlTHXIlDMewtYAWPYuzJLsM51gPM//1mVJ3ZLhP50NKT1gs wU5Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=k1v8nDIh; 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 p17si15922106ejn.242.2021.09.20.08.03.33; Mon, 20 Sep 2021 08:03:49 -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=20210112 header.b=k1v8nDIh; 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 281B468AF51; Mon, 20 Sep 2021 18:03:01 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id B235C68AF4F for ; Mon, 20 Sep 2021 18:02:52 +0300 (EEST) Received: by mail-lf1-f48.google.com with SMTP id e15so30455410lfr.10 for ; Mon, 20 Sep 2021 08:02:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=+BmIODvwmS1KcJ74txKWIeoolf/NQqwym1uTv5IuYF0=; b=k1v8nDIhD8UoPM9NATdZdb6CynEwARlr5IrhRGrzkd/y3UfVe5Mbmf2xKqG+h3ODrG WsHgQj6duwZufzU8L988wusRVB4Uk5UGq0/GDGezRjvd9NPLTWhIytvWrBDt0yKwW/P6 UKdwrq3CKQqKFSmo/UgE6b/UG2Lgadd4o3CEjZgyqutns89uWAkt+ydh2QgIX8jxfA6p IEi5XtxU3kp+Apab7rQgs8eFtGX72SJyXC2EabbW4Q/ZEzwxhIncduQWgkabzomQTy0E 4uEUpw28UVGsEcOTcKAsHtX6UyyXjvgdwt/EFMwjNkSoZLkC3SXSDkowH0tIHwszYYir JKfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=+BmIODvwmS1KcJ74txKWIeoolf/NQqwym1uTv5IuYF0=; b=XiEITxajb/jjbIBdTTjB2Rzq8sYrahPqYnPk6+pyK1B1Xf0RTkNw7PtNv6aFzQtJYe lHGd70ZJzCJVgCZW9v3Z+i/rUikNPDM1hUqDoHJSOMLR0E4fZNOMTnzRtVrmxT7btTVu dI6wqZpyoZzv2JsuLqjjZdmXZo1LZN5d7rpbJfYZ0WzZHStxDnhVASOaRWNxoHzRVF5T 2krewy3kKx6YAopYZ0JqXU7IfKEyYVi05YD0grzfG4KDDbhCOA2bDfDf7SA+WX8013Eo +oMS4qVDyNraUu5jMLxDftB2pBdnJDKcle82Eg5VNWF1xsIoSP2KuGVY6ytvocUaUWEy Q8dQ== X-Gm-Message-State: AOAM533nSOuxoa94YlcxZkzzlrYKNYLsW0mX4m+CLFDk8vEsv/33wT0k 5FqL7l5Rs5KS1FRc2/lY1CTP3X1Thxg= X-Received: by 2002:a05:6512:3b85:: with SMTP id g5mr13374238lfv.556.1632150058377; Mon, 20 Sep 2021 08:00:58 -0700 (PDT) Received: from localhost.localdomain (91-159-194-103.elisa-laajakaista.fi. [91.159.194.103]) by smtp.gmail.com with ESMTPSA id v26sm1318300ljv.77.2021.09.20.08.00.57 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Sep 2021 08:00:57 -0700 (PDT) From: =?utf-8?q?Jan_Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Mon, 20 Sep 2021 18:00:47 +0300 Message-Id: <20210920150048.8790-5-jeebjp@gmail.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210920150048.8790-1-jeebjp@gmail.com> References: <20210920150048.8790-1-jeebjp@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 4/5] avformat/{isom, mov, movenc}: add support for CMAF DASH roles 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: na4exA07fLnp From: Jan Ekström This information is coded in a standard MP4 KindBox and utilizes the scheme and values as per the DASH role scheme defined in MPEG-DASH. Other schemes are technically allowed, but where multiple schemes define the same concepts, the DASH scheme should be utilized. Such flagging is additionally utilized by the DASH-IF CMAF ingest specification, enabling an encoder to inform the following component of the roles of the incoming media streams. A test is added for this functionality in a similar manner to the matroska test. Signed-off-by: Jan Ekström --- libavformat/isom.c | 19 ++++ libavformat/isom.h | 12 +++ libavformat/mov.c | 91 +++++++++++++++++++ libavformat/movenc.c | 51 +++++++++++ tests/fate/mov.mak | 9 ++ .../ref/fate/mov-mp4-disposition-mpegts-remux | 81 +++++++++++++++++ 6 files changed, 263 insertions(+) create mode 100644 tests/ref/fate/mov-mp4-disposition-mpegts-remux diff --git a/libavformat/isom.c b/libavformat/isom.c index 4df5440023..300ba927c2 100644 --- a/libavformat/isom.c +++ b/libavformat/isom.c @@ -430,3 +430,22 @@ void ff_mov_write_chan(AVIOContext *pb, int64_t channel_layout) } avio_wb32(pb, 0); // mNumberChannelDescriptions } + +static const struct MP4TrackKindValueMapping dash_role_map[] = { + { AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_CAPTIONS, + "caption" }, + { AV_DISPOSITION_COMMENT, + "commentary" }, + { AV_DISPOSITION_VISUAL_IMPAIRED|AV_DISPOSITION_DESCRIPTIONS, + "description" }, + { AV_DISPOSITION_DUB, + "dub" }, + { AV_DISPOSITION_FORCED, + "forced-subtitle" }, + { 0, NULL } +}; + +const struct MP4TrackKindMapping ff_mov_track_kind_table[] = { + { "urn:mpeg:dash:role:2011", dash_role_map }, + { 0, NULL } +}; diff --git a/libavformat/isom.h b/libavformat/isom.h index 34a58c79b7..c62fcf2bfe 100644 --- a/libavformat/isom.h +++ b/libavformat/isom.h @@ -390,4 +390,16 @@ static inline enum AVCodecID ff_mov_get_lpcm_codec_id(int bps, int flags) #define MOV_ISMV_TTML_TAG MKTAG('d', 'f', 'x', 'p') #define MOV_MP4_TTML_TAG MKTAG('s', 't', 'p', 'p') +struct MP4TrackKindValueMapping { + int disposition; + const char *value; +}; + +struct MP4TrackKindMapping { + const char *scheme_uri; + const struct MP4TrackKindValueMapping *value_maps; +}; + +extern const struct MP4TrackKindMapping ff_mov_track_kind_table[]; + #endif /* AVFORMAT_ISOM_H */ diff --git a/libavformat/mov.c b/libavformat/mov.c index ca14646a38..81e8d3bac9 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -28,6 +28,7 @@ #include #include "libavutil/attributes.h" +#include "libavutil/bprint.h" #include "libavutil/channel_layout.h" #include "libavutil/internal.h" #include "libavutil/intreadwrite.h" @@ -6851,6 +6852,95 @@ static int mov_read_dvcc_dvvc(MOVContext *c, AVIOContext *pb, MOVAtom atom) return 0; } +static int mov_read_kind(MOVContext *c, AVIOContext *pb, MOVAtom atom) +{ + AVFormatContext *ctx = c->fc; + AVStream *st = NULL; + AVBPrint scheme_buf, value_buf; + int64_t scheme_str_len = 0, value_str_len = 0; + int version, flags, ret = AVERROR_BUG; + int64_t size = atom.size; + + if (atom.size < 6) + // 4 bytes for version + flags, 2x 1 byte for null + return AVERROR_INVALIDDATA; + + if (c->fc->nb_streams < 1) + return 0; + st = c->fc->streams[c->fc->nb_streams-1]; + + version = avio_r8(pb); + flags = avio_rb24(pb); + size -= 4; + + if (version != 0 || flags != 0) { + av_log(ctx, AV_LOG_ERROR, + "Unsupported 'kind' box with version %d, flags: %x", + version, flags); + return AVERROR_INVALIDDATA; + } + + av_bprint_init(&scheme_buf, 0, AV_BPRINT_SIZE_UNLIMITED); + av_bprint_init(&value_buf, 0, AV_BPRINT_SIZE_UNLIMITED); + + if ((scheme_str_len = ff_read_string_to_bprint_overwrite(pb, &scheme_buf, + size)) < 0) { + ret = scheme_str_len; + goto cleanup; + } + + if (scheme_str_len + 1 >= size) { + // we need to have another string, even if nullptr. + // we check with + 1 since we expect that if size was not hit, + // an additional null was read. + ret = AVERROR_INVALIDDATA; + goto cleanup; + } + + size -= scheme_str_len + 1; + + if ((value_str_len = ff_read_string_to_bprint_overwrite(pb, &value_buf, + size)) < 0) { + ret = value_str_len; + goto cleanup; + } + + if (value_str_len == size) { + // in case of no trailing null, box is not valid. + ret = AVERROR_INVALIDDATA; + goto cleanup; + } + + av_log(ctx, AV_LOG_TRACE, + "%s stream %d KindBox(scheme: %s, value: %s)\n", + av_get_media_type_string(st->codecpar->codec_type), + st->index, + scheme_buf.str, value_buf.str); + + for (int i = 0; ff_mov_track_kind_table[i].scheme_uri; i++) { + const struct MP4TrackKindMapping map = ff_mov_track_kind_table[i]; + if (!av_strstart(scheme_buf.str, map.scheme_uri, NULL)) + continue; + + for (int j = 0; map.value_maps[j].disposition; j++) { + const struct MP4TrackKindValueMapping value_map = map.value_maps[j]; + if (!av_strstart(value_buf.str, value_map.value, NULL)) + continue; + + st->disposition |= value_map.disposition; + } + } + + ret = 0; + +cleanup: + + av_bprint_finalize(&scheme_buf, NULL); + av_bprint_finalize(&value_buf, NULL); + + return ret; +} + static const MOVParseTableEntry mov_default_parse_table[] = { { MKTAG('A','C','L','R'), mov_read_aclr }, { MKTAG('A','P','R','G'), mov_read_avid }, @@ -6948,6 +7038,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = { { MKTAG('c','l','l','i'), mov_read_clli }, { MKTAG('d','v','c','C'), mov_read_dvcc_dvvc }, { MKTAG('d','v','v','C'), mov_read_dvcc_dvvc }, +{ MKTAG('k','i','n','d'), mov_read_kind }, { 0, NULL } }; diff --git a/libavformat/movenc.c b/libavformat/movenc.c index cfb5a5c725..0c4a24c313 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -3329,6 +3329,52 @@ static int mov_write_track_metadata(AVIOContext *pb, AVStream *st, return update_size(pb, pos); } +static int mov_write_track_kind(AVIOContext *pb, const char *scheme_uri, + const char *value) +{ + int64_t pos = avio_tell(pb); + + /* Box|FullBox basics */ + avio_wb32(pb, 0); /* size placeholder */ + ffio_wfourcc(pb, (const unsigned char *)"kind"); + avio_w8(pb, 0); /* version = 0 */ + avio_wb24(pb, 0); /* flags = 0 */ + + /* Required null-terminated scheme URI */ + avio_write(pb, (const unsigned char *)scheme_uri, + strlen(scheme_uri)); + avio_w8(pb, 0); + + /* Optional value string */ + if (value && value[0]) + avio_write(pb, (const unsigned char *)value, + strlen(value)); + + avio_w8(pb, 0); + + return update_size(pb, pos); +} + +static int mov_write_track_kinds(AVIOContext *pb, AVStream *st) +{ + int ret = AVERROR_BUG; + + for (int i = 0; ff_mov_track_kind_table[i].scheme_uri; i++) { + const struct MP4TrackKindMapping map = ff_mov_track_kind_table[i]; + + for (int j = 0; map.value_maps[j].disposition; j++) { + const struct MP4TrackKindValueMapping value_map = map.value_maps[j]; + if (!(st->disposition & value_map.disposition)) + continue; + + if ((ret = mov_write_track_kind(pb, map.scheme_uri, value_map.value)) < 0) + return ret; + } + } + + return 0; +} + static int mov_write_track_udta_tag(AVIOContext *pb, MOVMuxContext *mov, AVStream *st) { @@ -3346,6 +3392,11 @@ static int mov_write_track_udta_tag(AVIOContext *pb, MOVMuxContext *mov, if (mov->mode & (MODE_MP4|MODE_MOV)) mov_write_track_metadata(pb_buf, st, "name", "title"); + if (mov->mode & MODE_MP4) { + if ((ret = mov_write_track_kinds(pb_buf, st)) < 0) + return ret; + } + if ((size = avio_get_dyn_buf(pb_buf, &buf)) > 0) { avio_wb32(pb, size + 8); ffio_wfourcc(pb, "udta"); diff --git a/tests/fate/mov.mak b/tests/fate/mov.mak index 0c9177aa81..5ca992e181 100644 --- a/tests/fate/mov.mak +++ b/tests/fate/mov.mak @@ -136,6 +136,15 @@ FATE_MOV_FFMPEG_FFPROBE-$(call ALLYES, FILE_PROTOCOL SRT_DEMUXER MOV_DEMUXER SUB fate-mov-mp4-ttml-stpp: CMD = transcode srt $(TARGET_SAMPLES)/sub/SubRip_capability_tester.srt mp4 "-map 0:s -c:s ttml -time_base:s 1:1000" "-map 0 -c copy" "" "-of json -show_entries packet:stream=index,codec_type,codec_tag_string,codec_tag,codec_name,time_base,start_time,duration_ts,duration,nb_frames,nb_read_packets:stream_tags" fate-mov-mp4-ttml-dfxp: CMD = transcode srt $(TARGET_SAMPLES)/sub/SubRip_capability_tester.srt mp4 "-map 0:s -c:s ttml -time_base:s 1:1000 -tag:s dfxp -strict unofficial" "-map 0 -c copy" "" "-of json -show_entries packet:stream=index,codec_type,codec_tag_string,codec_tag,codec_name,time_base,start_time,duration_ts,duration,nb_frames,nb_read_packets:stream_tags" +# Resulting remux should have: +# 1. first audio stream with AV_DISPOSITION_HEARING_IMPAIRED +# 2. second audio stream with AV_DISPOSITION_VISUAL_IMPAIRED | DESCRIPTIONS +FATE_MOV_FFMPEG_FFPROBE-$(call ALLYES, FILE_PROTOCOL PIPE_PROTOCOL \ + MPEGTS_DEMUXER MOV_DEMUXER AC3_DECODER \ + MP4_MUXER FRAMECRC_MUXER ) \ + += fate-mov-mp4-disposition-mpegts-remux +fate-mov-mp4-disposition-mpegts-remux: CMD = transcode mpegts $(TARGET_SAMPLES)/mpegts/pmtchange.ts mp4 "-map 0:1 -map 0:2 -c copy -disposition:a:0 +hearing_impaired" "-map 0 -c copy" "" "-of json -show_entries stream_disposition:stream=index" + FATE_SAMPLES_FFMPEG_FFPROBE += $(FATE_MOV_FFMPEG_FFPROBE-yes) fate-mov: $(FATE_MOV) $(FATE_MOV_FFPROBE) $(FATE_MOV_FASTSTART) $(FATE_MOV_FFMPEG_FFPROBE-yes) diff --git a/tests/ref/fate/mov-mp4-disposition-mpegts-remux b/tests/ref/fate/mov-mp4-disposition-mpegts-remux new file mode 100644 index 0000000000..2df48a0b0d --- /dev/null +++ b/tests/ref/fate/mov-mp4-disposition-mpegts-remux @@ -0,0 +1,81 @@ +e9a12470bc7645cebca985a9f3762c6c *tests/data/fate/mov-mp4-disposition-mpegts-remux.mp4 +5705 tests/data/fate/mov-mp4-disposition-mpegts-remux.mp4 +#tb 0: 1/48000 +#media_type 0: audio +#codec_id 0: ac3 +#sample_rate 0: 48000 +#channel_layout 0: 3 +#channel_layout_name 0: stereo +#tb 1: 1/48000 +#media_type 1: audio +#codec_id 1: ac3 +#sample_rate 1: 48000 +#channel_layout 1: 3 +#channel_layout_name 1: stereo +1, 0, 0, 1536, 768, 0xa63778d4, S=1, 4 +1, 1536, 1536, 1536, 768, 0x7d577f3f +0, 3072, 3072, 1536, 768, 0xc2867884, S=1, 4 +1, 3072, 3072, 1536, 768, 0xd86b7c8f +0, 4608, 4608, 1536, 690, 0xa2714bf3 +1, 4608, 4608, 1536, 626, 0x09f4382f +{ + "programs": [ + + ], + "streams": [ + { + "index": 0, + "disposition": { + "default": 1, + "dub": 0, + "original": 0, + "comment": 0, + "lyrics": 0, + "karaoke": 0, + "forced": 0, + "hearing_impaired": 1, + "visual_impaired": 0, + "clean_effects": 0, + "attached_pic": 0, + "timed_thumbnails": 0, + "captions": 1, + "descriptions": 0, + "metadata": 0, + "dependent": 0, + "still_image": 0 + }, + "side_data_list": [ + { + + } + ] + }, + { + "index": 1, + "disposition": { + "default": 0, + "dub": 0, + "original": 0, + "comment": 0, + "lyrics": 0, + "karaoke": 0, + "forced": 0, + "hearing_impaired": 0, + "visual_impaired": 1, + "clean_effects": 0, + "attached_pic": 0, + "timed_thumbnails": 0, + "captions": 0, + "descriptions": 1, + "metadata": 0, + "dependent": 0, + "still_image": 0 + }, + "side_data_list": [ + { + + } + ] + } + ] +} From patchwork Mon Sep 20 15:00:48 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: 30381 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:6506:0:0:0:0:0 with SMTP id z6csp1532486iob; Mon, 20 Sep 2021 08:02:43 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyo1qt08eq/d2FYIMPv4DpP3WcJeUXrp+80ZzlLx3rA7/wJ5aYVI2DZdC9ZFa3amzwlW6ty X-Received: by 2002:a05:600c:4f55:: with SMTP id m21mr22464625wmq.149.1632150162770; Mon, 20 Sep 2021 08:02:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632150162; cv=none; d=google.com; s=arc-20160816; b=KzKCEQIKjPazgi8AJ3l35hTfuVCsak37blAHOl6AzvozH40e3trLHx2TO9PIFjq6GY zBTttPA0ipv7+QyDQVZNlLSdwB5k2aS76nSF/uZbzrvQndiBIhNXfrAcTEpEo02dfcnN 0wq2rKvFEpfUtB+ysOHIVBAyyo3hIqDDQQyP85NFnyG7FqWVFDK0d+7Isn6LFRBgcB3P VcMBJw5eO5rwhyff3ZFPyOyNKMYzmdjXSoBCj5clJ5Ws4BJ4Mh1ESu3pxzAAAEZQv5s7 8tvkmbCPvwDOtL5BPOq4fZeBFfJZN9n/ieADKjZ/dfyERaJH89lnUytZK1FLOuDOqS68 DWVQ== 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=zJD+RGTiGzOjBI4Nbwv5zmM56LzxJ9NJ8G3dHVlozm0=; b=LqGc8cVn0lPXsMNaD7zi5f9mc1Zzg44HL0kGOxdq3YBTjM1jRKFef8SI4Hp1u0FHFQ Hytg4aNVhIOBOy715ZNcIF4VsCo4dQAFbZE9k3/poGvr6Txjy83xeq2xPY1C8c+YMIjL Isku5BOfzbUx3gXv9B8MK2yvDUU8F/jdMOdxOb0mKEJE6pTLN5+ie1AIBm1WdmOH6cMy TAsS9qsAc4pFl+0h5u6LWDHFoli9PrrUP4IggObPzAbWT2A+wX+ovg1FT59EXNtGwiUp 8qtuuHz0hTlVF/lfe+Hfnj09M1DBpTy1kQ9/tIMzO5rjmWPvSQpWlqrPWVv2Zy8dxvtP Hx/A== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20210112 header.b=S6UjFlOv; 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 r6si16867173edq.273.2021.09.20.08.02.37; Mon, 20 Sep 2021 08:02:42 -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=20210112 header.b=S6UjFlOv; 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 4A1A968AED9; Mon, 20 Sep 2021 18:02:24 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-lf1-f53.google.com (mail-lf1-f53.google.com [209.85.167.53]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4655A68AECE for ; Mon, 20 Sep 2021 18:02:16 +0300 (EEST) Received: by mail-lf1-f53.google.com with SMTP id g41so36261881lfv.1 for ; Mon, 20 Sep 2021 08:02:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=6wmVhyCgmMhbf8vSCUWJY2M3I4xRZQwtXo2/e3ddpl4=; b=S6UjFlOvKaxLKX5qGlol2ReFD9j+p3NFKavO91EH89Dv0DwfOU1/eGUIx5Vd1nVHHT b8DiVXo4uz4c0tG/nES2FokCyZj2Ae66e7CbFFP8tn9/xLB4I/X4n2sPBSPAydI2IKw0 8mCaevl5xO0Won3PL0mN9B0tWEwZ/tTC8ynYYA4GN4lMvyLE0yO/VFiILg8RU30/+EAD IcllKPUY/sZ30uy5RsgrJOsOMmIzjrKiiG6c3RSTMkzZjP87tXdGB0wE+QliPf9qV1k2 xRFYZkZOAV4t9+tSIVyqjzLQM50X/MDRrK3UkrIQNvr5uA7P8cYzpLA5+SZGUE+tS8xu KfqQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=6wmVhyCgmMhbf8vSCUWJY2M3I4xRZQwtXo2/e3ddpl4=; b=QBQ4UsLOraflQy5cdJd2X51KF/yonkld80lrjfeGPsJwlg8SR29rht/SP2D8Phpe3O y5Qg7ChEQ86f0r6iwZTqnCcxo9bbUJgmW4W8QiFThG6N06fGIE3bNmPxSLKivAahxnlZ rYxyZ+fSR2nvAo8MW59/L2dyNRbYb5PmJPuU7BFOzqksUoFPHOaM/hjkckFMFKt5AOEt dzf8j4qfok2UREo80NudrrMIGI2uwc+ExbsShLcKJwyc0LAzyVe70Jj4Cjw3KsONefPF 1QUYWzpyN10htChR3tagdy4zFBzUPqeWFV5YrFf+lv6fl61de2QWxV24vUkanLDbE74u Ud7Q== X-Gm-Message-State: AOAM532Tz2fqAswZlun6RrlKzwmatSAkN27dDZWTxzUn7mHCGgcHIeZo gUOpxgIW+6GFkIhjo0rJCHw5U4sC3P8= X-Received: by 2002:ac2:5387:: with SMTP id g7mr19068224lfh.541.1632150059322; Mon, 20 Sep 2021 08:00:59 -0700 (PDT) Received: from localhost.localdomain (91-159-194-103.elisa-laajakaista.fi. [91.159.194.103]) by smtp.gmail.com with ESMTPSA id v26sm1318300ljv.77.2021.09.20.08.00.58 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 20 Sep 2021 08:00:58 -0700 (PDT) From: =?utf-8?q?Jan_Ekstr=C3=B6m?= To: ffmpeg-devel@ffmpeg.org Date: Mon, 20 Sep 2021 18:00:48 +0300 Message-Id: <20210920150048.8790-6-jeebjp@gmail.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20210920150048.8790-1-jeebjp@gmail.com> References: <20210920150048.8790-1-jeebjp@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 5/5] avformat/{isom, movenc}: add kind box compatibility mode for Unified Origin 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: FxNq09M/K9iM From: Jan Ekström Unfortunately the current production versions of this software do not 100% adhere to the CMAF specification, and have decided to utilize the HTML5 media track identifier for audio descriptions. This way the default mode of operation is according to the CMAF specification, but it is also possible to output streams with which this piece of software is capable of interoperating with. Signed-off-by: Jan Ekström --- libavformat/isom.c | 23 ++++-- libavformat/isom.h | 7 ++ libavformat/movenc.c | 12 ++- libavformat/movenc.h | 2 + tests/fate/mov.mak | 8 ++ ...p4-disposition-unified-origin-mpegts-remux | 81 +++++++++++++++++++ 6 files changed, 125 insertions(+), 8 deletions(-) create mode 100644 tests/ref/fate/mov-mp4-disposition-unified-origin-mpegts-remux diff --git a/libavformat/isom.c b/libavformat/isom.c index 300ba927c2..512ffba651 100644 --- a/libavformat/isom.c +++ b/libavformat/isom.c @@ -433,19 +433,32 @@ void ff_mov_write_chan(AVIOContext *pb, int64_t channel_layout) static const struct MP4TrackKindValueMapping dash_role_map[] = { { AV_DISPOSITION_HEARING_IMPAIRED|AV_DISPOSITION_CAPTIONS, - "caption" }, + "caption", + KindWritingModeCMAF | KindWritingModeUnifiedOrigin }, { AV_DISPOSITION_COMMENT, - "commentary" }, + "commentary", + KindWritingModeCMAF | KindWritingModeUnifiedOrigin }, { AV_DISPOSITION_VISUAL_IMPAIRED|AV_DISPOSITION_DESCRIPTIONS, - "description" }, + "description", + KindWritingModeCMAF }, { AV_DISPOSITION_DUB, - "dub" }, + "dub", + KindWritingModeCMAF | KindWritingModeUnifiedOrigin }, { AV_DISPOSITION_FORCED, - "forced-subtitle" }, + "forced-subtitle", + KindWritingModeCMAF | KindWritingModeUnifiedOrigin }, + { 0, NULL } +}; + +static const struct MP4TrackKindValueMapping html_kind_map[] = { + { AV_DISPOSITION_VISUAL_IMPAIRED|AV_DISPOSITION_DESCRIPTIONS, + "main-desc", + KindWritingModeUnifiedOrigin }, { 0, NULL } }; const struct MP4TrackKindMapping ff_mov_track_kind_table[] = { { "urn:mpeg:dash:role:2011", dash_role_map }, + { "about:html-kind", html_kind_map }, { 0, NULL } }; diff --git a/libavformat/isom.h b/libavformat/isom.h index c62fcf2bfe..f0381e9a8e 100644 --- a/libavformat/isom.h +++ b/libavformat/isom.h @@ -390,9 +390,16 @@ static inline enum AVCodecID ff_mov_get_lpcm_codec_id(int bps, int flags) #define MOV_ISMV_TTML_TAG MKTAG('d', 'f', 'x', 'p') #define MOV_MP4_TTML_TAG MKTAG('s', 't', 'p', 'p') +enum MP4TrackKindWritingMode { + KindWritingModeCMAF = (1 << 0), + KindWritingModeUnifiedOrigin = (1 << 1), + KindWritingModeNB, +}; + struct MP4TrackKindValueMapping { int disposition; const char *value; + uint32_t writing_modes; }; struct MP4TrackKindMapping { diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 0c4a24c313..1550bdd16f 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -111,6 +111,9 @@ static const AVOption options[] = { { "pts", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = MOV_PRFT_SRC_PTS}, 0, 0, AV_OPT_FLAG_ENCODING_PARAM, "prft"}, { "empty_hdlr_name", "write zero-length name string in hdlr atoms within mdia and minf atoms", offsetof(MOVMuxContext, empty_hdlr_name), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, AV_OPT_FLAG_ENCODING_PARAM}, { "movie_timescale", "set movie timescale", offsetof(MOVMuxContext, movie_timescale), AV_OPT_TYPE_INT, {.i64 = MOV_TIMESCALE}, 1, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM}, + { "kind_writing_mode", "set kind box writing mode", offsetof(MOVMuxContext, kind_writing_mode), AV_OPT_TYPE_INT, {.i64 = KindWritingModeCMAF}, KindWritingModeCMAF, KindWritingModeNB - 1, AV_OPT_FLAG_ENCODING_PARAM, "kind_writing_mode"}, + { "cmaf", "CMAF writing mode", 0, AV_OPT_TYPE_CONST, {.i64 = KindWritingModeCMAF}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "kind_writing_mode"}, + { "unified_origin", "Compatibility mode for Unified Origin (all DASH except for audio description)", 0, AV_OPT_TYPE_CONST, {.i64 = KindWritingModeUnifiedOrigin}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "kind_writing_mode"}, { NULL }, }; @@ -3355,7 +3358,8 @@ static int mov_write_track_kind(AVIOContext *pb, const char *scheme_uri, return update_size(pb, pos); } -static int mov_write_track_kinds(AVIOContext *pb, AVStream *st) +static int mov_write_track_kinds(AVIOContext *pb, AVStream *st, + enum MP4TrackKindWritingMode mode) { int ret = AVERROR_BUG; @@ -3364,7 +3368,8 @@ static int mov_write_track_kinds(AVIOContext *pb, AVStream *st) for (int j = 0; map.value_maps[j].disposition; j++) { const struct MP4TrackKindValueMapping value_map = map.value_maps[j]; - if (!(st->disposition & value_map.disposition)) + if (!(st->disposition & value_map.disposition) || + !(value_map.writing_modes & mode)) continue; if ((ret = mov_write_track_kind(pb, map.scheme_uri, value_map.value)) < 0) @@ -3393,7 +3398,8 @@ static int mov_write_track_udta_tag(AVIOContext *pb, MOVMuxContext *mov, mov_write_track_metadata(pb_buf, st, "name", "title"); if (mov->mode & MODE_MP4) { - if ((ret = mov_write_track_kinds(pb_buf, st)) < 0) + if ((ret = mov_write_track_kinds(pb_buf, st, + mov->kind_writing_mode)) < 0) return ret; } diff --git a/libavformat/movenc.h b/libavformat/movenc.h index 40077b1afe..e02a086b1f 100644 --- a/libavformat/movenc.h +++ b/libavformat/movenc.h @@ -25,6 +25,7 @@ #define AVFORMAT_MOVENC_H #include "avformat.h" +#include "isom.h" #include "movenccenc.h" #include "libavcodec/packet_internal.h" @@ -242,6 +243,7 @@ typedef struct MOVMuxContext { MOVPrftBox write_prft; int empty_hdlr_name; int movie_timescale; + enum MP4TrackKindWritingMode kind_writing_mode; } MOVMuxContext; #define FF_MOV_FLAG_RTP_HINT (1 << 0) diff --git a/tests/fate/mov.mak b/tests/fate/mov.mak index 5ca992e181..20f085803b 100644 --- a/tests/fate/mov.mak +++ b/tests/fate/mov.mak @@ -145,6 +145,14 @@ FATE_MOV_FFMPEG_FFPROBE-$(call ALLYES, FILE_PROTOCOL PIPE_PROTOCOL \ += fate-mov-mp4-disposition-mpegts-remux fate-mov-mp4-disposition-mpegts-remux: CMD = transcode mpegts $(TARGET_SAMPLES)/mpegts/pmtchange.ts mp4 "-map 0:1 -map 0:2 -c copy -disposition:a:0 +hearing_impaired" "-map 0 -c copy" "" "-of json -show_entries stream_disposition:stream=index" +# Same as the previous test, but the audio disposition should now be tagged +# with the HTML5 media track identifier as opposed to the DASH identifier. +FATE_MOV_FFMPEG_FFPROBE-$(call ALLYES, FILE_PROTOCOL PIPE_PROTOCOL \ + MPEGTS_DEMUXER MOV_DEMUXER AC3_DECODER \ + MP4_MUXER FRAMECRC_MUXER ) \ + += fate-mov-mp4-disposition-unified-origin-mpegts-remux +fate-mov-mp4-disposition-unified-origin-mpegts-remux: CMD = transcode mpegts $(TARGET_SAMPLES)/mpegts/pmtchange.ts mp4 "-map 0:1 -map 0:2 -c copy -disposition:a:0 +hearing_impaired -kind_writing_mode unified_origin" "-map 0 -c copy" "" "-of json -show_entries stream_disposition:stream=index" + FATE_SAMPLES_FFMPEG_FFPROBE += $(FATE_MOV_FFMPEG_FFPROBE-yes) fate-mov: $(FATE_MOV) $(FATE_MOV_FFPROBE) $(FATE_MOV_FASTSTART) $(FATE_MOV_FFMPEG_FFPROBE-yes) diff --git a/tests/ref/fate/mov-mp4-disposition-unified-origin-mpegts-remux b/tests/ref/fate/mov-mp4-disposition-unified-origin-mpegts-remux new file mode 100644 index 0000000000..0242cffb9b --- /dev/null +++ b/tests/ref/fate/mov-mp4-disposition-unified-origin-mpegts-remux @@ -0,0 +1,81 @@ +99f1d34f8028c674cb10d2604a7f0117 *tests/data/fate/mov-mp4-disposition-unified-origin-mpegts-remux.mp4 +5695 tests/data/fate/mov-mp4-disposition-unified-origin-mpegts-remux.mp4 +#tb 0: 1/48000 +#media_type 0: audio +#codec_id 0: ac3 +#sample_rate 0: 48000 +#channel_layout 0: 3 +#channel_layout_name 0: stereo +#tb 1: 1/48000 +#media_type 1: audio +#codec_id 1: ac3 +#sample_rate 1: 48000 +#channel_layout 1: 3 +#channel_layout_name 1: stereo +1, 0, 0, 1536, 768, 0xa63778d4, S=1, 4 +1, 1536, 1536, 1536, 768, 0x7d577f3f +0, 3072, 3072, 1536, 768, 0xc2867884, S=1, 4 +1, 3072, 3072, 1536, 768, 0xd86b7c8f +0, 4608, 4608, 1536, 690, 0xa2714bf3 +1, 4608, 4608, 1536, 626, 0x09f4382f +{ + "programs": [ + + ], + "streams": [ + { + "index": 0, + "disposition": { + "default": 1, + "dub": 0, + "original": 0, + "comment": 0, + "lyrics": 0, + "karaoke": 0, + "forced": 0, + "hearing_impaired": 1, + "visual_impaired": 0, + "clean_effects": 0, + "attached_pic": 0, + "timed_thumbnails": 0, + "captions": 1, + "descriptions": 0, + "metadata": 0, + "dependent": 0, + "still_image": 0 + }, + "side_data_list": [ + { + + } + ] + }, + { + "index": 1, + "disposition": { + "default": 0, + "dub": 0, + "original": 0, + "comment": 0, + "lyrics": 0, + "karaoke": 0, + "forced": 0, + "hearing_impaired": 0, + "visual_impaired": 1, + "clean_effects": 0, + "attached_pic": 0, + "timed_thumbnails": 0, + "captions": 0, + "descriptions": 1, + "metadata": 0, + "dependent": 0, + "still_image": 0 + }, + "side_data_list": [ + { + + } + ] + } + ] +}