From patchwork Fri Oct 16 02:54:00 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 22990 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 18C9244982E for ; Fri, 16 Oct 2020 06:00:50 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E119B68B648; Fri, 16 Oct 2020 06:00:49 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f66.google.com (mail-pj1-f66.google.com [209.85.216.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 89BF668B21C for ; Fri, 16 Oct 2020 06:00:41 +0300 (EEST) Received: by mail-pj1-f66.google.com with SMTP id h4so625636pjk.0 for ; Thu, 15 Oct 2020 20:00:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=q8fWQh/K0hzGzx9wZ90i/lfb2IwG5spYVs1y4n7roFQ=; b=t+DPKPEn2XynUQjEAzQBKG+w2DIRso5loBKe+muPtD1aW/NGourOJqmed1le7jKYmD h015GCIexpg7G7z/hPYK6XfTpsqIqNqz8s/C4fa82cTKTbaca9AeU7aWZ7NQlIWoRLc+ 4CBuYMlxZVIHQ/Ibps4Yk31YPmx9/NWb2dg2Ww69djpjb8FiOMChYZ7onEK2mDpYUlsC at/sHuamfkDSTpJLWr2OodjFW8KpgxXnNDPJoO1Et2J1gEM4qD76zDQQtaZS/IEjg/+s lpHkJDPiDmmtJSvVkt3Dr1JTfgDhVt5Upon2lL40kWD0Vc8w/iSDPHbOKZlfCwsAjXDl NkVw== 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:mime-version :content-transfer-encoding; bh=q8fWQh/K0hzGzx9wZ90i/lfb2IwG5spYVs1y4n7roFQ=; b=QCt/LnnSh6siPD6xjH+jN1bxNcsk62BL2WpJq3V93a4A4qo/5canI8xFxeV2o1He1q n72Z2rY/+PyW/RAz65xAaekpJl/15IdEZYYUtav9XzaiONmeo4DgKcvwTFrI2jVH7yMo cmT36yjNbOEp09P5D3BXRTLgIRdBKu7XIA4HOx488/XR7tzIxI0UA6n8LSz+IDMtd+Y0 bgI22Cmdt+ZTtyW2B/8tmh2gK5a0f5JdmVNZk/0/ELMOX0F05ogNOMiOAJeshxkn5agU zne6ibJ7kBlEylQAxElIKIYb1Duwuv8eocj/Zbx+sUV8jZtbQvFlf6tHiqVwfIWydAGB XNPQ== X-Gm-Message-State: AOAM533EQtt5TP7C06gHqNjO+38nryEnZSta2M7AQkMXE8bKoTUQIK8Z RtR11Dr9MQG2O1Yh4guIl+o/706rUGk= X-Google-Smtp-Source: ABdhPJwvYJkKxmkHzvbfwpPvk0ggvKam4npUtk2y9p8p+8/9rZ+AqNqVaF3KA8/A9tKjlyfd0WoTYg== X-Received: by 2002:a05:6214:14b4:: with SMTP id bo20mr2011526qvb.24.1602816867543; Thu, 15 Oct 2020 19:54:27 -0700 (PDT) Received: from localhost.localdomain ([181.23.86.134]) by smtp.gmail.com with ESMTPSA id k64sm365715qkc.97.2020.10.15.19.54.25 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 15 Oct 2020 19:54:26 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Thu, 15 Oct 2020 23:54:00 -0300 Message-Id: <20201016025400.23001-1-jamrial@gmail.com> X-Mailer: git-send-email 2.28.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avcodec/av1dec: always update frame loop filter deltas using bitstream values 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" Frames with primary_ref_frame == AV1_PRIMARY_REF_NONE can also have values for loop_filter_ref_deltas and loop_filter_mode_deltas coded in the bitstream that must overwrite the initial values if present. Signed-off-by: James Almer --- libavcodec/av1dec.c | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c index 6d00754fcb..67ae02a1f8 100644 --- a/libavcodec/av1dec.c +++ b/libavcodec/av1dec.c @@ -26,8 +26,25 @@ #include "internal.h" #include "profiles.h" -static void setup_past_independence(AV1Frame *f) +static void loop_filter_delta_update(AV1DecContext *s) { + for (int i = 0; i < AV1_TOTAL_REFS_PER_FRAME; i++) { + if (s->raw_frame_header->update_ref_delta[i]) + s->cur_frame.loop_filter_ref_deltas[i] = + s->raw_frame_header->loop_filter_ref_deltas[i]; + } + + for (int i = 0; i < 2; i++) { + if (s->raw_frame_header->update_mode_delta[i]) + s->cur_frame.loop_filter_mode_deltas[i] = + s->raw_frame_header->loop_filter_mode_deltas[i]; + } +} + +static void setup_past_independence_and_update(AV1DecContext *s) +{ + AV1Frame *f = &s->cur_frame; + f->loop_filter_delta_enabled = 1; f->loop_filter_ref_deltas[AV1_REF_FRAME_INTRA] = 1; @@ -41,6 +58,12 @@ static void setup_past_independence(AV1Frame *f) f->loop_filter_mode_deltas[0] = 0; f->loop_filter_mode_deltas[1] = 0; + + f->loop_filter_delta_enabled = + s->raw_frame_header->loop_filter_delta_enabled; + + if (s->raw_frame_header->loop_filter_delta_update) + loop_filter_delta_update(s); } static void load_previous_and_update(AV1DecContext *s) @@ -56,22 +79,11 @@ static void load_previous_and_update(AV1DecContext *s) s->ref[prev_frame].loop_filter_mode_deltas, 2 * sizeof(int8_t)); - if (s->raw_frame_header->loop_filter_delta_update) { - for (int i = 0; i < AV1_NUM_REF_FRAMES; i++) { - if (s->raw_frame_header->update_ref_delta[i]) - s->cur_frame.loop_filter_ref_deltas[i] = - s->raw_frame_header->loop_filter_ref_deltas[i]; - } - - for (int i = 0; i < 2; i++) { - if (s->raw_frame_header->update_mode_delta[i]) - s->cur_frame.loop_filter_mode_deltas[i] = - s->raw_frame_header->loop_filter_mode_deltas[i]; - } - } - s->cur_frame.loop_filter_delta_enabled = s->raw_frame_header->loop_filter_delta_enabled; + + if (s->raw_frame_header->loop_filter_delta_update) + loop_filter_delta_update(s); } static uint32_t inverse_recenter(int r, uint32_t v) @@ -643,7 +655,7 @@ static int get_current_frame(AVCodecContext *avctx) } if (s->raw_frame_header->primary_ref_frame == AV1_PRIMARY_REF_NONE) - setup_past_independence(&s->cur_frame); + setup_past_independence_and_update(s); else load_previous_and_update(s);