From patchwork Tue Jun 21 02:34:14 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 36359 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:1a22:b0:84:42e0:ad30 with SMTP id cj34csp1977182pzb; Mon, 20 Jun 2022 19:34:40 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vHX2VLHVajCsntNng6qUCRWKtCfgU64Vjq1u5J3HwA0rmTPgGjHYnSFY7052H/dK3T74WH X-Received: by 2002:a17:906:58cb:b0:70a:751c:91fc with SMTP id e11-20020a17090658cb00b0070a751c91fcmr23260551ejs.258.1655778879629; Mon, 20 Jun 2022 19:34:39 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id m4-20020a056402050400b004358320ac70si3944870edv.419.2022.06.20.19.34.39; Mon, 20 Jun 2022 19:34:39 -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=@outlook.com header.s=selector1 header.b=UTCr7Usr; 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 B7B8F68B646; Tue, 21 Jun 2022 05:34:36 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05olkn2015.outbound.protection.outlook.com [40.92.89.15]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 18D8C68B476 for ; Tue, 21 Jun 2022 05:34:30 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=A2YJYHcqGMDkZEqYAnbZQJcGjZFW7tn6b2AmlMEyBSaRtZLKEMu5Or9UqzkvByoJiGTz5TaJ0UbA/W9zyWL8tWW5T9yfQL9D9rx6NRcDJMyLDxSd3F7KRQqkrkUr2EmcRFD18mbo6ZkoEda/PqLVsM7VO6QFb029KxDKm65bBBTkce/CJ9PzfF+56n0/Y5lHB3S8emEXe2GgR3UB21YqW8dHqcCAkMFDdqoV2aPSX9q57M16gRDh2jxCA43g4laRBFIKij59F/83jx+HA9t/blpYqqo2MJZgDIzAd2LTMPQCdFjHHJ9i/uZd60mubXsBXn0Npch8zx6rHHx3IZe6eQ== 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=HtRfuaWFNfZRjpWhLa1DWsg1Houw6UOKtaqWNfYvpxI=; b=Oeq6msjlWgBkPzNZVe0f9oAUt4vMB1il7Ty70hDLE204jPnrPpI4R24I/gZwWSI5CWCQhFw9iJrcGRfkKv48a1QEiuIzs7IL54lENnYpJ6qT6htzeaeGf9pttqVaZf+HCj2OquIpbDJdxcNNer1ZuEGQFRiOmXHXABDbrw4O90yIqYj2yloG2hEAuttlrtjSUOrGuxsAXl3iA+CNctqqzrA/ZIKWjSbg9kS+pcIYD6iCOdrMX7KpkWR1+8v5IBlpZmufteN1AFRjZJ9Nf4lf15UHea0xPKUOenb47sU68Tq60l3KyAZXRgMDvm8DPVp75FhZfO0sDhFWt7k5vHVKRA== 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=HtRfuaWFNfZRjpWhLa1DWsg1Houw6UOKtaqWNfYvpxI=; b=UTCr7UsrAxuhFt2J7okxxRTeAnYo2cCafcjK5cWj9o0Q2ZqmflAZX+ypI1KwF7LNtp7f5wFWu8i2jPMXGRyNg+Mo9/sUtxyAGqeAvFj3ABWEJt69Jx87b6N3DXS1XUBYhqcIkSviog+O/WWsAWexEOOJf0lxu8u4BvLQW5cafmMb7Pdrb13oSy58U1t6Kcs4MPV7SQgdvRBbRe1iizzBNcE0xwDogPcE7EstGS5RxaDVP2z9HppRWAp0DKa8C4QQKhTfJ7P5dGZDtgC6TVdm2j58vDKf/2l87ivLkqssSvO7bwGrf8FLYxujfYaV6UGabE1L97dJTbbirpN3E41A/Q== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by PAXPR01MB9074.eurprd01.prod.exchangelabs.com (2603:10a6:102:2b4::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5353.18; Tue, 21 Jun 2022 02:34:27 +0000 Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::60b9:9f29:40cc:f01c]) by DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::60b9:9f29:40cc:f01c%10]) with mapi id 15.20.5353.022; Tue, 21 Jun 2022 02:34:27 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Tue, 21 Jun 2022 04:34:14 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [iK+KBDaxY5k5q6JFbbrJRXBzqSkj15yh] X-ClientProxiedBy: ZR0P278CA0187.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:44::9) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: <20220621023418.3322554-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: ab58a39b-4792-4c75-2c72-08da532e8fb0 X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiStnrXejT7dVEa0U1z4ilPml6toqxg0j92c53f35ii3N0eu24VWYFUdJoT/35GTFt4OgRM1qKDj9OEwn6XOu0edo/IdfNsOKg7U5poaXOt0aPfDCL+XiBGLl9S0yKNsytV3qxMykBlJy0JyZgXutBgKtv32H+XVgj5X2/5qNaMQ46ga6vm55wdVw88FyIf+i60D7oajyYGfejm+lBw+UB2pEiPgnonGsRsdHsghLjbbk/EeApDlwsGEG31OTWPHcv+ofje/We3nR61GZpnnvE+H20q+KnYif30Y8gWaOSxIsDRvQSCitQ/52qM3uPLuU8J8azX1fwmIxxvyPDNwevMgAoyhv1WKyUMNf3GpF7oO+HS9em9Y8uybfCQVYaCblx3B+jD4Q2EsJuwNpoQ+xZ2nABNQJWHi+itU+HZyX/Qheo9Htwf9B/BAsDOOLASXurkY6qoo1RdEKAKswZshh0Z0hTA5Q6XHamCbfRBi6DpHwFMkHn8RxNffGiYVHKJocyiP7qlxQ8wfCWqXMr2ZXAXPM1NOXFUXKtFfW+yme/GRXt7rskqWPb2MG9Cc7ubZHlifavfTS07NPTNkiYs8VIxauPfDl38LUcOxnlWotuuFgsiTq5Z4NaVtHDlNZ1FnELNvAuaST4bCH51hZgZYQ5M52sb8/aBnVSfKQiBl96rK/MuZJN1+8ZeeG1aQvoesiFyRYMPHn7CJIKI+i1x/+Rkx1fp/28QJaHx+0n5XOUNOs5QDNmoJvMOghEh5xeoF4i4= X-MS-TrafficTypeDiagnostic: PAXPR01MB9074:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ZfUc0iRgqCtuTQ3vKqHiaU88jjEwJ+qngFJInm7d4Gol6cCzTtLqDt/UapGJ3AaTgb9F+kL0Ky0KedBgVeY0Sdh18HoWIEIKoKNI74sZtzj4JbdKBmVtc4mbcdfEf32qAYIdOXm4fj8RUH+5hgw4H29a2S5tK72r0zoli0VSXK7pzpn3ZJM4cT5u6dP52enb+UkAvGleDwlIzCe1FK1bKzg7bZqaKw+b84w0XTmNdGzdBsxxH69CRrHBQAlo1he9TjHj2BA7ClT0Dv9i9W+gwnVKuuG8QQEVfR+kBO9WCnj08HSfK4s5cytGKnGTQ+qrCOJGJYZoCi9Su0y/6Q8SxVI9Ysx1FjbkKekXVEAnPlcl8PY/zAVyWJ/ebz2XG80ewKVWU5JFLB1lrUGInooFpBD60eafEO9V1Wh+dzj2A7iOQ8hTPYznIbxjXiKk9Uc9oEsiiJyG2yWohp0GYYsfnGFpcWRYU5NYST3YAn6D2e37Ea1y11vXVeLGiVYlhejlL1kXNpaOK9ZXWjLC/DamrXQPfFuxUUvgmmxkYS6T1mTiPCLphPqe+w0TK+0o+MiI8bpIwLNVKP6RO+ftRquFjQ== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: 3vWT/SNZTYIyJ5fNuPky2tlTm3WWPFJN3Fs3OiLPBORkVytmfDaXn6A6Q48tXvrVG+bcDknLAqXSySHQn6KAzb+FJYgGdPNy+LzmhDF2Vd1wdROiAa82XpqqZxMJ43/pWMkfSoRDHZFWroLhw/dZxazYTapuY79n+CTPfSy222OMfdW3+8CGJAV9gcTS9czRugQtjTT9dlrQaefq095T5FM0PvnY6XPvASXQbfE/rfcqyhGWDLeJvWHw4wXQVxj7E5U8+uThdWvnHsO4PA0cE4oEuwOvSj3thu3ABKCroqXS1RWa48s4IBkTKfOvU8dWgN/RzmI/etOsh+r6rIUrVEZijks+ULkz1+ODNpyd1ENl1VWt09nTuHJllZ5nBBA/xF/qPZ0MXPBiI5Wo3F7O5LpfMO3KV8yb3lMyQFizMo+/q5IGq8eUJ7aPeb7qbXr9PBWt8bM2doVQjfD1zoUmJXt53novvhnE8UO6dcVD+k+zIDVABt6puB/KT+8urXQ9RAsGbG3ww14ngollSPgteUoclVTMQkVxsQG6IPcrw12FhgNHcIPO4YYcKxa4RaNuqdIgT7POOoSkMJWq9Pz7HhwRA98aeDXJT4UwOR1jT0rYk9vvHdCF3wu0Sn9zDXgIrvR2ky3xNJICuK9+jGm9zJ7GcvUWuVQJ/pcJTieZEQ3ovd0bnE+zwYgf7SABTGp61yrRdu1pPcQpePL1uO4QMSDz17EpEcbv64E5+y4drYyBYglwEs1bYxLP87d7hWEghk6omqKfHFGbQldQFp4DUHis+xUiq+o8jaDf6DNPrXSBwl93uBKB6Q8x7+HWzX0d+4/ccnAVh76titO82I80jdf9FFnNdyq4Sh1rP3oMtUHoZNFalru+oDZe0LzrFI2t5y/aMrYJMOTzYC7Kdw78GwaMTE3nWixxSTtwv1WNfF3/eP66zDgjAnM23EuNZu2olH9UqB+ozqcpz40H5ChwXXEhRsa0nxZ5VQ6u/Qo56IFNXa010UZ1iBe388kGwlIRErldWjYkZzLm5ZgfV81vQbDhkeKoh73oOqay1Df6rQwOej9Rp6wb7zNZ9OMrz6H61F6SSyB50L3cGQpGqW+esf3HiyGK8HMJ68CcVTdX+SuBTI21R3ksCNGfuYv2Djk4MhFDBnMm5fe0k9ubj3MuW/tPHmalIOkajv9lEBKfRFRVMgxoSnSMdRuAgVRIclI1VuA//u4ku8uIR3lT4LsPDVxnM3HwA6AGVF07PSEucH9awf38xHusCKqdxvSJYJS68gPP7hCMLIfxizjzQnwMGFNgvSKPeTLZmVMUZByZkCdciJEO0jR7uY1s14K674xwNl/KDe4Vjr0Yb6gvHdIubx9A+i2jrWKtJCdSrzLJ3K8D6wuUrgsexHpUG2tZj6U4vXKCyTDc6P2TcA2g/C/C1lkceF/ifjSPJdXyMY9h7OkQd47P0uV4zzgLKtESZRTmbEmYJ2Vax5lSj5GrQBBDMg== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: ab58a39b-4792-4c75-2c72-08da532e8fb0 X-MS-Exchange-CrossTenant-AuthSource: DB6PR0101MB2214.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 21 Jun 2022 02:34:27.3759 (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: PAXPR01MB9074 Subject: [FFmpeg-devel] [PATCH 2/6] avformat/matroskaenc: Avoid swapping codecpar->extradata temporarily 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: +Bwi3CUEVwLo Instead pass extradata and extradata_size explicitly. (It is not perfect, as ff_put_(wav|bmp)_header() still uses the extradata embedded in codecpar, but this is not an issue as long as their CodecPrivate isn't updated.) Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 82 ++++++++++++++++++++++----------------- 1 file changed, 47 insertions(+), 35 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index b4756832eb..93d10332a4 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -990,7 +990,8 @@ static int mkv_assemble_cues(AVStream **streams, AVIOContext *dyn_cp, } static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb, - const AVCodecParameters *par) + const AVCodecParameters *par, + const uint8_t *extradata, int extradata_size) { const uint8_t *header_start[3]; int header_len[3]; @@ -1002,7 +1003,7 @@ static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb, else first_header_size = 42; - err = avpriv_split_xiph_headers(par->extradata, par->extradata_size, + err = avpriv_split_xiph_headers(extradata, extradata_size, first_header_size, header_start, header_len); if (err < 0) { av_log(s, AV_LOG_ERROR, "Extradata corrupt.\n"); @@ -1020,22 +1021,23 @@ static int put_xiph_codecpriv(AVFormatContext *s, AVIOContext *pb, } #if CONFIG_MATROSKA_MUXER -static int put_wv_codecpriv(AVIOContext *pb, const AVCodecParameters *par) +static int put_wv_codecpriv(AVIOContext *pb, const uint8_t *extradata, int extradata_size) { - if (par->extradata && par->extradata_size == 2) - avio_write(pb, par->extradata, 2); + if (extradata && extradata_size == 2) + avio_write(pb, extradata, 2); else avio_wl16(pb, 0x410); // fallback to the most recent version return 0; } static int put_flac_codecpriv(AVFormatContext *s, AVIOContext *pb, - const AVCodecParameters *par) + const AVCodecParameters *par, + const uint8_t *extradata, int extradata_size) { int write_comment = (par->ch_layout.order == AV_CHANNEL_ORDER_NATIVE && !(par->ch_layout.u.mask & ~0x3ffffULL) && !ff_flac_is_native_layout(par->ch_layout.u.mask)); - int ret = ff_flac_write_header(pb, par->extradata, par->extradata_size, + int ret = ff_flac_write_header(pb, extradata, extradata_size, !write_comment); if (ret < 0) @@ -1101,43 +1103,45 @@ static int get_aac_sample_rates(AVFormatContext *s, MatroskaMuxContext *mkv, static int mkv_assemble_native_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp, const AVCodecParameters *par, + const uint8_t *extradata, + int extradata_size, unsigned *size_to_reserve) { switch (par->codec_id) { case AV_CODEC_ID_VORBIS: case AV_CODEC_ID_THEORA: - return put_xiph_codecpriv(s, dyn_cp, par); + return put_xiph_codecpriv(s, dyn_cp, par, extradata, extradata_size); case AV_CODEC_ID_AV1: - if (par->extradata_size) - return ff_isom_write_av1c(dyn_cp, par->extradata, - par->extradata_size, 1); + if (extradata_size) + return ff_isom_write_av1c(dyn_cp, extradata, + extradata_size, 1); else *size_to_reserve = 4 + 3; break; #if CONFIG_MATROSKA_MUXER case AV_CODEC_ID_FLAC: - return put_flac_codecpriv(s, dyn_cp, par); + return put_flac_codecpriv(s, dyn_cp, par, extradata, extradata_size); case AV_CODEC_ID_WAVPACK: - return put_wv_codecpriv(dyn_cp, par); + return put_wv_codecpriv(dyn_cp, extradata, extradata_size); case AV_CODEC_ID_H264: - return ff_isom_write_avcc(dyn_cp, par->extradata, - par->extradata_size); + return ff_isom_write_avcc(dyn_cp, extradata, + extradata_size); case AV_CODEC_ID_HEVC: - return ff_isom_write_hvcc(dyn_cp, par->extradata, - par->extradata_size, 0); + return ff_isom_write_hvcc(dyn_cp, extradata, + extradata_size, 0); case AV_CODEC_ID_ALAC: - if (par->extradata_size < 36) { + if (extradata_size < 36) { av_log(s, AV_LOG_ERROR, "Invalid extradata found, ALAC expects a 36-byte " "QuickTime atom."); return AVERROR_INVALIDDATA; } else - avio_write(dyn_cp, par->extradata + 12, - par->extradata_size - 12); + avio_write(dyn_cp, extradata + 12, + extradata_size - 12); break; case AV_CODEC_ID_AAC: - if (par->extradata_size) - avio_write(dyn_cp, par->extradata, par->extradata_size); + if (extradata_size) + avio_write(dyn_cp, extradata, extradata_size); else *size_to_reserve = 4 + MAX_PCE_SIZE + 2; break; @@ -1146,8 +1150,8 @@ static int mkv_assemble_native_codecprivate(AVFormatContext *s, AVIOContext *dyn if (CONFIG_MATROSKA_MUXER && par->codec_id == AV_CODEC_ID_PRORES && ff_codec_get_id(ff_codec_movvideo_tags, par->codec_tag) == AV_CODEC_ID_PRORES) { avio_wl32(dyn_cp, par->codec_tag); - } else if (par->extradata_size && par->codec_id != AV_CODEC_ID_TTA) - avio_write(dyn_cp, par->extradata, par->extradata_size); + } else if (extradata_size && par->codec_id != AV_CODEC_ID_TTA) + avio_write(dyn_cp, extradata, extradata_size); } return 0; @@ -1155,6 +1159,7 @@ static int mkv_assemble_native_codecprivate(AVFormatContext *s, AVIOContext *dyn static int mkv_assemble_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp, AVCodecParameters *par, + const uint8_t *extradata, int extradata_size, int native_id, int qt_id, uint8_t **codecpriv, int *codecpriv_size, unsigned *size_to_reserve) @@ -1165,7 +1170,9 @@ static int mkv_assemble_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp, *size_to_reserve = 0; if (native_id) { - ret = mkv_assemble_native_codecprivate(s, dyn_cp, par, size_to_reserve); + ret = mkv_assemble_native_codecprivate(s, dyn_cp, par, + extradata, extradata_size, + size_to_reserve); if (ret < 0) return ret; #if CONFIG_MATROSKA_MUXER @@ -1175,13 +1182,13 @@ static int mkv_assemble_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp, par->codec_tag = ff_codec_get_tag(ff_codec_movvideo_tags, par->codec_id); if ( ff_codec_get_id(ff_codec_movvideo_tags, par->codec_tag) == par->codec_id - && (!par->extradata_size || ff_codec_get_id(ff_codec_movvideo_tags, AV_RL32(par->extradata + 4)) != par->codec_id) + && (!extradata_size || ff_codec_get_id(ff_codec_movvideo_tags, AV_RL32(extradata + 4)) != par->codec_id) ) { - avio_wb32(dyn_cp, 0x5a + par->extradata_size); + avio_wb32(dyn_cp, 0x5a + extradata_size); avio_wl32(dyn_cp, par->codec_tag); ffio_fill(dyn_cp, 0, 0x5a - 8); } - avio_write(dyn_cp, par->extradata, par->extradata_size); + avio_write(dyn_cp, extradata, extradata_size); } else { if (!ff_codec_get_tag(ff_codec_bmp_tags, par->codec_id)) av_log(s, AV_LOG_WARNING, "codec %s is not supported by this format\n", @@ -1196,6 +1203,8 @@ static int mkv_assemble_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp, return AVERROR(EINVAL); } + /* If vfw extradata updates are supported, this will have + * to be updated to pass extradata(_size) explicitly. */ ff_put_bmp_header(dyn_cp, par, 0, 0, mkv->flipped_raw_rgb); } } else if (par->codec_type == AVMEDIA_TYPE_AUDIO) { @@ -1209,6 +1218,7 @@ static int mkv_assemble_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp, if (!par->codec_tag) par->codec_tag = tag; + /* Same comment as for ff_put_bmp_header applies here. */ ff_put_wav_header(s, dyn_cp, par, FF_PUT_WAV_HEADER_FORCE_WAVEFORMATEX); #endif } @@ -1221,6 +1231,7 @@ static int mkv_assemble_codecprivate(AVFormatContext *s, AVIOContext *dyn_cp, static int mkv_write_codecprivate(AVFormatContext *s, MatroskaMuxContext *mkv, AVCodecParameters *par, + const uint8_t *extradata, int extradata_size, int native_id, int qt_id, AVIOContext *pb) { AVIOContext *const dyn_bc = mkv->tmp_bc; @@ -1228,7 +1239,8 @@ static int mkv_write_codecprivate(AVFormatContext *s, MatroskaMuxContext *mkv, unsigned size_to_reserve; int ret, codecpriv_size; - ret = mkv_assemble_codecprivate(s, dyn_bc, par, native_id, qt_id, + ret = mkv_assemble_codecprivate(s, dyn_bc, par, extradata, extradata_size, + native_id, qt_id, &codecpriv, &codecpriv_size, &size_to_reserve); if (ret < 0) goto end; @@ -1851,7 +1863,8 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, if (!IS_WEBM(mkv) || par->codec_id != AV_CODEC_ID_WEBVTT) { track->codecpriv_offset = avio_tell(pb); - ret = mkv_write_codecprivate(s, mkv, par, native_id, qt_id, pb); + ret = mkv_write_codecprivate(s, mkv, par, par->extradata, par->extradata_size, + native_id, qt_id, pb); if (ret < 0) return ret; } @@ -2644,7 +2657,8 @@ static int mkv_check_new_extra_data(AVFormatContext *s, const AVPacket *pkt) return ret; memcpy(par->extradata, side_data, side_data_size); avio_seek(mkv->track.bc, track->codecpriv_offset, SEEK_SET); - mkv_write_codecprivate(s, mkv, par, 1, 0, mkv->track.bc); + mkv_write_codecprivate(s, mkv, par, side_data, side_data_size, + 1, 0, mkv->track.bc); filler = MAX_PCE_SIZE + 2 + 4 - (avio_tell(mkv->track.bc) - track->codecpriv_offset); if (filler) put_ebml_void(mkv->track.bc, filler); @@ -2659,16 +2673,14 @@ static int mkv_check_new_extra_data(AVFormatContext *s, const AVPacket *pkt) break; case AV_CODEC_ID_FLAC: if (side_data_size && mkv->track.bc) { - uint8_t *old_extradata = par->extradata; if (side_data_size != par->extradata_size) { av_log(s, AV_LOG_ERROR, "Invalid FLAC STREAMINFO metadata for output stream %d\n", pkt->stream_index); return AVERROR(EINVAL); } - par->extradata = side_data; avio_seek(mkv->track.bc, track->codecpriv_offset, SEEK_SET); - mkv_write_codecprivate(s, mkv, par, 1, 0, mkv->track.bc); - par->extradata = old_extradata; + mkv_write_codecprivate(s, mkv, par, side_data, side_data_size, + 1, 0, mkv->track.bc); } break; #endif