From patchwork Fri Dec 6 23:16:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 16655 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 7280844AD30 for ; Sat, 7 Dec 2019 01:18:17 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5A61368B6E3; Sat, 7 Dec 2019 01:18:17 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f65.google.com (mail-wr1-f65.google.com [209.85.221.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 42F6A68B6C3 for ; Sat, 7 Dec 2019 01:18:09 +0200 (EET) Received: by mail-wr1-f65.google.com with SMTP id z7so9436912wrl.13 for ; Fri, 06 Dec 2019 15:18:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=28RzytQRZfXHMxUhDqITyW0fchWPCjUjNgPxZ4WNkKk=; b=sdfPhzdGltXKqtAOpyZM0Fi9OuYD1HUkGNoIL/lX9g2SKHRKVE7z++7kSptKGAu+3/ Cr2q+XM847CHPHoZ40OB0mrRzKGMboitA/qZXglBPraPc8WhfSMIWYTph2eImpcC/cBW XEF5Htkaww7Ad2GUVAqmvFsxPf20ZmAENDRLwjHI3WKZGsV0K2LYasbS/xGq4UvfP1hO DxqrpM2/Jq9SsWPLHzEOh1o4DqKStLevFX5GAX9O0NiMgr0fh6Tqlk/eIpySNbSXpiRy ERNGbqQFwtYXCo5DYwUAUM6qiOeguU4m5qaz30iRHC+nqehFgldgRGxOPPTjXiEVzN3u J0+Q== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=28RzytQRZfXHMxUhDqITyW0fchWPCjUjNgPxZ4WNkKk=; b=aUT8djBplIB9ootwwBnYKUZ8xKnJBmnL8hNcYdpEtHkSskU0cpND2AUMFzk4s+Kb8q sFqzgvMJ0M72XDuZGzIUQ+MXczzl85e3YfDG8dcebpq6va3j3OGfZH6zJeX3xohovSFI CBQWvPJ59YpmeVyPxPAdXomrFLhGkFZV3HzhsuuMFA6OpBXS8L9n53W3Zm5w3/jvJUTT aHXOiGJLgc3N2E7N+RH44TFo8QECEbRiTrQph4R7NJ1AvU462QEasaaloOxxLD/yZ6Au iZMFjgk8/n65VHDS3Hrc9HyF0Q+JQMETpM4uE5ApDL2znDkxBOoPvMhS3AvUqjAsbqkL w7BA== X-Gm-Message-State: APjAAAUyFdknEfCwJdp7Cszw1/pcXqQB48W6AvXUbbqv5+N5YJQY9vjF Oti+WzfjKrTtwSxdZXi6s1AWZ+x1 X-Google-Smtp-Source: APXvYqy/loqKn3Auib0BmoltJ0WpjAkat24fmJFO3rbe7EA2o3Eo9olPjmkeJbWm0gLQrplI8xnmQA== X-Received: by 2002:adf:f491:: with SMTP id l17mr17683180wro.149.1575674288488; Fri, 06 Dec 2019 15:18:08 -0800 (PST) Received: from sblaptop.fritz.box (ipbcc08e23.dynamic.kabel-deutschland.de. [188.192.142.35]) by smtp.gmail.com with ESMTPSA id j12sm18758461wrw.54.2019.12.06.15.18.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 06 Dec 2019 15:18:08 -0800 (PST) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sat, 7 Dec 2019 00:16:21 +0100 Message-Id: <20191206231622.13672-5-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20191206231622.13672-1-andreas.rheinhardt@gmail.com> References: <20191206231622.13672-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 5/6] avformat/matroskadec: Extend support of ContentCompression to all codecs 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" The Matroska demuxer has three functions for creating packets out of the data read: One for certain Real audio codecs (atrac3, cook, sipr, ra_288), one for WebVTT (actually, the WebM flavour of it) and one for all the others. Only the last function supported Matroska's ContentCompression (i.e. it reversed zlib compression or added the removed headers to the packets). But in Matroska, all tracks are allowed to be compressed. This commit adds support for this. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskadec.c | 78 +++++++++++++++++++++------------------ 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index a7226ee810..982dfdec39 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -3161,10 +3161,11 @@ static int matroska_parse_rm_audio(MatroskaDemuxContext *matroska, } /* reconstruct full wavpack blocks from mangled matroska ones */ -static int matroska_parse_wavpack(MatroskaTrack *track, uint8_t *src, - uint8_t **pdst, int *size) +static int matroska_parse_wavpack(MatroskaTrack *track, + uint8_t **data, int *size) { uint8_t *dst = NULL; + uint8_t *src = *data; int dstlen = 0; int srclen = *size; uint32_t samples; @@ -3233,7 +3234,7 @@ static int matroska_parse_wavpack(MatroskaTrack *track, uint8_t *src, memset(dst + dstlen, 0, AV_INPUT_BUFFER_PADDING_SIZE); - *pdst = dst; + *data = dst; *size = dstlen; return 0; @@ -3243,8 +3244,8 @@ fail: return ret; } -static int matroska_parse_prores(MatroskaTrack *track, uint8_t *src, - uint8_t **pdst, int *size) +static int matroska_parse_prores(MatroskaTrack *track, + uint8_t **data, int *size) { uint8_t *dst; int dstlen = *size + 8; @@ -3255,10 +3256,10 @@ static int matroska_parse_prores(MatroskaTrack *track, uint8_t *src, AV_WB32(dst, dstlen); AV_WB32(dst + 4, MKBETAG('i', 'c', 'p', 'f')); - memcpy(dst + 8, src, dstlen - 8); + memcpy(dst + 8, *data, dstlen - 8); memset(dst + dstlen, 0, AV_INPUT_BUFFER_PADDING_SIZE); - *pdst = dst; + *data = dst; *size = dstlen; return 0; @@ -3381,51 +3382,43 @@ static int matroska_parse_webvtt(MatroskaDemuxContext *matroska, static int matroska_parse_frame(MatroskaDemuxContext *matroska, MatroskaTrack *track, AVStream *st, - AVBufferRef *buf, uint8_t *data, int pkt_size, + AVBufferRef *buf, uint8_t **data, int pkt_size, uint64_t timecode, uint64_t lace_duration, int64_t pos, int is_keyframe, uint8_t *additional, uint64_t additional_id, int additional_size, int64_t discard_padding) { - uint8_t *pkt_data = data; + uint8_t *pkt_data = *data; int res; AVPacket pktl, *pkt = &pktl; - if (track->needs_decoding) { - res = matroska_decode_buffer(&pkt_data, &pkt_size, track); - if (res < 0) - return res; - } - if (st->codecpar->codec_id == AV_CODEC_ID_WAVPACK) { - uint8_t *wv_data; - res = matroska_parse_wavpack(track, pkt_data, &wv_data, &pkt_size); + res = matroska_parse_wavpack(track, &pkt_data, &pkt_size); if (res < 0) { av_log(matroska->ctx, AV_LOG_ERROR, "Error parsing a wavpack block.\n"); goto fail; } - if (pkt_data != data) - av_freep(&pkt_data); - pkt_data = wv_data; + if (!buf) + av_freep(data); + buf = NULL; } if (st->codecpar->codec_id == AV_CODEC_ID_PRORES && AV_RB32(pkt_data + 4) != MKBETAG('i', 'c', 'p', 'f')) { - uint8_t *pr_data; - res = matroska_parse_prores(track, pkt_data, &pr_data, &pkt_size); + res = matroska_parse_prores(track, &pkt_data, &pkt_size); if (res < 0) { av_log(matroska->ctx, AV_LOG_ERROR, "Error parsing a prores block.\n"); goto fail; } - if (pkt_data != data) - av_freep(&pkt_data); - pkt_data = pr_data; + if (!buf) + av_freep(data); + buf = NULL; } av_init_packet(pkt); - if (pkt_data != data) + if (!buf) pkt->buf = av_buffer_create(pkt_data, pkt_size + AV_INPUT_BUFFER_PADDING_SIZE, NULL, NULL, 0); else @@ -3495,8 +3488,8 @@ FF_ENABLE_DEPRECATION_WARNINGS return 0; fail: - if (pkt_data != data) - av_freep(&pkt_data); + if (!buf) + av_freep(data); return res; } @@ -3595,25 +3588,40 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, AVBufferRef *buf for (n = 0; n < laces; n++) { int64_t lace_duration = block_duration*(n+1) / laces - block_duration*n / laces; + uint8_t *out_data = data; + int out_size = lace_size[n]; + + if (track->needs_decoding) { + res = matroska_decode_buffer(&out_data, &out_size, track); + if (res < 0) + return res; + /* Given that we are here means that out_data is no longer + * owned by buf, so set it to NULL. This depends upon + * zero-length header removal compression being ignored. */ + buf = NULL; + } if (track->audio.buf) { - res = matroska_parse_rm_audio(matroska, track, st, data, - lace_size[n], + res = matroska_parse_rm_audio(matroska, track, st, + out_data, out_size, timecode, pos); + if (!buf) + av_free(out_data); if (res) return res; - } else if (st->codecpar->codec_id == AV_CODEC_ID_WEBVTT) { res = matroska_parse_webvtt(matroska, track, st, - data, lace_size[n], + out_data, out_size, timecode, lace_duration, pos); + if (!buf) + av_free(out_data); if (res) return res; } else { - res = matroska_parse_frame(matroska, track, st, buf, data, lace_size[n], - timecode, lace_duration, pos, - !n ? is_keyframe : 0, + res = matroska_parse_frame(matroska, track, st, buf, &out_data, + out_size, timecode, lace_duration, + pos, !n ? is_keyframe : 0, additional, additional_id, additional_size, discard_padding); if (res)