From patchwork Mon Aug 26 16:17:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 14719 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 158E944A3B0 for ; Mon, 26 Aug 2019 19:18:57 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 064CD68AD22; Mon, 26 Aug 2019 19:18:57 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f193.google.com (mail-qt1-f193.google.com [209.85.160.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8481E68A878 for ; Mon, 26 Aug 2019 19:18:47 +0300 (EEST) Received: by mail-qt1-f193.google.com with SMTP id u34so18451784qte.2 for ; Mon, 26 Aug 2019 09:18:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=VgPJ4KULzVR8iebcwPqQoTCqDrVaI+W1m0TKO6FOSWs=; b=eo4MIbh2OkqrhD/mWvHh9l8UKfT6urNDW3gIPqiPmMPStXMaIocrmOeG7k4VDPAdXo pW+BnD0fYnM5XM/+Od3DtT58CPpbQr72H9ZG9lb616NE8ZKm8lIBopZHNq209XZxGXDG SJQRUzpTJcXyrZ5FCYCFNrNAVUyQYqSC8Uw2r9if5sHxMDoxflkZEKnPjMjvHsL3ycCE BBSyt+g4u6RvaB/vjFW/Q28jx7kOIFzRaAD79LxEPmiYSi5oaMLwOepQp4ONzvn2lDYN h2cc8xFm25/suN1RwLCh2cSU0iAmEvehrZPKWqKHubHb+imLvFasrh7TNuuWQ93aCq5I vKDQ== 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=VgPJ4KULzVR8iebcwPqQoTCqDrVaI+W1m0TKO6FOSWs=; b=a+w/ZOkbrLavIirZ7Bx8OkL1DnT2pKCwPjKSsh1HF1Nixkl++ROKuRokt8VIl1ZWPD Bi49CAX6ki7coinYDpil7NvisaLrvjA1sIrMvhlPeMoiGZzS03D5rgf1RhXDmxm3MXx5 ZfkZSeHQsyhaSfSMU06ra5k4ZwjI/Fz5v+An7XZL5XZXq0vEEzgE7tMKRR1GKnXol6k3 0Oi/cAe0Uih7rfNXTznTmLQdj0L7YiCmpq9FyHhqDSdlIL/vQ/VjAQKA1IlsVJN35iwh pXtg5QHh555o14JWGyfKdHxmamuiZajnbL8hbXxmwW5tTud7Od5j3eSBhZPOOUCyZ+16 88qA== X-Gm-Message-State: APjAAAXIrFsua++ytocVvft1rTpDVsa2aDC8S6iBnvMjIQSvLIUQ+co/ 2U//hrzYuYKAeJObnPcmo4TpEw9L X-Google-Smtp-Source: APXvYqzV9gSZNPDpzJsBH5YxBX0Tn0rBkKUuwK8XIVnqG39FfpbIBryQwhoA1h0EQbF3xVFBzy2Ktw== X-Received: by 2002:ac8:2cd6:: with SMTP id 22mr17780676qtx.80.1566836326322; Mon, 26 Aug 2019 09:18:46 -0700 (PDT) Received: from localhost.localdomain ([181.23.84.150]) by smtp.gmail.com with ESMTPSA id b1sm5149118qkk.8.2019.08.26.09.18.45 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 26 Aug 2019 09:18:45 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 26 Aug 2019 13:17:27 -0300 Message-Id: <20190826161727.1255-3-jamrial@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190826161727.1255-1-jamrial@gmail.com> References: <20190826161727.1255-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/3][RFC] avcodec/qtrle: signal duplicate frames as disposable 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: James Almer --- Maybe we could also add an AV_CODEC_CAP_DISPOSABLE_FRAMES capability to lavc and use it on relevant decoders like this one, to let the user know to expect frames with this flag? Although if lavc generic code doesn't do anything different for decoders setting it, then i guess it's superfluous. libavcodec/qtrle.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/libavcodec/qtrle.c b/libavcodec/qtrle.c index 7367f8688d..bf3daf26e1 100644 --- a/libavcodec/qtrle.c +++ b/libavcodec/qtrle.c @@ -453,14 +453,17 @@ static int qtrle_decode_frame(AVCodecContext *avctx, int height, row_ptr; int has_palette = 0; int ret, size; + int drop = 0; bytestream2_init(&s->g, avpkt->data, avpkt->size); if ((ret = ff_reget_buffer(avctx, s->frame)) < 0) return ret; /* check if this frame is even supposed to change */ - if (avpkt->size < 8) + if (avpkt->size < 8) { + drop = 1; goto done; + } /* start after the chunk size */ size = bytestream2_get_be32(&s->g) & 0x3FFFFFFF; @@ -473,14 +476,18 @@ static int qtrle_decode_frame(AVCodecContext *avctx, /* if a header is present, fetch additional decoding parameters */ if (header & 0x0008) { - if (avpkt->size < 14) + if (avpkt->size < 14) { + drop = 1; goto done; + } start_line = bytestream2_get_be16(&s->g); bytestream2_skip(&s->g, 2); height = bytestream2_get_be16(&s->g); bytestream2_skip(&s->g, 2); - if (height > s->avctx->height - start_line) + if (height > s->avctx->height - start_line) { + drop = 1; goto done; + } } else { start_line = 0; height = s->avctx->height; @@ -548,6 +555,8 @@ static int qtrle_decode_frame(AVCodecContext *avctx, done: if ((ret = av_frame_ref(data, s->frame)) < 0) return ret; + if (drop) + ((AVFrame *)data)->flags |= AV_FRAME_FLAG_DISPOSABLE; *got_frame = 1; /* always report that the buffer was completely consumed */