From patchwork Thu Mar 26 04:05:37 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18406 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 1D5F1448F3B for ; Thu, 26 Mar 2020 06:05:56 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E56B468AE86; Thu, 26 Mar 2020 06:05:55 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id EC04368AE86 for ; Thu, 26 Mar 2020 06:05:48 +0200 (EET) Received: by mail-wr1-f68.google.com with SMTP id 65so6148490wrl.1 for ; Wed, 25 Mar 2020 21:05:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=KL8mgrH7HgJGVHxtK6qN2QIsjwCbmKKKZm+DrBh2smE=; b=Fqdy83OrB/aUJSXFqAN4BypoWOpNll2dt2V1QxxWGOJhmmkobuOdPa3WIFmCceSPHr vyz5GL3bb04O7zMj1hduWWtx+FeoN791KQSlCPNY5GvnqEr9ShsjJxD4UVx9SAdOYOEK CWuhgrMwj9+uxczjoR3tAuWSbBIIp57dC2sTbwTb6FLlCLsvWatoLD/WQTtEUKw+SNza hz6ROI5HDq/XHScyvImEX8+didhYSeiMbOsCUFj9ub+FSC6J9B9e3Q8imkAovQkdDywa w8KUogM2R0Rw5wdo09VjA2zwvClruIxM5CIem0qK/9VNuXfi1l6QPhTFXUf2fzpf2K3l gZTg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=KL8mgrH7HgJGVHxtK6qN2QIsjwCbmKKKZm+DrBh2smE=; b=GWZQ4Ytgl619geNyItTuyQGOJJwZ0BW3PaXB8tw+ZN/a5i9yw/o9FHFy96DGLLJlym Dz1oKz6Kg5/Dw6CvqhROvdCw5rvYSyKnLMXM5V0qZ9y6NpV0h41NE9t2kS7QD/7UAEQb hUatwikavmpWfC4V2xxzXKhmnFY6rvvAbetZUpsgZG6atSuWUPHc38XZrGlxTZI1WCYD ZEzezNbfY0iW6oRB8PCFRjNB78E1BTMViw00axAQpyQrt3dfkWGtvTPICyQG8bfTZMbA 7HS1Slb9mHHDBg0UaFheSuiFuHvYKwXz370S2f2I6iQ7xkNtLtkNdELNguUEHDQvZR47 Z3dw== X-Gm-Message-State: ANhLgQ3bDdUez7pv/0AG9gq5jwX904QLhYwpgMI47yj7z4xUzz2Vjnps 5R2GR4QFQS00ePohGG1x095QH1y7 X-Google-Smtp-Source: ADFU+vvQhm7mVZjW+Ms+LH6S4l3UyMQY1pMjgkmHNvYYdlpAechP3vvpeE6un4i3fIrASZG3kUUK1w== X-Received: by 2002:a05:6000:11c2:: with SMTP id i2mr7388056wrx.210.1585195548051; Wed, 25 Mar 2020 21:05:48 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id u13sm1620547wru.88.2020.03.25.21.05.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Mar 2020 21:05:47 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Thu, 26 Mar 2020 05:05:37 +0100 Message-Id: <20200326040539.24719-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/3] avformat/matroskadec: Add a workaround for missing WavPack extradata 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" mkvmerge versions 6.2 to 40.0 had a bug that made it not propagate the WavPack extradata (containing the WavPack version) during remuxing from a Matroska file; currently our demuxer would treat every WavPack block encountered as invalid data (unless the WavPack stream is to be discarded (i.e. the streams discard is >= AVDISCARD_ALL)) and try to resync to the next level 1 element. Luckily, the WavPack version is currently not really important; so we fix this problem by assuming a version. David Bryant, the creator of WavPack, recommended using version 0x410 (the most recent version) for this. And this is what this commit does. A FATE-test for this has been added. Signed-off-by: Andreas Rheinhardt --- James has already uploaded the sample. Thanks for this. libavformat/matroskadec.c | 11 ++++++++++- tests/fate/matroska.mak | 5 +++++ tests/ref/fate/matroska-wavpack-missing-codecprivate | 9 +++++++++ 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 tests/ref/fate/matroska-wavpack-missing-codecprivate diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 4d7fdab99f..5b55606b98 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -2613,6 +2613,14 @@ static int matroska_parse_tracks(AVFormatContext *s) ret = matroska_parse_flac(s, track, &extradata_offset); if (ret < 0) return ret; + } else if (codec_id == AV_CODEC_ID_WAVPACK && track->codec_priv.size < 2) { + av_log(matroska->ctx, AV_LOG_INFO, "Assuming WavPack version 4.10 " + "in absence of valid CodecPrivate.\n"); + extradata_size = 2; + extradata = av_mallocz(2 + AV_INPUT_BUFFER_PADDING_SIZE); + if (!extradata) + return AVERROR(ENOMEM); + AV_WL16(extradata, 0x410); } else if (codec_id == AV_CODEC_ID_PRORES && track->codec_priv.size == 4) { fourcc = AV_RL32(track->codec_priv.data); } else if (codec_id == AV_CODEC_ID_VP9 && track->codec_priv.size) { @@ -3165,9 +3173,10 @@ static int matroska_parse_wavpack(MatroskaTrack *track, uint8_t *src, uint16_t ver; int ret, offset = 0; - if (srclen < 12 || track->stream->codecpar->extradata_size < 2) + if (srclen < 12) return AVERROR_INVALIDDATA; + av_assert1(track->stream->codecpar->extradata_size >= 2); ver = AV_RL16(track->stream->codecpar->extradata); samples = AV_RL32(src); diff --git a/tests/fate/matroska.mak b/tests/fate/matroska.mak index b9ed7322fd..93b5bff89a 100644 --- a/tests/fate/matroska.mak +++ b/tests/fate/matroska.mak @@ -17,6 +17,11 @@ fate-matroska-remux: REF = 49a60ef91cf7302ab7276f9373f8a429 FATE_MATROSKA-$(call ALLYES, MATROSKA_DEMUXER VORBIS_PARSER) += fate-matroska-xiph-lacing fate-matroska-xiph-lacing: CMD = framecrc -i $(TARGET_SAMPLES)/mkv/xiph_lacing.mka -c:a copy +# This tests that the Matroska demuxer correctly demuxes WavPack +# without CodecPrivate; it also tests zlib compressed WavPack. +FATE_MATROSKA-$(call ALLYES, MATROSKA_DEMUXER ZLIB) += fate-matroska-wavpack-missing-codecprivate +fate-matroska-wavpack-missing-codecprivate: CMD = framecrc -i $(TARGET_SAMPLES)/mkv/wavpack_missing_codecprivate.mka -c copy + # This tests that the matroska demuxer supports decompressing # zlib compressed tracks (both the CodecPrivate as well as the actual frames). FATE_MATROSKA-$(call ALLYES, MATROSKA_DEMUXER ZLIB) += fate-matroska-zlib-decompression diff --git a/tests/ref/fate/matroska-wavpack-missing-codecprivate b/tests/ref/fate/matroska-wavpack-missing-codecprivate new file mode 100644 index 0000000000..4645a86ff6 --- /dev/null +++ b/tests/ref/fate/matroska-wavpack-missing-codecprivate @@ -0,0 +1,9 @@ +#extradata 0: 2, 0x00240014 +#tb 0: 11337/500000000 +#media_type 0: audio +#codec_id 0: wavpack +#sample_rate 0: 44100 +#channel_layout 0: 3 +#channel_layout_name 0: stereo +0, 0, 0, 22051, 14778, 0x02819286 +0, 22051, 22051, 22052, 14756, 0x21976243