From patchwork Thu Apr 15 04:39:42 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 26923 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id E8D7544894C for ; Thu, 15 Apr 2021 07:40:10 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B395168834B; Thu, 15 Apr 2021 07:40:10 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f41.google.com (mail-qv1-f41.google.com [209.85.219.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7AC7B68834B for ; Thu, 15 Apr 2021 07:40:03 +0300 (EEST) Received: by mail-qv1-f41.google.com with SMTP id gv2so1797881qvb.8 for ; Wed, 14 Apr 2021 21:40:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=+61enWyTaOV93e7pD/v6jBv+PYP4FqBDmZD6lhAfg3U=; b=cfvCa+wUgemnkmIDwTm2trn8RVHesl3x9QpgN5Ngn0ETDfjjkhrHOzDxqisMUhrNPt AsA5NZc084K57g2AO57f1neLdsIWbmrw4LEIbp0D1sTrS9D1r0nwGNzRGrtROJUj9HH0 uC90jJ6wMyt0df2/geXr//huw8yAaJ/pujU49vw2ZNMoKhZSbMToYhtkcpDQzGxIREoa 7OYxsapAQEI1MXQ/uDj8AnjosrlWJ9RpHdIKjOHB45ccrUuPgjj805yjfb88fgIXSJd+ 168scpY83gO7owZ1DohE/GMgydzJbFS3M1fjnm14pFNVf53EcP5OjTNYkDKuEX6YwXS9 2T2A== 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:mime-version :content-transfer-encoding; bh=+61enWyTaOV93e7pD/v6jBv+PYP4FqBDmZD6lhAfg3U=; b=S34CEBidTxrFd992XhEz23VonuojHcxEV5iplASXxLBcyJACr1paRpUJTXe95ha8P+ zzPyfutvsxZBvLjb8fA4TmlPIDNJfc2iBGSxddI0AzJrEuXddDADTtndWUpYHlMnqXLT 4tCSCxYUhFkgPw2ia9+Zmn3n8oBjhcju3aCJaRYdeyHekUP937X9Mpeow6dd/MGze57N +Fp23Q0jMadDerqJD4NcgU6Bhe00s1M/6pRNtxFRq3Tl/9z2eH9rDKAnzaJ2s7jpbrMn x9l6G1U5s4AEPWgeccYoTsJ7aKxNG5MkTdqfdKVtJ9dt4yG1K4wQtdyegAMh5GALTW9W +c5g== X-Gm-Message-State: AOAM531DnCPWNesXoQarVkrXfh94g5GphlL1i7L0RRTPM5wEYFmkg7TR NkodTZqyIHCSG8Aqj68Hhb8rPj0b20s= X-Google-Smtp-Source: ABdhPJy471skNviOgrE1tvoDMBRafk416oONtOiycuo9ASDUedrVxV6riq6GtvIv4R5sDor95Anjsw== X-Received: by 2002:a0c:fa8e:: with SMTP id o14mr1606679qvn.45.1618461601474; Wed, 14 Apr 2021 21:40:01 -0700 (PDT) Received: from localhost.localdomain ([191.84.237.33]) by smtp.gmail.com with ESMTPSA id c23sm995303qtm.46.2021.04.14.21.40.00 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 14 Apr 2021 21:40:01 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 15 Apr 2021 01:39:42 -0300 Message-Id: <20210415043942.5053-1-jamrial@gmail.com> X-Mailer: git-send-email 2.31.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avformat/movenc: fix writing dOps atoms X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Don't blindly copy all bytes in extradata past ChannelMappingFamily. Instead check if ChannelMappingFamily is not 0 and then only write the correct amount of bytes from ChannelMappingTable, as defined in the spec[1]. Should fix ticket #9190. [1] https://opus-codec.org/docs/opus_in_isobmff.html#4.3.2 Signed-off-by: James Almer --- Compared to "avformat/mpegts: set correct extradata size for Opus streams", which only ensured the mpets demuxer would output something the mov muxer would not mishandle, this is a proper fix for the ticket, making the muxer spec compliant. libavformat/movenc.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 0b620a802d..8e6ed817d8 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -797,6 +797,7 @@ static int mov_write_dfla_tag(AVIOContext *pb, MOVTrack *track) static int mov_write_dops_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *track) { int64_t pos = avio_tell(pb); + int channels, channel_map; avio_wb32(pb, 0); ffio_wfourcc(pb, "dOps"); avio_w8(pb, 0); /* Version */ @@ -807,12 +808,22 @@ static int mov_write_dops_tag(AVFormatContext *s, AVIOContext *pb, MOVTrack *tra /* extradata contains an Ogg OpusHead, other than byte-ordering and OpusHead's preceeding magic/version, OpusSpecificBox is currently identical. */ - avio_w8(pb, AV_RB8(track->par->extradata + 9)); /* OuputChannelCount */ + channels = AV_RB8(track->par->extradata + 9); + channel_map = AV_RB8(track->par->extradata + 18); + + avio_w8(pb, channels); /* OuputChannelCount */ avio_wb16(pb, AV_RL16(track->par->extradata + 10)); /* PreSkip */ avio_wb32(pb, AV_RL32(track->par->extradata + 12)); /* InputSampleRate */ avio_wb16(pb, AV_RL16(track->par->extradata + 16)); /* OutputGain */ + avio_w8(pb, channel_map); /* ChannelMappingFamily */ /* Write the rest of the header out without byte-swapping. */ - avio_write(pb, track->par->extradata + 18, track->par->extradata_size - 18); + if (channel_map) { + if (track->par->extradata_size < 21 + channels) { + av_log(s, AV_LOG_ERROR, "invalid extradata size\n"); + return AVERROR_INVALIDDATA; + } + avio_write(pb, track->par->extradata + 19, 2 + channels); /* ChannelMappingTable */ + } return update_size(pb, pos); }