From patchwork Mon Aug 26 19:02:14 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 14722 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 DB264447BAB for ; Mon, 26 Aug 2019 22:02:59 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id B61AF68AD26; Mon, 26 Aug 2019 22:02:59 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt1-f172.google.com (mail-qt1-f172.google.com [209.85.160.172]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 115BC68AC1D for ; Mon, 26 Aug 2019 22:02:54 +0300 (EEST) Received: by mail-qt1-f172.google.com with SMTP id q4so19001747qtp.1 for ; Mon, 26 Aug 2019 12:02:54 -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=5ydDRTskovmxVfwp+BKIdXZi6wGOK7x8aqjCRxXV9Qo=; b=iKWGaVx1KJdo4wri4I/C43qBSVDlPFYhHnM5tf7grOzuxjZOZvEGtRSg26efNK7Akg GAFVqxVnyagVQ/X8YhTnKvgm12qv4GVqUesvvvS5NcLqHUs6HGLfhDw3OJyiVtTwD8hW exvoBZCGsrOP/CB8YSqtvvz61+86OqREqlNqpg45tpODxG7mzGOmDY8d9rkTXnuGl2cV MonYRgc8Vv0T2nHojMeWUFF3FT5ZYlGOwHQHbDeiiaikBgJgMNj1Z4LNbU7BwE6RwoHv JfRCsCMNMIEgusLusfNYRj1Av12OxzbVOgDJeE0nWIlV0ZAIlTW/xYLc2qeRXb7Ek3lQ Of0A== 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=5ydDRTskovmxVfwp+BKIdXZi6wGOK7x8aqjCRxXV9Qo=; b=L0KVXRgbURJPTZMe7yVKG+yLP+w/9ZicU5y1owiocTauGTEmM5VJPPKJ8gBMQ1CY7T pBL/5Gy3d4T3T1bdy7kAqFfRN3/oFGB/P29nyUP5fTgO0cUVfVHJU7e+6UfNDiqj8J0A f5RDpoX+1YP1U6NMOEQg34cBES5fTgaTdgyQvq2YUziU4CH6/zInzSWzQktBSqQBWoj5 Oln/QkfZx9ERsP5d2iuE4oFHOJsxOQcZRzBNWiyFQ6IeQV/YWLK8uQFNudiGnv0I3BKm rMRnpWfjDwqTATnSJhSf3//8X32vyf7ySVg6nycmJ+8l+IRVRp9N/1FrZfuG70vq0iC5 Qwog== X-Gm-Message-State: APjAAAXLypS+IQhYqu2PFDkn6XXHTIlI02noKqg5wHFcdQVt94WVJRWR kyk7GAtQVL1KpIKv5MjIhQRGwNcw X-Google-Smtp-Source: APXvYqw796XTIb/uCGU3P3gnnLQt+VLvAAt0gC/J2fH0lDLGQC/f02Ik+QJ/htS1dh/qRL/QVCIItA== X-Received: by 2002:ac8:2c18:: with SMTP id d24mr18825943qta.292.1566846172334; Mon, 26 Aug 2019 12:02:52 -0700 (PDT) Received: from localhost.localdomain ([181.23.84.150]) by smtp.gmail.com with ESMTPSA id h13sm6591635qkk.12.2019.08.26.12.02.51 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 26 Aug 2019 12:02:51 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Mon, 26 Aug 2019 16:02:14 -0300 Message-Id: <20190826190214.5791-1-jamrial@gmail.com> X-Mailer: git-send-email 2.22.0 In-Reply-To: <20190826173656.5302-1-jamrial@gmail.com> References: <20190826173656.5302-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/3 v2][RFC] avcodec/qtrle: call ff_reget_buffer() only when the picture data is going to change 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" ff_reget_buffer() will attempt to create a writable copy of the frame, which is not needed when the decoder intends to return a reference to the same buffer as the previous frame. Should reduce data copy, hopefully achieving a similar speed up as a9dacdeea6168787a142209bd19fdd74aefc9dd6 without dropping frames. Signed-off-by: James Almer --- Now ensuring there's a previous frame available to reuse. libavcodec/qtrle.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/libavcodec/qtrle.c b/libavcodec/qtrle.c index bf3daf26e1..edfbef7f28 100644 --- a/libavcodec/qtrle.c +++ b/libavcodec/qtrle.c @@ -456,8 +456,6 @@ static int qtrle_decode_frame(AVCodecContext *avctx, 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) { @@ -492,6 +490,9 @@ static int qtrle_decode_frame(AVCodecContext *avctx, start_line = 0; height = s->avctx->height; } + if ((ret = ff_reget_buffer(avctx, s->frame)) < 0) + return ret; + row_ptr = s->frame->linesize[0] * start_line; switch (avctx->bits_per_coded_sample) { @@ -553,6 +554,15 @@ static int qtrle_decode_frame(AVCodecContext *avctx, } done: + if (!s->frame->data[0]) + return AVERROR_INVALIDDATA; + if (drop) { + // ff_reget_buffer() isn't needed when frames don't change, so just update + // frame props. + ret = ff_decode_frame_props(avctx, s->frame); + if (ret < 0) + return ret; + } if ((ret = av_frame_ref(data, s->frame)) < 0) return ret; if (drop)