From patchwork Thu May 16 22:30:12 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 13146 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 A979944964F for ; Fri, 17 May 2019 01:43:29 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 984F368A277; Fri, 17 May 2019 01:43:29 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wr1-f66.google.com (mail-wr1-f66.google.com [209.85.221.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id DB09B689D5F for ; Fri, 17 May 2019 01:43:25 +0300 (EEST) Received: by mail-wr1-f66.google.com with SMTP id r7so5008088wrr.13 for ; Thu, 16 May 2019 15:43:25 -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:in-reply-to:references :mime-version:content-transfer-encoding; bh=s4Gd18o4/GJ/hXTyrQYHUg8Uko8Msm5mGu5yvwApaRw=; b=fP9az3JiyeaVA+PQ9+YTVFyeoQFvEUt53fIS2mO4V7UsRVRlbo3ZK7/XrNxm7xQrpl LfrjdJ3QKxVSiya2gXfCO2iEkbId3gCBwCko7Pb4LiBxkeqLTqDO4MN3G3LkrowqgXi5 JMvYiAbMP1pNCaahhopxR1RNJZXlUitfBk3ORZU0s6lpaXCMIhBYGCTXDOgc411bdWus wAoIkSngYkmJRvPo5WZxinOxaLhpiFtr7muw9xXwgQ2fzP+GvHt9iy0AIUXxNhYXPKyd voDO4qr7QkY+EXLtF4IcH3rTFynhU/XTURKHHe4wO5yioRf08npwo2nNBVqzsdjRXg/j RX7w== 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=s4Gd18o4/GJ/hXTyrQYHUg8Uko8Msm5mGu5yvwApaRw=; b=hfwHS/HB0B7J6EKc3Atco22bCSwXoYMJG7EfHQXRscis+4LYOSB7P3aZ/KuRfaXCIy vjztYWC3chJR1Vbp+8Bmc0MF75TsURjrXyrj6wy805X/b98psvsozOuQmQP62lWgJxJX a78CBi1SpRe/swXFNeVI7PRovKHreUVMuv1eUPDJJf1Wd2TqivcIlgD8LwY8VU8xLuwD RMBLuzfEvthyfZ/M09Gsq48Y7e6kB7gmwJ3Hoku7TeL8MNRu3Unr6Cz3qCQ26Q6mXEYo 7viyaR3hglXsxT5lM0DI2d5VzSbTMfMhbfl26ZVaj2nLonwgTPUEGLRcGNOVSxhsrCwH Vniw== X-Gm-Message-State: APjAAAVqshnX9HG9pJnpibPyVdxxPvM7O1miJXo2JEN2uWa/uG8ablH/ NYpYmYJBYr++bbde1nnwsasJqamD X-Google-Smtp-Source: APXvYqyBzJqYnIIeYbOVkdb5kcwTIXYVN0ZlY7NsLOXclUAtOnQuDQM1gm3JOtN+lRvFrNrKzBMuOg== X-Received: by 2002:a5d:55c9:: with SMTP id i9mr14412378wrw.261.1558046605210; Thu, 16 May 2019 15:43:25 -0700 (PDT) Received: from localhost.localdomain (ipbcc18715.dynamic.kabel-deutschland.de. [188.193.135.21]) by smtp.gmail.com with ESMTPSA id i185sm11168725wmg.32.2019.05.16.15.43.24 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 May 2019 15:43:24 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 17 May 2019 00:30:12 +0200 Message-Id: <20190516223018.30827-29-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190516223018.30827-1-andreas.rheinhardt@gmail.com> References: <20190516223018.30827-1-andreas.rheinhardt@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 28/37] avformat/matroskadec: Reuse positions 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" Up until now, avio_tell was used multiple times in ebml_parse and its subroutines, although the result of these calls can usually be simply derived from the result of earlier calls to avio_tell. This has been changed. Unnecessary calls to avio_tell in ebml_parse are avoided now. Furthermore, there has been a slight change in the output of some error messages relating to elements exceeding their containing master element: The reported position of the element now points to the first byte of the element ID and no longer to the first byte of the element's payload. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskadec.c | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index f769543b4a..3dddcd234f 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -972,7 +972,8 @@ static int ebml_read_ascii(AVIOContext *pb, int size, char **str) * Read the next element as binary data. * 0 is success, < 0 or NEEDS_CHECKING is failure. */ -static int ebml_read_binary(AVIOContext *pb, int length, EbmlBin *bin) +static int ebml_read_binary(AVIOContext *pb, int length, + int64_t pos, EbmlBin *bin) { int ret; @@ -983,7 +984,7 @@ static int ebml_read_binary(AVIOContext *pb, int length, EbmlBin *bin) bin->data = bin->buf->data; bin->size = length; - bin->pos = avio_tell(pb); + bin->pos = pos; if ((ret = avio_read(pb, bin->data, length)) != length) { av_buffer_unref(&bin->buf); bin->data = NULL; @@ -999,9 +1000,9 @@ static int ebml_read_binary(AVIOContext *pb, int length, EbmlBin *bin) * are supposed to be sub-elements which can be read separately. * 0 is success, < 0 is failure. */ -static int ebml_read_master(MatroskaDemuxContext *matroska, uint64_t length) +static int ebml_read_master(MatroskaDemuxContext *matroska, + uint64_t length, int64_t pos) { - AVIOContext *pb = matroska->ctx->pb; MatroskaLevel *level; if (matroska->num_levels >= EBML_MAX_DEPTH) { @@ -1011,7 +1012,7 @@ static int ebml_read_master(MatroskaDemuxContext *matroska, uint64_t length) } level = &matroska->levels[matroska->num_levels++]; - level->start = avio_tell(pb); + level->start = pos; level->length = length; return 0; @@ -1169,7 +1170,7 @@ static int ebml_parse(MatroskaDemuxContext *matroska, AVIOContext *pb = matroska->ctx->pb; uint32_t id; uint64_t length; - int64_t pos = avio_tell(pb); + int64_t pos = avio_tell(pb), pos_alt; int res, update_pos = 1, level_check; void *newelem; MatroskaLevel1Element *level1_elem; @@ -1197,8 +1198,11 @@ static int ebml_parse(MatroskaDemuxContext *matroska, return res; } matroska->current_id = id | 1 << 7 * res; - } else - pos -= (av_log2(matroska->current_id) + 7) / 8; + pos_alt = pos + res; + } else { + pos_alt = pos; + pos -= (av_log2(matroska->current_id) + 7) / 8; + } id = matroska->current_id; @@ -1243,14 +1247,15 @@ static int ebml_parse(MatroskaDemuxContext *matroska, length, max_lengths[syntax->type], syntax->type); return AVERROR_INVALIDDATA; } + + pos_alt += res; + if (matroska->num_levels > 0) { MatroskaLevel *level = &matroska->levels[matroska->num_levels - 1]; - AVIOContext *pb = matroska->ctx->pb; - int64_t pos = avio_tell(pb); if (length != EBML_UNKNOWN_LENGTH && level->length != EBML_UNKNOWN_LENGTH) { - uint64_t elem_end = pos + length, + uint64_t elem_end = pos_alt + length, level_end = level->start + level->length; if (elem_end < level_end) { @@ -1305,14 +1310,14 @@ static int ebml_parse(MatroskaDemuxContext *matroska, res = ebml_read_ascii(pb, length, data); break; case EBML_BIN: - res = ebml_read_binary(pb, length, data); + res = ebml_read_binary(pb, length, pos_alt, data); break; case EBML_LEVEL1: case EBML_NEST: - if ((res = ebml_read_master(matroska, length)) < 0) + if ((res = ebml_read_master(matroska, length, pos_alt)) < 0) return res; if (id == MATROSKA_ID_SEGMENT) - matroska->segment_start = avio_tell(matroska->ctx->pb); + matroska->segment_start = pos_alt; if (id == MATROSKA_ID_CUES) matroska->cues_parsing_deferred = 0; if (syntax->type == EBML_LEVEL1 &&