From patchwork Tue Nov 10 13:42:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Timo Rothenpieler X-Patchwork-Id: 23581 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 31A1B447EB6 for ; Tue, 10 Nov 2020 15:42:59 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 13EDD68BD93; Tue, 10 Nov 2020 15:42:59 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from btbn.de (btbn.de [5.9.118.179]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 86EBA68BCB2 for ; Tue, 10 Nov 2020 15:42:52 +0200 (EET) Received: from Kryux.localdomain (unknown [83.135.85.123]) by btbn.de (Postfix) with ESMTPSA id E86A018BF84; Tue, 10 Nov 2020 14:42:51 +0100 (CET) From: Timo Rothenpieler To: ffmpeg-devel@ffmpeg.org Date: Tue, 10 Nov 2020 14:42:41 +0100 Message-Id: <20201110134241.805-1-timo@rothenpieler.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201109163057.18005-2-timo@rothenpieler.org> References: <20201109163057.18005-2-timo@rothenpieler.org> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 1/4] avcodec/av1dec: expose skip mode frame index 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: Timo Rothenpieler , James Almer Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Timo Rothenpieler Co-authored-by: James Almer --- libavcodec/av1dec.c | 80 +++++++++++++++++++++++++++++++++++++++++++++ libavcodec/av1dec.h | 3 ++ 2 files changed, 83 insertions(+) diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c index 56712279aa..1afed66499 100644 --- a/libavcodec/av1dec.c +++ b/libavcodec/av1dec.c @@ -145,6 +145,78 @@ 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]].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]].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) { @@ -318,6 +390,7 @@ static void av1_frame_unref(AVCodecContext *avctx, AV1Frame *f) av_buffer_unref(&f->hwaccel_priv_buf); f->hwaccel_picture_private = NULL; f->spatial_id = f->temporal_id = 0; + f->order_hint = 0; } static int av1_frame_ref(AVCodecContext *avctx, AV1Frame *dst, const AV1Frame *src) @@ -343,6 +416,10 @@ 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)); + dst->order_hint = src->order_hint; + memcpy(dst->skip_mode_frame_idx, + src->skip_mode_frame_idx, + 2 * sizeof(uint8_t)); return 0; @@ -613,6 +690,7 @@ static int get_current_frame(AVCodecContext *avctx) } global_motion_params(s); + skip_mode_params(s); return ret; } @@ -740,6 +818,8 @@ static int av1_decode_frame(AVCodecContext *avctx, void *frame, s->cur_frame.spatial_id = header->spatial_id; s->cur_frame.temporal_id = header->temporal_id; + s->cur_frame.order_hint = s->raw_frame_header->order_hint; + if (avctx->hwaccel) { ret = avctx->hwaccel->start_frame(avctx, unit->data, unit->data_size); diff --git a/libavcodec/av1dec.h b/libavcodec/av1dec.h index b58bc53961..8cf50f0d59 100644 --- a/libavcodec/av1dec.h +++ b/libavcodec/av1dec.h @@ -41,6 +41,9 @@ typedef struct AV1Frame { uint8_t gm_type[AV1_NUM_REF_FRAMES]; int32_t gm_params[AV1_NUM_REF_FRAMES][6]; + + uint8_t order_hint; + uint8_t skip_mode_frame_idx[2]; } AV1Frame; typedef struct TileGroupInfo { From patchwork Tue Nov 10 13:43:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Timo Rothenpieler X-Patchwork-Id: 23583 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 6210E447EE8 for ; Tue, 10 Nov 2020 15:43:29 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 4712268BDCB; Tue, 10 Nov 2020 15:43:29 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from btbn.de (btbn.de [5.9.118.179]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8A3C768BDC8 for ; Tue, 10 Nov 2020 15:43:23 +0200 (EET) Received: from Kryux.localdomain (unknown [83.135.85.123]) by btbn.de (Postfix) with ESMTPSA id 7B76018BF8E; Tue, 10 Nov 2020 14:43:22 +0100 (CET) From: Timo Rothenpieler To: ffmpeg-devel@ffmpeg.org Date: Tue, 10 Nov 2020 14:43:12 +0100 Message-Id: <20201110134312.892-1-timo@rothenpieler.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201109163057.18005-3-timo@rothenpieler.org> References: <20201109163057.18005-3-timo@rothenpieler.org> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2 2/4] avcodec/av1dec: expose coded_lossless 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: Timo Rothenpieler , James Almer Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Timo Rothenpieler Co-authored-by: James Almer --- libavcodec/av1dec.c | 33 +++++++++++++++++++++++++++++++++ libavcodec/av1dec.h | 2 ++ 2 files changed, 35 insertions(+) diff --git a/libavcodec/av1dec.c b/libavcodec/av1dec.c index 1afed66499..87fd6bb2e3 100644 --- a/libavcodec/av1dec.c +++ b/libavcodec/av1dec.c @@ -217,6 +217,36 @@ static void skip_mode_params(AV1DecContext *s) AV1_REF_FRAME_LAST + FFMAX(forward_idx, second_forward_idx); } +static void coded_lossless_param(AV1DecContext *s) +{ + const AV1RawFrameHeader *header = s->raw_frame_header; + int i; + + if (header->delta_q_y_dc || header->delta_q_u_ac || + header->delta_q_u_dc || header->delta_q_v_ac || + header->delta_q_v_dc) { + s->cur_frame.coded_lossless = 0; + return; + } + + s->cur_frame.coded_lossless = 1; + for (i = 0; i < AV1_MAX_SEGMENTS; i++) { + int qindex; + if (header->feature_enabled[i][AV1_SEG_LVL_ALT_Q]) { + qindex = (header->base_q_idx + + header->feature_value[i][AV1_SEG_LVL_ALT_Q]); + } else { + qindex = header->base_q_idx; + } + qindex = av_clip_uintp2(qindex, 8); + + if (qindex) { + s->cur_frame.coded_lossless = 0; + return; + } + } +} + static int init_tile_data(AV1DecContext *s) { @@ -391,6 +421,7 @@ static void av1_frame_unref(AVCodecContext *avctx, AV1Frame *f) f->hwaccel_picture_private = NULL; f->spatial_id = f->temporal_id = 0; f->order_hint = 0; + f->coded_lossless = 0; } static int av1_frame_ref(AVCodecContext *avctx, AV1Frame *dst, const AV1Frame *src) @@ -410,6 +441,7 @@ static int av1_frame_ref(AVCodecContext *avctx, AV1Frame *dst, const AV1Frame *s dst->spatial_id = src->spatial_id; dst->temporal_id = src->temporal_id; + dst->coded_lossless = src->coded_lossless; memcpy(dst->gm_type, src->gm_type, AV1_NUM_REF_FRAMES * sizeof(uint8_t)); @@ -691,6 +723,7 @@ static int get_current_frame(AVCodecContext *avctx) global_motion_params(s); skip_mode_params(s); + coded_lossless_param(s); return ret; } diff --git a/libavcodec/av1dec.h b/libavcodec/av1dec.h index 8cf50f0d59..bed9376a36 100644 --- a/libavcodec/av1dec.h +++ b/libavcodec/av1dec.h @@ -44,6 +44,8 @@ typedef struct AV1Frame { uint8_t order_hint; uint8_t skip_mode_frame_idx[2]; + + uint8_t coded_lossless; } AV1Frame; typedef struct TileGroupInfo {