From patchwork Sat Feb 9 13:10:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: matthew.w.fearnley@gmail.com X-Patchwork-Id: 12006 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 AE687448563 for ; Sat, 9 Feb 2019 15:20:58 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8CF8668AA79; Sat, 9 Feb 2019 15:20:58 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 903C868A092 for ; Sat, 9 Feb 2019 15:20:52 +0200 (EET) Received: by mail-wm1-f49.google.com with SMTP id y185so9422018wmd.1 for ; Sat, 09 Feb 2019 05:20:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=x/qbpLVFUSpUlOA7fdIYt0jTpT/uS+ce2JuJN6FOJqk=; b=ZgWH21pDkMcCE5BCT91qRyIvg4Kn1c89moeCQmtx2AXlTrRhfTQUVgUsRpPcWqoRMi std69OfX6npgzD4f+WMfeziVsG/TuH5LK9d3b8NBpd5/vktrxRO4sgXhr7ED2cPJBuXx +NsAI4A6Y5pc6dw8eRPZQ4wcFaSwPJn88vQf3OBmgpqjvmk1Rs8FL04zrigQu6qWXCD1 MTgMKpU8FJDsydZdm4G0KtlEVttwKhOvcuccQuVl06r0PkeHPe4UvgTBm/MCQu00x0G1 hRON0MKRXWHL0qOCpig5sljXnKNLvf7lS7TAvj7K8CH0Zqrcn2qJkrLLGzZcfySs92WY X4Zw== 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; bh=x/qbpLVFUSpUlOA7fdIYt0jTpT/uS+ce2JuJN6FOJqk=; b=XyBq/O62P5E1vShgODrQitGfHmq0HFMm4pzIGgtMdO4SiLTwDp27+ffSdWmQIrNFIX +PHL/FYbuZZOCFhphhovtOnAYso/AiOKXuCvVaz/cC1iLPtdsO9VQNnfZTi3ss8ela2X A2jsyTZFU0btpfDgbmEJoHhh3D6bBYDB8PxlE0tlExcE5NvwTee8dRM3CoFAoq23e1G4 Vu72H1IW//t08lP3ktw6WarOdZWR7Lpt0Zg9/pcxcM++PfUsVRu4oI5tpHa0TeF/sl/8 S+UwHKxisiRPGAvrNKGqQKNF8rPcXItYCPa9tln8AE0bU76Gc7pJdRhPd4xSyfZTM/zL 0wZg== X-Gm-Message-State: AHQUAuaDRjfLL1YtWYGqfcfc44Jfyf4tKQ3enOvQff+AnIHfmm6TXc8U cK2Fg/7OxzRCvYjqcD18n4Zl+1Kl X-Google-Smtp-Source: AHgI3IZXK/mwHcTXBuIO5k2YjA4zHNMe9c1qLtrmNGUaJoTjnoqaWvVn5sUFDxF8Y9BUBLzb3i5nLQ== X-Received: by 2002:adf:ecc4:: with SMTP id s4mr10884692wro.286.1549717961458; Sat, 09 Feb 2019 05:12:41 -0800 (PST) Received: from localhost.localdomain (cpc131498-bagu18-2-0-cust88.know.cable.virginm.net. [86.9.33.89]) by smtp.gmail.com with ESMTPSA id u25sm8878557wml.31.2019.02.09.05.12.40 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 09 Feb 2019 05:12:40 -0800 (PST) From: Matthew Fearnley To: ffmpeg-devel@ffmpeg.org Date: Sat, 9 Feb 2019 13:10:20 +0000 Message-Id: <20190209131021.9959-1-matthew.w.fearnley@gmail.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH 1/2] libavcodec/zmbvenc: block scoring improvements/bug fixes 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: Matthew Fearnley MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" - Improve block choices by counting 0-bytes in the entropy score - Make histogram use uint16_t type, to allow byte counts from 16*16 (current block size) up to 255*255 (maximum allowed 8bpp block size) - Make sure score table is big enough for a full block's worth of bytes - Calculate *xored without using code in inner loop --- libavcodec/zmbvenc.c | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/libavcodec/zmbvenc.c b/libavcodec/zmbvenc.c index 4d9147657d..3df6e724c8 100644 --- a/libavcodec/zmbvenc.c +++ b/libavcodec/zmbvenc.c @@ -55,7 +55,7 @@ typedef struct ZmbvEncContext { int keyint, curfrm; z_stream zstream; - int score_tab[256]; + int score_tab[ZMBV_BLOCK * ZMBV_BLOCK + 1]; } ZmbvEncContext; @@ -69,20 +69,26 @@ static inline int block_cmp(ZmbvEncContext *c, uint8_t *src, int stride, { int sum = 0; int i, j; - uint8_t histogram[256] = {0}; + uint16_t histogram[256] = {0}; - *xored = 0; + /* Build frequency histogram of byte values for src[] ^ src2[] */ for(j = 0; j < bh; j++){ for(i = 0; i < bw; i++){ int t = src[i] ^ src2[i]; histogram[t]++; - *xored |= t; } src += stride; src2 += stride2; } - for(i = 1; i < 256; i++) + /* If not all the xored values were 0, then the blocks are different */ + *xored = (histogram[0] < bw * bh); + + /* Exit early if blocks are equal */ + if (!*xored) return 0; + + /* Sum the entropy of all values */ + for(i = 0; i < 256; i++) sum += c->score_tab[histogram[i]]; return sum; @@ -278,7 +284,11 @@ static av_cold int encode_init(AVCodecContext *avctx) int i; int lvl = 9; - for(i=1; i<256; i++) + /* Entropy-based score tables for comparing blocks. + * Suitable for blocks up to (ZMBV_BLOCK * ZMBV_BLOCK) bytes. + * Scores are nonnegative, lower is better. + */ + for(i = 1; i <= ZMBV_BLOCK * ZMBV_BLOCK; i++) c->score_tab[i] = -i * log2(i / (double)(ZMBV_BLOCK * ZMBV_BLOCK)) * 256; c->avctx = avctx;