From patchwork Wed Apr 4 23:43:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 8334 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.1.70 with SMTP id c67csp5440060jad; Wed, 4 Apr 2018 16:44:00 -0700 (PDT) X-Google-Smtp-Source: AIpwx4/Dz/sjNSthyw+VIDhBuhXt94GaI176VxhtblNlRuc35DEyuY4rSbGRxTZO25HlxanuoDNS X-Received: by 10.28.160.1 with SMTP id j1mr9462397wme.21.1522885440088; Wed, 04 Apr 2018 16:44:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1522885440; cv=none; d=google.com; s=arc-20160816; b=OuE0IpU2aT35HcX74OAyduZkGibMkNjBp69GdoWtp2PzR7bGUZx/wBzbBT8UMuwvnA ovltQYWaZiu9al/GuwgF1l3gYTJ1QmwUqs4C8fCu5e0L4huKh0ZIWtAOYvWJudxtW1BE lK70jvjVvnIK/oZYTAJba6GqPe1tUKVBjW/lDiNXfu6PbAkYIFv1w7esuCSdtqqO7GHN JEIkrrg4387laJvsvTli52vhnvFpE3449DK102VYVJ7Zgd16rE5gkGTIW1FsQakGh6BA 2uHvGAt7Pthlqa3L9e6dSfLNj+z0tqtTWe+fg1/vfyZLFFP2UdAgGjj3OwrRoEArwy76 hbcg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:message-id:date:to:from:dkim-signature :delivered-to:arc-authentication-results; bh=ttC48s2zAOrCCW/zAvNfxmINHQU3HSNtCO9PN7dkMsc=; b=Epa4ox/6/wbgWsN+J/sPmekFIDaD6XOz8with6ysr7fyrZcm07gxuKHA72rYVyoGBv nYEulLwQ6bY+HN9VcjJk0IRcHZJ5XBT87qcVsHvWR4epYZIVGFf6uMML8CMNtwt/1Acs tX9S+6utVo/KagFrKUcgJ9NHuQtSQvhmtc282PSFpxES4jiT//XQwrP5Gs1D2DJZ5IQm vcjyjM8rWtOWT9ovubYBtXoypcoIwISTYpflF+3pcOnJOBKPUFbtlDjSOqn1aDthpg8N Yb4hiavJdKpNgamLUcKo+0vGLxRCgbATK3nwGkMRoe5smeR7yk720p9xwegeDeGvCooD qmVg== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=emPox72k; 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=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id w134si1388776wmd.19.2018.04.04.16.43.59; Wed, 04 Apr 2018 16:44:00 -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=@gmail.com header.s=20161025 header.b=emPox72k; 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=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1B005689D99; Thu, 5 Apr 2018 02:43:36 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk0-f195.google.com (mail-qk0-f195.google.com [209.85.220.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4E3A068972B for ; Thu, 5 Apr 2018 02:43:29 +0300 (EEST) Received: by mail-qk0-f195.google.com with SMTP id u9so11058070qkk.11 for ; Wed, 04 Apr 2018 16:43:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=UxlE0kJNsQBb8LqEw3WhPzofQnMZk4Q0EphnLV8vFvc=; b=emPox72kgqD6YgYGmQtTn6zW+M+HbuIBlHjpActD1XaRcDo6R+uJ5wOUL+kf4UV8Rz tkfGpCUz7RhrRZfIQvwVW23hr2q34KKV4Sskueoe+9n8a7vxCxusUlcsTaPqylO7iFzz UwSIkav55FBpj7mQ3kHZQ/X1cQJ6w916W1T/4MLKmdKK+vGJ+PvUdN/oNlr03RWAYDHc 6zL6w1eUhRpaKebdLkRRaR804AubRJMNA/7k8Sny1PpsO+1DEBeDPuhgdFNuMvxdMNXt oQ6Bu6/zMgyxEAoII698iqrpwoXTijxdAWbSbbcrPng/r29NFU0gv83J7TEyUORK4o+E RNvQ== 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; bh=UxlE0kJNsQBb8LqEw3WhPzofQnMZk4Q0EphnLV8vFvc=; b=YRyio1fIPu8zf7Jwq8DaZDohZUgnt6cOm+jb6xW3gDW/crxX25WORg6mPlxl34ANVo 5MIxOsGlVzn+i2FMGJR/Dw42rvzbS0CrGqFYWGybSRRCyZyNyt843rzo6uJNcQmiIUmb IXqS0lYY6zoaUjKgfdyzegBH/vd2NcarwdrJrneZKShbgdM70QNwHco67sIDScXPKuUC YEbEGPfDzuoB3YFTzbjjYuR8w48HCpmSgw044D3HJkwYJItAQAXw31KP44R0v1Dva6bP BsZr9CHOPi4x33sJFX8Kv2ceyPZhPEaD7M0tptNH1h3f1VQIsGcAolbP526YC/cRK5PQ sWww== X-Gm-Message-State: ALQs6tBnwsaAC/+gLFR+/FrAqujoFpk5++0+uWenKoP6trOUHfuB1ZAz RbZJ0oOklsk/Z8iluki7Ph6Izg== X-Received: by 10.55.154.206 with SMTP id c197mr27601218qke.350.1522885429127; Wed, 04 Apr 2018 16:43:49 -0700 (PDT) Received: from localhost.localdomain ([190.188.171.140]) by smtp.gmail.com with ESMTPSA id a11sm1924200qtc.3.2018.04.04.16.43.47 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 04 Apr 2018 16:43:48 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Wed, 4 Apr 2018 20:43:32 -0300 Message-Id: <20180404234334.9052-1-jamrial@gmail.com> X-Mailer: git-send-email 2.16.2 Subject: [FFmpeg-devel] [PATCH 1/3] avformat/matroskadec: use refcounted buffers in EbmlBin 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Data in EbmlBin objects is never changed after being read from the input file (save for two specific cases with encoded CodePrivate), so using AVBufferRef we can prevent unnecessary copy of data by instead creating new references to said constant data. Signed-off-by: James Almer --- The CodecPrivate parts are untested, as there's no FATE coverage of them. libavformat/matroskadec.c | 44 +++++++++++++++++++++++++++++++------------- 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 6156c2f9b4..029929a1cb 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -104,6 +104,7 @@ typedef struct EbmlList { typedef struct EbmlBin { int size; + AVBufferRef *buf; uint8_t *data; int64_t pos; } EbmlBin; @@ -962,14 +963,19 @@ static int ebml_read_ascii(AVIOContext *pb, int size, char **str) */ static int ebml_read_binary(AVIOContext *pb, int length, EbmlBin *bin) { - av_fast_padded_malloc(&bin->data, &bin->size, length); - if (!bin->data) - return AVERROR(ENOMEM); + int ret; + ret = av_buffer_realloc(&bin->buf, length + AV_INPUT_BUFFER_PADDING_SIZE); + if (ret < 0) + return ret; + memset(bin->buf->data + length, 0, AV_INPUT_BUFFER_PADDING_SIZE); + + bin->data = bin->buf->data; bin->size = length; bin->pos = avio_tell(pb); if (avio_read(pb, bin->data, length) != length) { - av_freep(&bin->data); + av_buffer_unref(&bin->buf); + bin->data = NULL; bin->size = 0; return AVERROR(EIO); } @@ -1252,7 +1258,7 @@ static void ebml_free(EbmlSyntax *syntax, void *data) av_freep(data_off); break; case EBML_BIN: - av_freep(&((EbmlBin *) data_off)->data); + av_buffer_unref(&((EbmlBin *) data_off)->buf); break; case EBML_LEVEL1: case EBML_NEST: @@ -2036,12 +2042,13 @@ static int get_qt_codec(MatroskaTrack *track, uint32_t *fourcc, enum AVCodecID * * by expanding/shifting the data by 4 bytes and storing the data * size at the start. */ if (ff_codec_get_id(codec_tags, AV_RL32(track->codec_priv.data))) { - uint8_t *p = av_realloc(track->codec_priv.data, - track->codec_priv.size + 4); - if (!p) - return AVERROR(ENOMEM); - memmove(p + 4, p, track->codec_priv.size); - track->codec_priv.data = p; + int ret = av_buffer_realloc(&track->codec_priv.buf, + track->codec_priv.size + 4 + AV_INPUT_BUFFER_PADDING_SIZE); + if (ret < 0) + return ret; + + track->codec_priv.data = track->codec_priv.buf->data; + memmove(track->codec_priv.data + 4, track->codec_priv.data, track->codec_priv.size); track->codec_priv.size += 4; AV_WB32(track->codec_priv.data, track->codec_priv.size); } @@ -2162,8 +2169,19 @@ static int matroska_parse_tracks(AVFormatContext *s) "Failed to decode codec private data\n"); } - if (codec_priv != track->codec_priv.data) - av_free(codec_priv); + if (codec_priv != track->codec_priv.data) { + av_buffer_unref(&track->codec_priv.buf); + if (track->codec_priv.data) { + track->codec_priv.buf = av_buffer_create(track->codec_priv.data, + track->codec_priv.size + AV_INPUT_BUFFER_PADDING_SIZE, + NULL, NULL, 0); + if (!track->codec_priv.buf) { + av_freep(&track->codec_priv.data); + track->codec_priv.size = 0; + return AVERROR(ENOMEM); + } + } + } } }