From patchwork Sat Nov 14 13:43:32 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 23624 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 F40A544A529 for ; Sat, 14 Nov 2020 15:44:11 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D29B968C141; Sat, 14 Nov 2020 15:44:11 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f193.google.com (mail-qk1-f193.google.com [209.85.222.193]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4BB8868C13F for ; Sat, 14 Nov 2020 15:44:05 +0200 (EET) Received: by mail-qk1-f193.google.com with SMTP id y197so12277206qkb.7 for ; Sat, 14 Nov 2020 05:44:05 -0800 (PST) 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=thJMLkjJkEJr+LgaunRpvewkcL7ADQhnCATw5OLvcgk=; b=hfIq2/6HCcs2lyKOcsPEvaKTcoFrQgtSs1bT14YjOuj4DZvykelivoY/K8hwhIVyzB sl9V4VyJwebzNXCQf0sokYAb8LQ9YqLW2d+DykUjMjQns3q8rh8iN0CDTM58lbBzXT8z O9BH9F0lMMJxgjW/iLxP3oJBTDMizVmeN3yM932qDIn9CI0RDWMSpXjjGNAuEADJ/6eW AR4tn+08u2EfvLmXbIFumOpc4FZ517x5DflAv9hLvWgJrebjMVblNpRCc0X9XFI2KV6S 7Uik030J99v3aK4u1hMcPtthY/zXmMW6/LfTeicEKRiMLsLYleFkzARLTPHn3wd5bcw/ AA4A== 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=thJMLkjJkEJr+LgaunRpvewkcL7ADQhnCATw5OLvcgk=; b=oqSNa5d4wvi8//XpJic8LpSRxVrCwbCngM6o8+u04gC6gnF8URmF9ej+BwFIeFKr2Z RpPTfzDki5aPSBIdPSjURRAocX4IuPRT3EjWg8V9zKVqq84Aer4vA/QS6hzMwUGQCkqq dan+rwqB1bBVFz47A0yJzTDEpJ/syT9NnRFCliHAWIyfnc4ydH2Xm28SgW5qLIip2n5q 88RwuH2InkiP6PK8D5ZrPbQooLogVgB/Ucc4YoIKDzLo92UnsaPNOW/b22PVXAzuDLaK m24dhLQZZjR/+D/bUdaO/Ictd4/8C+MXKAPamGuvycxej5kxpqO1Z6JtcX6Q8nncs85Y P+bw== X-Gm-Message-State: AOAM5325Eg4buj+c6wa+++wZdWPbA8JHkFqIt+H/pi+tjCL7131KvQvW 56Mg9yOauJc2G1hxlrvyIL9E1Wge8BTJaQ== X-Google-Smtp-Source: ABdhPJyiIUABC+SekLJsVHXljszQDU2NIzcJkBhLgYW0WPOozTUcoi3CgWPQLCv8rTAmUkFKI0fz+g== X-Received: by 2002:a37:47c2:: with SMTP id u185mr6507473qka.63.1605361443369; Sat, 14 Nov 2020 05:44:03 -0800 (PST) Received: from localhost.localdomain ([181.23.74.184]) by smtp.gmail.com with ESMTPSA id p127sm8445579qkc.37.2020.11.14.05.44.01 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 14 Nov 2020 05:44:02 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Sat, 14 Nov 2020 10:43:32 -0300 Message-Id: <20201114134332.885-2-jamrial@gmail.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201114134332.885-1-jamrial@gmail.com> References: <20201114134332.885-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/2] avcodec/av1dec: derive skip_mode_frame_idx only where it's used 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" No hwaccel other than nvdec cares about this field Signed-off-by: James Almer --- libavcodec/av1dec.c | 78 ------------------------------------------ libavcodec/av1dec.h | 2 -- libavcodec/nvdec_av1.c | 72 +++++++++++++++++++++++++++++++++++--- 3 files changed, 68 insertions(+), 84 deletions(-) diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c index c8f9152451..7999ff6692 100644 --- a/libavcodec/av1dec.c +++ b/libavcodec/av1dec.c @@ -145,78 +145,6 @@ static void global_motion_params(AV1DecContext *s) } } -static int get_relative_dist(const AV1RawSequenceHeader *seq, - unsigned int a, unsigned int b) -{ - unsigned int diff = a - b; - unsigned int m = 1 << seq->order_hint_bits_minus_1; - return (diff & (m - 1)) - (diff & m); -} - -static void skip_mode_params(AV1DecContext *s) -{ - const AV1RawFrameHeader *header = s->raw_frame_header; - const AV1RawSequenceHeader *seq = s->raw_seq; - - int forward_idx, backward_idx; - int forward_hint, backward_hint; - int second_forward_idx, second_forward_hint; - int ref_hint, dist, i; - - if (!header->skip_mode_present) - return; - - forward_idx = -1; - backward_idx = -1; - for (i = 0; i < AV1_REFS_PER_FRAME; i++) { - ref_hint = s->ref[header->ref_frame_idx[i]].raw_frame_header->order_hint; - dist = get_relative_dist(seq, ref_hint, header->order_hint); - if (dist < 0) { - if (forward_idx < 0 || - get_relative_dist(seq, ref_hint, forward_hint) > 0) { - forward_idx = i; - forward_hint = ref_hint; - } - } else if (dist > 0) { - if (backward_idx < 0 || - get_relative_dist(seq, ref_hint, backward_hint) < 0) { - backward_idx = i; - backward_hint = ref_hint; - } - } - } - - if (forward_idx < 0) { - return; - } else if (backward_idx >= 0) { - s->cur_frame.skip_mode_frame_idx[0] = - AV1_REF_FRAME_LAST + FFMIN(forward_idx, backward_idx); - s->cur_frame.skip_mode_frame_idx[1] = - AV1_REF_FRAME_LAST + FFMAX(forward_idx, backward_idx); - return; - } - - second_forward_idx = -1; - for (i = 0; i < AV1_REFS_PER_FRAME; i++) { - ref_hint = s->ref[header->ref_frame_idx[i]].raw_frame_header->order_hint; - if (get_relative_dist(seq, ref_hint, forward_hint) < 0) { - if (second_forward_idx < 0 || - get_relative_dist(seq, ref_hint, second_forward_hint) > 0) { - second_forward_idx = i; - second_forward_hint = ref_hint; - } - } - } - - if (second_forward_idx < 0) - return; - - s->cur_frame.skip_mode_frame_idx[0] = - AV1_REF_FRAME_LAST + FFMIN(forward_idx, second_forward_idx); - s->cur_frame.skip_mode_frame_idx[1] = - AV1_REF_FRAME_LAST + FFMAX(forward_idx, second_forward_idx); -} - static int init_tile_data(AV1DecContext *s) { @@ -415,8 +343,6 @@ static void av1_frame_unref(AVCodecContext *avctx, AV1Frame *f) av_buffer_unref(&f->header_ref); f->raw_frame_header = NULL; f->spatial_id = f->temporal_id = 0; - memset(f->skip_mode_frame_idx, 0, - 2 * sizeof(uint8_t)); } static int av1_frame_ref(AVCodecContext *avctx, AV1Frame *dst, const AV1Frame *src) @@ -448,9 +374,6 @@ static int av1_frame_ref(AVCodecContext *avctx, AV1Frame *dst, const AV1Frame *s memcpy(dst->gm_params, src->gm_params, AV1_NUM_REF_FRAMES * 6 * sizeof(int32_t)); - memcpy(dst->skip_mode_frame_idx, - src->skip_mode_frame_idx, - 2 * sizeof(uint8_t)); return 0; @@ -727,7 +650,6 @@ static int get_current_frame(AVCodecContext *avctx) } global_motion_params(s); - skip_mode_params(s); return ret; } diff --git a/libavcodec/av1dec.h b/libavcodec/av1dec.h index bc6ae68d1a..7f07aa9f7a 100644 --- a/libavcodec/av1dec.h +++ b/libavcodec/av1dec.h @@ -44,8 +44,6 @@ typedef struct AV1Frame { uint8_t gm_type[AV1_NUM_REF_FRAMES]; int32_t gm_params[AV1_NUM_REF_FRAMES][6]; - - uint8_t skip_mode_frame_idx[2]; } AV1Frame; typedef struct TileGroupInfo { diff --git a/libavcodec/nvdec_av1.c b/libavcodec/nvdec_av1.c index 1a553902bc..d1161dd258 100644 --- a/libavcodec/nvdec_av1.c +++ b/libavcodec/nvdec_av1.c @@ -64,6 +64,68 @@ static int get_coded_lossless_param(const AV1DecContext *s) return 1; } +static int get_relative_dist(const AV1RawSequenceHeader *seq, + unsigned int a, unsigned int b) +{ + unsigned int diff = a - b; + unsigned int m = 1 << seq->order_hint_bits_minus_1; + return (diff & (m - 1)) - (diff & m); +} + +static void skip_mode_params(const AV1DecContext *s, uint8_t *skip_mode_frame_idx) +{ + const AV1RawFrameHeader *frame_header = s->raw_frame_header; + const AV1RawSequenceHeader *seq = s->raw_seq; + + int forward_idx = -1, backward_idx = -1; + int forward_hint, backward_hint; + int second_forward_idx, second_forward_hint; + + for (int i = 0; i < AV1_REFS_PER_FRAME; i++) { + int ref_hint = s->ref[frame_header->ref_frame_idx[i]].raw_frame_header->order_hint; + int dist = get_relative_dist(seq, ref_hint, frame_header->order_hint); + if (dist < 0) { + if (forward_idx < 0 || + get_relative_dist(seq, ref_hint, forward_hint) > 0) { + forward_idx = i; + forward_hint = ref_hint; + } + } else if (dist > 0) { + if (backward_idx < 0 || + get_relative_dist(seq, ref_hint, backward_hint) < 0) { + backward_idx = i; + backward_hint = ref_hint; + } + } + } + + if (forward_idx < 0) { + return; + } else if (backward_idx >= 0) { + skip_mode_frame_idx[0] = AV1_REF_FRAME_LAST + FFMIN(forward_idx, backward_idx); + skip_mode_frame_idx[1] = AV1_REF_FRAME_LAST + FFMAX(forward_idx, backward_idx); + return; + } + + second_forward_idx = -1; + for (int i = 0; i < AV1_REFS_PER_FRAME; i++) { + int ref_hint = s->ref[frame_header->ref_frame_idx[i]].raw_frame_header->order_hint; + if (get_relative_dist(seq, ref_hint, forward_hint) < 0) { + if (second_forward_idx < 0 || + get_relative_dist(seq, ref_hint, second_forward_hint) > 0) { + second_forward_idx = i; + second_forward_hint = ref_hint; + } + } + } + + if (second_forward_idx < 0) + return; + + skip_mode_frame_idx[0] = AV1_REF_FRAME_LAST + FFMIN(forward_idx, second_forward_idx); + skip_mode_frame_idx[1] = AV1_REF_FRAME_LAST + FFMAX(forward_idx, second_forward_idx); +} + static int nvdec_av1_start_frame(AVCodecContext *avctx, const uint8_t *buffer, uint32_t size) { const AV1DecContext *s = avctx->priv_data; @@ -78,6 +140,7 @@ static int nvdec_av1_start_frame(AVCodecContext *avctx, const uint8_t *buffer, u AVFrame *cur_frame = s->cur_frame.tf.f; unsigned char remap_lr_type[4] = { AV1_RESTORE_NONE, AV1_RESTORE_SWITCHABLE, AV1_RESTORE_WIENER, AV1_RESTORE_SGRPROJ }; + uint8_t skip_mode_frame_idx[2] = { 0 }; int ret, i, j; @@ -90,6 +153,9 @@ static int nvdec_av1_start_frame(AVCodecContext *avctx, const uint8_t *buffer, u else fg_header = frame_header; + if (frame_header->skip_mode_present) + skip_mode_params(s, skip_mode_frame_idx); + fdd = (FrameDecodeData*)cur_frame->private_ref->data; cf = (NVDECFrame*)fdd->hwaccel_priv; @@ -164,10 +230,8 @@ static int nvdec_av1_start_frame(AVCodecContext *avctx, const uint8_t *buffer, u .cdef_bits = frame_header->cdef_bits, /* SkipModeFrames */ - .SkipModeFrame0 = frame_header->skip_mode_present ? - s->cur_frame.skip_mode_frame_idx[0] : 0, - .SkipModeFrame1 = frame_header->skip_mode_present ? - s->cur_frame.skip_mode_frame_idx[1] : 0, + .SkipModeFrame0 = skip_mode_frame_idx[0], + .SkipModeFrame1 = skip_mode_frame_idx[1], /* QP Information */ .base_qindex = frame_header->base_q_idx,