From patchwork Sun Nov 15 02:36:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Guangxin Xu X-Patchwork-Id: 23639 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 7851444A3D2 for ; Sun, 15 Nov 2020 04:36:52 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 48F7168B32D; Sun, 15 Nov 2020 04:36:52 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pj1-f41.google.com (mail-pj1-f41.google.com [209.85.216.41]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F0D4168AA64 for ; Sun, 15 Nov 2020 04:36:45 +0200 (EET) Received: by mail-pj1-f41.google.com with SMTP id r9so2200198pjl.5 for ; Sat, 14 Nov 2020 18:36:45 -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:in-reply-to:references; bh=ZWrtwRqiuja6m05b3tckkJUWt45WJKgov9oTm3Apz9g=; b=nbrO6Z9La9X9U9ftcDRv59eZfz1+l+tSzAstDJkngIpP2MVrto/HqkSqwq5FR0jb3S SuaZB6zTvj4/wSjT5hDSfO3CUWoE6H3H9oATouG+YnQyYZhBMxxmFoXZlwJKCAgn36WV /ji9SWdzX9rVAOXkVVep8hqL+hZ/Khzse+DOveY9uGOUr1rczTCKqjaICYR6VeHry+0g sRLDf4qD6SK08J1SqdJpEjr4TMLDzV2F6vXiCm0hpKhq3sbsA6XbscRxdDSIo1Xf3x/G KO0+jJDTPB/eZ02wqA7TVwVNV/gbdlW/5u9vZgt1Q6mYDlGk3XVNUWy8KHWpLFnCK44i Aimg== 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:in-reply-to :references; bh=ZWrtwRqiuja6m05b3tckkJUWt45WJKgov9oTm3Apz9g=; b=WpTvZD9CyMWoJm8wL4qSxK3W4H2OFm8AtcD2uS8z5P9n3mRywgAjs0diLtS3lVjqh/ L6WthV60OWmnxKU4ro/dX8I4aXlb1dU5tbPxNt6sw57NzTbrEdq/CK4eeZkhdxicF3L6 hf5uPV6VFLFQ0DYFVz39HXgJTxLDui5ie5VIo1kwPeW5WcxU7vrUrAS2uXIsvfX8qfkW fUmKJ2flt9xUY1VixQVZq7XKvNY9OTedOqojoXf/7bNn3a9T0YAG47zkOYZhu+bXSfkK 13w3jwaDSvYHQxZfMCodMBMuWVyPgt3ud/rYvf+9w3OLgzRgXw5WDZunIZeyoxlv/9gH nhOw== X-Gm-Message-State: AOAM531ldvd05mNutbTwqAPNtwliY96tdDC+jNIi1pkNGIlo96rTnjPD QU7TonbFoMjTQTgvGudXAIaqdXSZ+vWyFQ== X-Google-Smtp-Source: ABdhPJzvONQKQO+gMFEJlFrwc07FQFhB0jJL2NeQt6cqpfgBV/W9fs6KgT9F+CSKmUEx1e8O4LclnA== X-Received: by 2002:a17:902:c281:b029:d7:ce5d:6406 with SMTP id i1-20020a170902c281b02900d7ce5d6406mr7909993pld.35.1605407803646; Sat, 14 Nov 2020 18:36:43 -0800 (PST) Received: from localhost (23.83.245.51.16clouds.com. [23.83.245.51]) by smtp.gmail.com with ESMTPSA id 194sm14379709pfa.15.2020.11.14.18.36.41 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Sat, 14 Nov 2020 18:36:42 -0800 (PST) From: Xu Guangxin To: ffmpeg-devel@ffmpeg.org Date: Sun, 15 Nov 2020 10:36:22 +0800 Message-Id: <20201115023622.17605-1-oddstone@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: Subject: [FFmpeg-devel] [PATCH v2] avcodec/hevcdec: fix stat_coeff save/load for persistent_rice_adaptation_enabled_flag 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: christophe.gisquet@gmail.com, michaelni@gmx.at, Xu Guangxin MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" It's required by the 9.3.1 TableStatCoeff* section. Following clips have this feature: WPP_HIGH_TP_444_8BIT_RExt_Apple_2.bit Bitdepth_A_RExt_Sony_1.bin Bitdepth_B_RExt_Sony_1.bin EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_10BIT_RExt_Sony_1.bit EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_12BIT_RExt_Sony_1.bit EXTPREC_HIGHTHROUGHPUT_444_16_INTRA_8BIT_RExt_Sony_1.bit EXTPREC_MAIN_444_16_INTRA_10BIT_RExt_Sony_1.bit EXTPREC_MAIN_444_16_INTRA_12BIT_RExt_Sony_1.bit EXTPREC_MAIN_444_16_INTRA_8BIT_RExt_Sony_1.bit WPP_AND_TILE_10Bit422Test_HIGH_TP_444_10BIT_RExt_Apple_2.bit WPP_AND_TILE_AND_CABAC_BYPASS_ALIGN_0_HIGH_TP_444_14BIT_RExt_Apple_2.bit WPP_AND_TILE_AND_CABAC_BYPASS_ALIGN_1_HIGH_TP_444_14BIT_RExt_Apple_2.bit WPP_AND_TILE_HIGH_TP_444_8BIT_RExt_Apple_2.bit you can download them from: https://www.itu.int/wftp3/av-arch/jctvc-site/bitstream_exchange/draft_conformance/RExt/ Signed-off-by: Xu Guangxin --- libavcodec/hevc_cabac.c | 15 +++++++++++---- libavcodec/hevcdec.c | 4 ++-- libavcodec/hevcdec.h | 6 ++++-- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/libavcodec/hevc_cabac.c b/libavcodec/hevc_cabac.c index 3dc0987dad..93fc1ec795 100644 --- a/libavcodec/hevc_cabac.c +++ b/libavcodec/hevc_cabac.c @@ -454,12 +454,19 @@ void ff_hevc_save_states(HEVCContext *s, int ctb_addr_ts) (s->ps.sps->ctb_width == 2 && ctb_addr_ts % s->ps.sps->ctb_width == 0))) { memcpy(s->cabac_state, s->HEVClc->cabac_state, HEVC_CONTEXTS); + if (s->ps.sps->persistent_rice_adaptation_enabled_flag) { + memcpy(s->stat_coeff, s->HEVClc->stat_coeff, HEVC_STAT_COEFFS); + } } } -static void load_states(HEVCContext *s) +static void load_states(HEVCContext *s, int thread) { memcpy(s->HEVClc->cabac_state, s->cabac_state, HEVC_CONTEXTS); + if (s->ps.sps->persistent_rice_adaptation_enabled_flag) { + const HEVCContext *prev = s->sList[(thread + s->threads_number - 1) % s->threads_number]; + memcpy(s->HEVClc->stat_coeff, prev->stat_coeff, HEVC_STAT_COEFFS); + } } static int cabac_reinit(HEVCLocalContext *lc) @@ -501,7 +508,7 @@ static void cabac_init_state(HEVCContext *s) s->HEVClc->stat_coeff[i] = 0; } -int ff_hevc_cabac_init(HEVCContext *s, int ctb_addr_ts) +int ff_hevc_cabac_init(HEVCContext *s, int ctb_addr_ts, int thread) { if (ctb_addr_ts == s->ps.pps->ctb_addr_rs_to_ts[s->sh.slice_ctb_addr_rs]) { int ret = cabac_init_decoder(s); @@ -518,7 +525,7 @@ int ff_hevc_cabac_init(HEVCContext *s, int ctb_addr_ts) if (s->ps.sps->ctb_width == 1) cabac_init_state(s); else if (s->sh.dependent_slice_segment_flag == 1) - load_states(s); + load_states(s, thread); } } } else { @@ -549,7 +556,7 @@ int ff_hevc_cabac_init(HEVCContext *s, int ctb_addr_ts) if (s->ps.sps->ctb_width == 1) cabac_init_state(s); else - load_states(s); + load_states(s, thread); } } } diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index 699c13bbcc..7191fcf542 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -2473,7 +2473,7 @@ static int hls_decode_entry(AVCodecContext *avctxt, void *isFilterThread) y_ctb = (ctb_addr_rs / ((s->ps.sps->width + ctb_size - 1) >> s->ps.sps->log2_ctb_size)) << s->ps.sps->log2_ctb_size; hls_decode_neighbour(s, x_ctb, y_ctb, ctb_addr_ts); - ret = ff_hevc_cabac_init(s, ctb_addr_ts); + ret = ff_hevc_cabac_init(s, ctb_addr_ts, 0); if (ret < 0) { s->tab_slice_address[ctb_addr_rs] = -1; return ret; @@ -2551,7 +2551,7 @@ static int hls_decode_entry_wpp(AVCodecContext *avctxt, void *input_ctb_row, int return 0; } - ret = ff_hevc_cabac_init(s, ctb_addr_ts); + ret = ff_hevc_cabac_init(s, ctb_addr_ts, thread); if (ret < 0) goto error; hls_sao_param(s, x_ctb >> s->ps.sps->log2_ctb_size, y_ctb >> s->ps.sps->log2_ctb_size); diff --git a/libavcodec/hevcdec.h b/libavcodec/hevcdec.h index 39c5c7f89f..5b49384aea 100644 --- a/libavcodec/hevcdec.h +++ b/libavcodec/hevcdec.h @@ -53,6 +53,7 @@ #define DEFAULT_INTRA_TC_OFFSET 2 #define HEVC_CONTEXTS 199 +#define HEVC_STAT_COEFFS 4 #define MRG_MAX_NUM_CANDS 5 @@ -424,7 +425,7 @@ typedef struct HEVCFrame { typedef struct HEVCLocalContext { uint8_t cabac_state[HEVC_CONTEXTS]; - uint8_t stat_coeff[4]; + uint8_t stat_coeff[HEVC_STAT_COEFFS]; uint8_t first_qp_group; @@ -480,6 +481,7 @@ typedef struct HEVCContext { int height; uint8_t *cabac_state; + uint8_t stat_coeff[HEVC_STAT_COEFFS]; /** 1 if the independent slice segment header was successfully parsed */ uint8_t slice_initialized; @@ -594,7 +596,7 @@ int ff_hevc_frame_rps(HEVCContext *s); int ff_hevc_slice_rpl(HEVCContext *s); void ff_hevc_save_states(HEVCContext *s, int ctb_addr_ts); -int ff_hevc_cabac_init(HEVCContext *s, int ctb_addr_ts); +int ff_hevc_cabac_init(HEVCContext *s, int ctb_addr_ts, int thread); int ff_hevc_sao_merge_flag_decode(HEVCContext *s); int ff_hevc_sao_type_idx_decode(HEVCContext *s); int ff_hevc_sao_band_position_decode(HEVCContext *s);