From patchwork Sun Nov 17 23:55:49 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 16309 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 F2028449213 for ; Mon, 18 Nov 2019 03:05:14 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id CC2026880F1; Mon, 18 Nov 2019 03:05:14 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f68.google.com (mail-pj1-f68.google.com [209.85.216.68]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CBF7A687FE0 for ; Mon, 18 Nov 2019 03:05:07 +0200 (EET) Received: by mail-pj1-f68.google.com with SMTP id gc1so970486pjb.8 for ; Sun, 17 Nov 2019 17:05:07 -0800 (PST) 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=KHGfJRBWGgCQFJsuoYJlB3XmyGvKMqk4Pk3nNj9YiCs=; b=EWhuF4yNGOIE21U5MjnYa37ydU3NoCPI4VB7wx/ygjY0yxzACStc8aT822qO3ZzHlS q3sRTTQhM74yqNzMxsP4xh4u8mB6aFuT0jd/vxtjqVSycC4lFBktJ5ziy40dQu0UXERm +Jxg0HV2tcZCRB7n+1wF0X1411qnK9LbXittlwNULedW3v2xA8Y0XZDgmLjTjSJAZU1t R+JDm1E7A36HcLbd2rWy2CoJl8dV19nMyR/kkUJT+rjYDvaHGwdBerLA5PeMCPpXHJcE GeGkM6Cx74B4XgBFmQU4Nt6mj2842GxEFR4r4iUzluHuICF1reV56WewYR0uwt/ATIML VKyA== 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=KHGfJRBWGgCQFJsuoYJlB3XmyGvKMqk4Pk3nNj9YiCs=; b=d0pNk6TbCZqVBYsraFkGaeAK4cgR5cky1jnvkH698E4Ifu2XsjLRGGEnzCiEamScbA mI0F9DbNLRDjuvqi+N4L6whcD8mUgolQ9r67NiNYLS4kt/omkIfz7GFNWYMSozfcSWIa ZCcOx9gQLHGRMzvB+LGMHxIpbkDwDr+DkXx4KmcWEtzTn/WWnKNaoL2A+4dPR1W+HXKV dWRt47VRAFqnkbFafDfYmZFlEWxTSB7XWfMaUwtxMO+rntNadUwG2Jny5S0PJYoAawgu UnaBwVC0Y6a+tlX2wnFOEm4KoEB7jAKN/pKh08yI8x+ZXlre76KgbZ+5ZBKA3LL5jbrf +ARQ== X-Gm-Message-State: APjAAAUegkP8hfTY+sz5AFhgsLMuz9KiwLyQvJl8Z5iYRA1GxKyb8VLp 3Ghccwf24Y6zbKNpq7qsgeWDHhfsAMw= X-Google-Smtp-Source: APXvYqxyyAW+PBZfz9qOusC0AwMo53pUioIEsRyj0/9mUjmdOG2xu3iFgy7FC3T3slue8GGPnAj07A== X-Received: by 2002:a05:6214:8ee:: with SMTP id dr14mr24053363qvb.122.1574034992016; Sun, 17 Nov 2019 15:56:32 -0800 (PST) Received: from localhost.localdomain ([191.84.233.108]) by smtp.gmail.com with ESMTPSA id 80sm5078003qkh.108.2019.11.17.15.56.31 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 17 Nov 2019 15:56:31 -0800 (PST) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Sun, 17 Nov 2019 20:55:49 -0300 Message-Id: <20191117235550.5017-1-jamrial@gmail.com> X-Mailer: git-send-email 2.24.0 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/2] avcodec/cbs_av1: implement missing set_frame_refs() function 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" Defined in Section 7.8 This finishes implementing support for frames using frame_refs_short_signaling. Signed-off-by: James Almer --- libavcodec/cbs_av1_syntax_template.c | 122 ++++++++++++++++++++++++--- 1 file changed, 112 insertions(+), 10 deletions(-) diff --git a/libavcodec/cbs_av1_syntax_template.c b/libavcodec/cbs_av1_syntax_template.c index c843cfa02b..796897ab79 100644 --- a/libavcodec/cbs_av1_syntax_template.c +++ b/libavcodec/cbs_av1_syntax_template.c @@ -339,6 +339,117 @@ static int FUNC(temporal_delimiter_obu)(CodedBitstreamContext *ctx, RWContext *r return 0; } +static int FUNC(set_frame_refs)(CodedBitstreamContext *ctx, RWContext *rw, + AV1RawFrameHeader *current) +{ + CodedBitstreamAV1Context *priv = ctx->priv_data; + const AV1RawSequenceHeader *seq = priv->sequence_header; + static const uint8_t ref_frame_list[AV1_NUM_REF_FRAMES - 2] = { + AV1_REF_FRAME_LAST2, AV1_REF_FRAME_LAST3, AV1_REF_FRAME_BWDREF, + AV1_REF_FRAME_ALTREF2, AV1_REF_FRAME_ALTREF + }; + int8_t ref_frame_idx[AV1_REFS_PER_FRAME], used_frame[AV1_NUM_REF_FRAMES]; + int8_t shifted_order_hints[AV1_NUM_REF_FRAMES]; + int cur_frame_hint, latest_order_hint, earliest_order_hint, ref; + int i, j; + + for (i = 0; i < AV1_REFS_PER_FRAME; i++) + ref_frame_idx[i] = -1; + ref_frame_idx[AV1_REF_FRAME_LAST - AV1_REF_FRAME_LAST] = current->last_frame_idx; + ref_frame_idx[AV1_REF_FRAME_GOLDEN - AV1_REF_FRAME_LAST] = current->golden_frame_idx; + + for (i = 0; i < AV1_NUM_REF_FRAMES; i++) + used_frame[i] = 0; + used_frame[current->last_frame_idx] = 1; + used_frame[current->golden_frame_idx] = 1; + + cur_frame_hint = 1 << (seq->order_hint_bits_minus_1); + for (i = 0; i < AV1_NUM_REF_FRAMES; i++) + shifted_order_hints[i] = cur_frame_hint + + cbs_av1_get_relative_dist(seq, priv->ref[i].order_hint, + current->order_hint); + + latest_order_hint = shifted_order_hints[current->last_frame_idx]; + earliest_order_hint = shifted_order_hints[current->golden_frame_idx]; + + ref = -1; + for (i = 0; i < AV1_NUM_REF_FRAMES; i++) { + int hint = shifted_order_hints[i]; + if (!used_frame[i] && hint >= cur_frame_hint && + (ref < 0 || hint >= latest_order_hint)) { + ref = i; + latest_order_hint = hint; + } + } + if (ref >= 0) { + ref_frame_idx[AV1_REF_FRAME_ALTREF - AV1_REF_FRAME_LAST] = ref; + used_frame[ref] = 1; + } + + ref = -1; + for (i = 0; i < AV1_NUM_REF_FRAMES; i++) { + int hint = shifted_order_hints[i]; + if (!used_frame[i] && hint >= cur_frame_hint && + (ref < 0 || hint < earliest_order_hint)) { + ref = i; + earliest_order_hint = hint; + } + } + if (ref >= 0) { + ref_frame_idx[AV1_REF_FRAME_BWDREF - AV1_REF_FRAME_LAST] = ref; + used_frame[ref] = 1; + } + + ref = -1; + for (i = 0; i < AV1_NUM_REF_FRAMES; i++) { + int hint = shifted_order_hints[i]; + if (!used_frame[i] && hint >= cur_frame_hint && + (ref < 0 || hint < earliest_order_hint)) { + ref = i; + earliest_order_hint = hint; + } + } + if (ref >= 0) { + ref_frame_idx[AV1_REF_FRAME_ALTREF2 - AV1_REF_FRAME_LAST] = ref; + used_frame[ref] = 1; + } + + for (i = 0; i < AV1_REFS_PER_FRAME - 2; i++) { + int ref_frame = ref_frame_list[i]; + if (ref_frame_idx[ref_frame - AV1_REF_FRAME_LAST] < 0 ) { + ref = -1; + for (j = 0; j < AV1_NUM_REF_FRAMES; j++) { + int hint = shifted_order_hints[j]; + if (!used_frame[j] && hint < cur_frame_hint && + (ref < 0 || hint >= latest_order_hint)) { + ref = j; + latest_order_hint = hint; + } + } + if (ref >= 0) { + ref_frame_idx[ref_frame - AV1_REF_FRAME_LAST] = ref; + used_frame[ref] = 1; + } + } + } + + ref = -1; + for (i = 0; i < AV1_NUM_REF_FRAMES; i++) { + int hint = shifted_order_hints[i]; + if (ref < 0 || hint < earliest_order_hint) { + ref = i; + earliest_order_hint = hint; + } + } + for (i = 0; i < AV1_REFS_PER_FRAME; i++) { + if (ref_frame_idx[i] < 0) + ref_frame_idx[i] = ref; + infer(ref_frame_idx[i], ref_frame_idx[i]); + } + + return 0; +} + static int FUNC(superres_params)(CodedBitstreamContext *ctx, RWContext *rw, AV1RawFrameHeader *current) { @@ -1307,16 +1418,7 @@ static int FUNC(uncompressed_header)(CodedBitstreamContext *ctx, RWContext *rw, if (current->frame_refs_short_signaling) { fb(3, last_frame_idx); fb(3, golden_frame_idx); - - for (i = 0; i < AV1_REFS_PER_FRAME; i++) { - if (i == 0) - infer(ref_frame_idx[i], current->last_frame_idx); - else if (i == AV1_REF_FRAME_GOLDEN - - AV1_REF_FRAME_LAST) - infer(ref_frame_idx[i], current->golden_frame_idx); - else - infer(ref_frame_idx[i], -1); - } + CHECK(FUNC(set_frame_refs)(ctx, rw, current)); } }