From patchwork Sun Mar 29 11:13:21 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 18482 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 3490F448E87 for ; Sun, 29 Mar 2020 14:13:52 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1608868B0FE; Sun, 29 Mar 2020 14:13:52 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f65.google.com (mail-wm1-f65.google.com [209.85.128.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id BD0EB68B051 for ; Sun, 29 Mar 2020 14:13:45 +0300 (EEST) Received: by mail-wm1-f65.google.com with SMTP id c81so16553109wmd.4 for ; Sun, 29 Mar 2020 04:13:45 -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=YRxBOxsHR5ibxSXAzut1G/qtVBOOB2koGe9NFwDPzXs=; b=p74WB8VTWPRJ/vnJquC1fPCLvzsRFJKLPDXZe73kZ/ihC+lP33sinHe1SqhkrHnG2k zbvnOEcjOge1/Pz2YtG6Vr5C3U5E9rprlUthNq5QiEbMeFV0QEWZao0rFX6oOqaQbcVR Bt8vTZQsMjYskRq0QjEtd+8jwab/T/FXNcNS0DC0b2fSgYEAmlIKClK3vD60DEacaCgu Jej+YHifgZqH8reNyXZgxsaI4Yhx0U36WCi/aHv37TeOzPAnWR+JE87Oi00NrQqy0hSU GbxrnDetCwFIWA8hl0nrYA+mh458k8LTXB5brJaUulzIXAwVL+IdYdUI32l1iq2C+2Fh 6oiQ== 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=YRxBOxsHR5ibxSXAzut1G/qtVBOOB2koGe9NFwDPzXs=; b=Ys9tQwRokIqh885lCxaNUSuZR4JYNyc67AA7DXhabg6V/NyYYQYBSnrAa7+k5alTuJ 5VpaMaJWQNzMcaTC+vO6eKTcF6Q2IoF614CJXu+KakisP4HkmU91f1B5Mlf/OD3BFRgw r0MOqNRo1NZEaV0PhEovUOXtpWEZWTexZCZz6fi8DtwblSrv3aCf6BsEN3uMn1DQQXK5 2M6Aw3x35X8NTkWwZixDMhyo0UYIbSBVHzUvccS9vPsCIbPb7ROA/m8QH+vSCUPl5cXw zqd/EXyE2oCA1wFuamJtVwH+K5+vxKqhtpIq7ij5I23JVzRShY8iMloapGvYXnpcGyNr R99Q== X-Gm-Message-State: ANhLgQ0S2Rfq2G21wBXtkurblw9XveAKCEx+cl68/JkY0FUbIb2TReXK sWMijm9uA3c5GOyp/P2xJTOJd5xp X-Google-Smtp-Source: ADFU+vt7n8XjOSAuvg1bz/WXymNZEPLAdTGQaMjkNrOsG5PUKZFrbZUVKUIw5kyRovCk70b8OPWEug== X-Received: by 2002:a1c:540f:: with SMTP id i15mr6833568wmb.124.1585480424664; Sun, 29 Mar 2020 04:13:44 -0700 (PDT) Received: from sblaptop.fritz.box (ipbcc1ab57.dynamic.kabel-deutschland.de. [188.193.171.87]) by smtp.gmail.com with ESMTPSA id f12sm16122672wmh.4.2020.03.29.04.13.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 29 Mar 2020 04:13:43 -0700 (PDT) From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 29 Mar 2020 13:13:21 +0200 Message-Id: <20200329111325.2686-1-andreas.rheinhardt@gmail.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/5] avformat/smacker: Read extradata directly into 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" The Smacker demuxer reads four consecutive 32bit values from the file header into its demux context (as four uint32_t), converting it to native endianness in the process and then writing these four values later (after extradata has been allocated) to extradata as four 32bit values (converting to little endian in the process). This commit changes this: The stream and the extradata are allocated earlier, so that the data destined for extradata can be read directly into extradata. Furthermore, given that these values are not needed for demuxing itself they are now no longer kept as part of the demuxing context. Finally, a check regarding the number of frames has been moved up, too, in order to exit early before unnecessarily allocating the stream and the extradata. Signed-off-by: Andreas Rheinhardt --- libavformat/smacker.c | 47 +++++++++++++++++-------------------------- 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/libavformat/smacker.c b/libavformat/smacker.c index 6de0e7a0f1..4db3ec326f 100644 --- a/libavformat/smacker.c +++ b/libavformat/smacker.c @@ -25,10 +25,10 @@ #include -#include "libavutil/bswap.h" #include "libavutil/channel_layout.h" #include "libavutil/intreadwrite.h" #include "avformat.h" +#include "avio_internal.h" #include "internal.h" #define SMACKER_PAL 0x01 @@ -51,7 +51,6 @@ typedef struct SmackerContext { uint32_t flags; uint32_t audio[7]; uint32_t treesize; - uint32_t mmap_size, mclr_size, full_size, type_size; uint8_t aflags[7]; uint32_t rates[7]; uint32_t pad; @@ -128,6 +127,10 @@ static int smacker_read_header(AVFormatContext *s) smk->flags = avio_rl32(pb); if(smk->flags & SMACKER_FLAG_RING_FRAME) smk->frames++; + if (smk->frames > 0xFFFFFF) { + av_log(s, AV_LOG_ERROR, "Too many frames: %"PRIu32"\n", smk->frames); + return AVERROR_INVALIDDATA; + } for(i = 0; i < 7; i++) smk->audio[i] = avio_rl32(pb); smk->treesize = avio_rl32(pb); @@ -137,21 +140,25 @@ static int smacker_read_header(AVFormatContext *s) return AVERROR_INVALIDDATA; } -//FIXME remove extradata "rebuilding" - smk->mmap_size = avio_rl32(pb); - smk->mclr_size = avio_rl32(pb); - smk->full_size = avio_rl32(pb); - smk->type_size = avio_rl32(pb); + st = avformat_new_stream(s, NULL); + if (!st) + return AVERROR(ENOMEM); + + if ((ret = ff_alloc_extradata(st->codecpar, smk->treesize + 16)) < 0) { + av_log(s, AV_LOG_ERROR, + "Cannot allocate %"PRIu32" bytes of extradata\n", + smk->treesize + 16); + return ret; + } + if ((ret = ffio_read_size(pb, st->codecpar->extradata, 16)) < 0) + return ret; + for(i = 0; i < 7; i++) { smk->rates[i] = avio_rl24(pb); smk->aflags[i] = avio_r8(pb); } smk->pad = avio_rl32(pb); /* setup data */ - if(smk->frames > 0xFFFFFF) { - av_log(s, AV_LOG_ERROR, "Too many frames: %"PRIu32"\n", smk->frames); - return AVERROR_INVALIDDATA; - } smk->frm_size = av_malloc_array(smk->frames, sizeof(*smk->frm_size)); smk->frm_flags = av_malloc(smk->frames); if (!smk->frm_size || !smk->frm_flags) { @@ -171,12 +178,6 @@ static int smacker_read_header(AVFormatContext *s) } /* init video codec */ - st = avformat_new_stream(s, NULL); - if (!st) { - av_freep(&smk->frm_size); - av_freep(&smk->frm_flags); - return AVERROR(ENOMEM); - } smk->videoindex = st->index; st->codecpar->width = smk->width; st->codecpar->height = smk->height; @@ -233,24 +234,12 @@ static int smacker_read_header(AVFormatContext *s) /* load trees to extradata, they will be unpacked by decoder */ - if ((ret = ff_alloc_extradata(st->codecpar, smk->treesize + 16)) < 0) { - av_log(s, AV_LOG_ERROR, - "Cannot allocate %"PRIu32" bytes of extradata\n", - smk->treesize + 16); - av_freep(&smk->frm_size); - av_freep(&smk->frm_flags); - return ret; - } ret = avio_read(pb, st->codecpar->extradata + 16, st->codecpar->extradata_size - 16); if(ret != st->codecpar->extradata_size - 16){ av_freep(&smk->frm_size); av_freep(&smk->frm_flags); return AVERROR(EIO); } - ((int32_t*)st->codecpar->extradata)[0] = av_le2ne32(smk->mmap_size); - ((int32_t*)st->codecpar->extradata)[1] = av_le2ne32(smk->mclr_size); - ((int32_t*)st->codecpar->extradata)[2] = av_le2ne32(smk->full_size); - ((int32_t*)st->codecpar->extradata)[3] = av_le2ne32(smk->type_size); smk->curstream = -1; smk->nextpos = avio_tell(pb);