From patchwork Sun Jan 16 23:03:51 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 33623 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp2273201iog; Sun, 16 Jan 2022 15:05:54 -0800 (PST) X-Google-Smtp-Source: ABdhPJw+TRWIj+dssBrEhjOkCOFa/e5QLNTw7H4WGlzImOUwZ3iUcjdD/yq8djkPV2eCDIJ3g9bv X-Received: by 2002:a50:ab1a:: with SMTP id s26mr18660949edc.182.1642374354583; Sun, 16 Jan 2022 15:05:54 -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 dd4si7027840ejc.991.2022.01.16.15.05.54; Sun, 16 Jan 2022 15:05:54 -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=@outlook.com header.s=selector1 header.b=DyCWZAwl; arc=fail (body hash mismatch); 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=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 353F968AF4C; Mon, 17 Jan 2022 01:05:10 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-HE1-obe.outbound.protection.outlook.com (mail-oln040092073103.outbound.protection.outlook.com [40.92.73.103]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 351E068AEE9 for ; Mon, 17 Jan 2022 01:05:07 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ZdJsZiyfS+wckEiL1nN4GroV81b2sEVneMLwe9krbv6lkBOiuvaywLEAbRIsnOMCZ+XoazBZIuwzZPhRXJpfTJaecbcX8MhUIe3eN0W0fwAelOpuAAlI3qAQb3tmj4jxUzX4VNYdjlrS9UEy+QX63MeR8bEu+hDASKTYVzADJwKKIniV4J94ExKrGdzb28y6dByUlV+REpDYqjHOkaPzuMQZ5GVcNg+NmgH8/FPGW41D+sDtpBquLReUmX6DuGtvli7X9V1TeIy0NWwo2GEjBPbMQWG3zgWK/dZ3VdqrURvaVYv4d9ehvejTLRW/yLcbXNYKmnhemLUJH7QiBJ/p1A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=rav/oCb/gezUpi0iOcwoVgsiihSSQWkk8XfthHEB0sw=; b=ls3UsxfLsys2sKjQvfM36mVF+0PURoFRZSJvlMXu0VS9724pHNhdxoTo453Klz725zn3t3bJAT4xINhqrQXDuy9EbvkuxvUwdR9/axZrWRePqxPTcx0z7U0ME4SUCLzeQmCcsoroRj1zUKgXpt2jow4GKp1Be7nRCsabSw6QP9KpGbzdktD6jtOHuZfHSo92b49XE1i8waHiZhO1X66hJqF7DjXDylomje9dCjS7wGUqmuZWtUfnsue6/jXkoskPUJtUove54u0zonaalGxfNIDVDGgvutVfvxJJ9b2O4IgB9zrB7ozWbtXPriAf2kA06MXZmbfMZafNrfDUMQVTVQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=rav/oCb/gezUpi0iOcwoVgsiihSSQWkk8XfthHEB0sw=; b=DyCWZAwlDCWRgWch649jLId81H/+H5SlpGdDcllO4hk0/cTvvEzXix8poSgQWC1rgTO+rOAaJ4cbPjMkKy9lAMhGXbfM6URSJoB96lWTi1/qZVvt4TtGZRihxxQXllnOkkWcjgNNPhFdR68yRFmNNJt1iSmfhrMzw8UZCKVHTMTh4QnTohGrKB+4rd2D+H1Ymn+rmHk2ry7aiQGfu5S0SHVSHuZxpFbyZ4Ty4UO5XC3IF8j9abowUtIbZiB75wlF4OfCmD9bkXUZvJASIOI6Q25gi9vh1VWa26i+phlQXls174N8eFdzJcDIlahKiRBnalNPS1UWCYzJWCtYDNPung== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AS8PR03MB7704.eurprd03.prod.outlook.com (2603:10a6:20b:403::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4888.10; Sun, 16 Jan 2022 23:05:02 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::19fc:be9f:2c9c:53f5]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::19fc:be9f:2c9c:53f5%9]) with mapi id 15.20.4888.013; Sun, 16 Jan 2022 23:05:02 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 Jan 2022 00:03:51 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [Y+WqiNwmOJ8SF7OhuDo5bfvTWZPODSfX] X-ClientProxiedBy: AM0PR10CA0070.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:15::23) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220116230405.194506-10-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2b891afb-ef6f-4368-8aa6-08d9d944a0ae X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiQ2WpFcKeHQajRkhOqduPnsyp+3q7lh4J0cWbl9Uu4Yra0gXjB7GiS6DJmuUfS2gPKCtSFeBZVj06ncXgVf7iTcDDS13T2nsHScSxs8sltlZkX0qQZY4RIyGAa8bqGln8cSEDnZ+Tgp9v2sxH8/n3y0lzXpXnESf+JCr8/9mCt+xX/HxvBULnIUOLU3lvV/2ZaRrbUEnSwTGBKU0/JmA4exNUWNbz56Z4Q8GZLmam3mc/Wrk69hiWcrQL9ASxsW2cv8sNBsgn7H/aQ0WjAIRRHuUOyG6QylBk1skf/m9UqQyjdtfeWs8IZ3Ubakc8xIKVyAF0P0eeUOWv09jR+uMXGWy5dVG9HrgaXbkviH9XOza34qiILrbuMpQfCaaersxRfhIlUmR0LX3g+M+QGDMhwjZ/fWOvBKJnd5ped9rNbjRe6f4zofFjCVTuHtv5cqSfvT1aGoy5+ElEUd+eIm2lyetk2Vd+Q2n/ek7cagVoj3CVBj6K+jMBkR72GcgcNwP4G1KnSnUWeD0NZtFm0bxqdjexYxVKAUooquMH4A8xnfpZ20gpX0tmUWrfJd2VHy/+H8POsRi7fX/bDoEicKRp/U5I3PP6oXcVy+gDFfY+RfRJV+rSdjKOFG/j1w1CYxPtIqO/NbZCeNg6n9YZ4levVMDW/XRgJbURbsFBRuzHbOGLdxxjnNXdA1oKgIHSNra55oNRmZQg+k5e9aL/FYaGtuFKObgpC4ZLdIyYPBe4cKBe+J7YgFdp6FR0lU1MmrP/k= X-MS-TrafficTypeDiagnostic: AS8PR03MB7704:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: dAXvRBqyK0UfTJKsht1IDo8S9fGN8Sr4m/rYyYTfgSYsInuGEwF3q4jGiS6ebKKTZGiGjjNA89rQmreqKEwCASb+f7XhG+LneBi22O38fQRlxI4KfgzVSiFeywC7EEfgY65jieVpGM0CIzNwnDikToR012nCoxbFzPM4upzMT44auxSjVmx5q9z+ZgPGH2a+HwdeOykjgGGCCY5vaFwhO/B9ED6zL1yr4ZKFMjR5HcTI1tt3miO7INpaNB4m1z74l2Dt4wI4CPCDB5iUwAOqkbc3A3OSG5oUo7dJfK2V6dFhi2D7afM5h/4wuhqmc/nyb2Nce6WU+6ucu9J0nEh+6FYhqp2lKjRkWPN2eIbIShJf8Bsoh/5NAkiuDitnoA8ZG678AQHA7ygrg/y228ckxVDWfaQklClr65cuh2YReURCk2bXArQIzSYQXCw4L9CwIe8jqVbArBm+flkaIjFJ1jeOTofSW57bmmfa+ZFHYszZCMjwYLw2QajbptYU5zhRFYuiMRFS+oAFmWiduh8HMly+kxod7ZPUyuUbhBq2hG2ANl9u7lF7bauPxMsVyvUNSpypU7be6L3jyQZzW25BMg== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: Gv/TLBm95q5V51SyKZxFoXs+k6lEZhFBKB6N1HSfmuXGPoqW1nIG/Y/EBAL/9iKFQUuH5FsnXNFrV0evMtBhuVfHBnzk+QfEBnh7uof3Bk+FP4xhSsD7EVauUba2Ab5RIe52EGd5paxZB0DW+NtKqD7AWoK58Z9OhbLJBkZmcrWVG6ifSLBaJsCT3bQ6GDj2pNrqWtgIHAxAtjBu9+rGW4ODZM5/0ZqzwwnqZYKTyIT8Dk9k2L6NT2MOh/LmJFqZl7QKOVUc/XcroYguhyIP7H3AmeTyOjW8+hQL/u+7BmqiZ37Hy+TcZp7HvVgLhLmT3lS1PWML6mvrdkCHM790q3cwltOSFk46uNOnVzcxxMAaDx85vy7Poz1B6voci1Rg+mcJUWyphQQcKxWM4fnaZ49xN8rjItJp3LEJJrz/OXBEgAqEFFbxRzbs0TTJpFYcoYNFT3wup6BpKQ4ltuwB5Q69K37Ca9KDe9FJB66M+SD8y3qHhQ+KWBy5jEsixCTx9stbKudzi6RaExXtlfzakcUkP0fYRyT2V5S89/ErItc4uPGGugwUzzQmcQKAkTVJYA+nqK70PFlSMlOtsIHdv/rC/qlEmCnNrdNyrDhmQAHn67XVJgFuR+TMo0un7Xi+WeHFcG/Tbr1uIIJgFgBFjETwnHqg/vl8/qGgApJDpPlM8oW30IwsNsuyqucCxTNWX143HbkT+0ZCncsMhLWK60TzOItLoL3+ExhJpiGIyg7SIRPACokk7AEeOZBBnz4nLLDHjl3ClTzFGoEx9IC1wpYpP+ynYrLBlU/du3hkzI7iCyhllRsPmojvSeKdvoFAL247Ow+ucoiIED8WH6+yCpXfhu8qNhdqPktLWnKzROCYEetr2+DGER0tsQvUY1U1oEUhLevgN/4eSvGCP11VngSiIMD1EBOfOnYHv31h5XN9RMgCqEXUJSwQuth5tsSC1cidPA1J9fv6lQi77t4Tqg== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2b891afb-ef6f-4368-8aa6-08d9d944a0ae X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Jan 2022 23:05:02.8307 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS8PR03MB7704 Subject: [FFmpeg-devel] [PATCH 11/25] avformat/matroskaenc: Allow to use custom reformatting functions 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 0zy1TuwSF52h Matroska uses variable-length elements and in order not to waste bytes on length fields, the length of the data to write needs to be known before writing the length field. Annex B H.264/5 and WavPack need to be reformatted to know this length and this currently involves writing the data into temporary buffers; AV1 sometimes suffers from this as well. This commit aims to solve this by adding a callback that is called twice per packet: Once to get the size and once to actually write the data. In case of WavPack and AV1 (where parsing is cheap due to length fields) both calls will just parse the data with only the second function writing anything. For H.264/5, the position of the NALUs will need to be stored to be written lateron. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index fb790ebe8b..5b5e921eee 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -158,6 +158,8 @@ typedef struct mkv_cues { int num_entries; } mkv_cues; +struct MatroskaMuxContext; + typedef struct mkv_track { int write_dts; int has_cue; @@ -171,6 +173,13 @@ typedef struct mkv_track { int64_t duration_offset; int64_t codecpriv_offset; int64_t ts_offset; + /* This callback will be called twice: First with a NULL AVIOContext + * to return the size of the (Simple)Block's data via size + * and a second time with the AVIOContext set when the data + * shall be written. + * The callback shall not return an error on the second call. */ + int (*reformat)(struct MatroskaMuxContext *, AVIOContext *, + const AVPacket *, int *size); } mkv_track; typedef struct MatroskaMuxContext { @@ -2433,6 +2442,8 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, #endif if (par->codec_id == AV_CODEC_ID_AV1) { err = ff_av1_filter_obus_buf(pkt->data, &data, &size, &offset); + } else if (track->reformat) { + err = track->reformat(mkv, NULL, pkt, &size); } else data = pkt->data; @@ -2483,9 +2494,13 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, put_ebml_num(pb, track_number, track->track_num_size); avio_wb16(pb, ts - mkv->cluster_pts); avio_w8(pb, (blockid == MATROSKA_ID_SIMPLEBLOCK && keyframe) ? (1 << 7) : 0); + if (track->reformat) { + track->reformat(mkv, pb, pkt, NULL); + } else { avio_write(pb, data + offset, size); if (data != pkt->data) av_free(data); + } if (blockid == MATROSKA_ID_BLOCK && !keyframe) put_ebml_sint(pb, MATROSKA_ID_BLOCKREFERENCE, track->last_timestamp - ts);