From patchwork Mon Dec 7 12:55:40 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Linjie Fu X-Patchwork-Id: 24414 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a25:c00a:0:0:0:0:0 with SMTP id c10csp2575404ybf; Mon, 7 Dec 2020 04:56:47 -0800 (PST) X-Google-Smtp-Source: ABdhPJzDMKMRSHK1nVArdGskWOyAJ2p4ypGFhU7VnamBj2/gVgUeJCXjp0/r2vafODAT7y64RHxa X-Received: by 2002:a05:600c:2106:: with SMTP id u6mr18614387wml.4.1607345807609; Mon, 07 Dec 2020 04:56:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1607345807; cv=none; d=google.com; s=arc-20160816; b=QqiWL4ONPHYDKLlG5DFTVaBVjloKFi55ZbAE5Th0/YF5X1dvoUM9Zym3Un/ePOWfew 6uulnAU2zZQ92wcyoCC1O+UpegeYPh89DmoS2zKsG3ieAQuYhOFC0r9382tRzcyY9nMi tj7MA495IXLyCprf737u+xlIis3VsNn5dGd5JNoZXHQar7wZF4cUY9kPHuVOV33zm13v ha5wfuX3QmcKidEtn4Uaj7oWxMH2AUBb7qt0w0vAzspOorsK0+nu/Tbn2dxRqAfJC1oS MBIVE3cwRAa2713UrnWw7H+CRgx6dQiaZljHFrNY9RBh2PBNuBacN6mS/AmCeBH640Pp iC1g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=YF5SUGKvEUqNSF/rG/WZrGIsBLj6y14S62BH1ryOzGU=; b=W7+RsnJ+cVqGQPBtHfDA6TBqoNK1n+clvVRtPgmwbyrQ2mNPl6YxPrMBVXs/XR4J0m sF2tRFys/c/NZjHSQnjsEbzFD18v2lxkeH4nuNDhf2Akf3+/jl/5eN/DtTXTlY0wyUo1 3ymEMYE6pZGFyLBjj4zWYjGJSRayyCd4jk0rd9xEk/8ajzPIOgC3qgiD9qVnOKLjbmTE 10FSXHiRbxrQu/5ErI02Z2+QNLSl4evMivBFNxOB/NkJbjtTIrPv7ZE/7hc0PC65of4K kXbQCNDYIZr0KEw9iPyoebnLOyruzd9xIQdkfBGQBk6MEBBYeEXMm5XCoFnlTb9Bjclw AyfA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=mtmUjrQu; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id n124si10554772wmb.22.2020.12.07.04.56.47; Mon, 07 Dec 2020 04:56:47 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=mtmUjrQu; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 62E2B68A17B; Mon, 7 Dec 2020 14:56:31 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f67.google.com (mail-qv1-f67.google.com [209.85.219.67]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3035F68A141 for ; Mon, 7 Dec 2020 14:56:24 +0200 (EET) Received: by mail-qv1-f67.google.com with SMTP id b18so2881775qvt.10 for ; Mon, 07 Dec 2020 04:56:24 -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 :mime-version:content-transfer-encoding; bh=BtusEg35xRC65GanXSL5Qv2fSCuSNjsCJOc/ZWJ4UuA=; b=mtmUjrQu2yNIaNNGufx8vEX0Md7Rb0qkIxG74uiaDnaqHhWPgYr1k3NcjAHBiX4uiB /YYCP+lNg9xhvbssncQEoFUIikEmDosSv/iZZVlSa+ySEtxhFDyBj6XcmAiZP0Rbfy9L fwVrDS+iHMNe9HYCIWzX8WwA/Nra7d9e8/34+Yjz3QTJqE9y1BiD2Gz0u5BZuFUjtRU9 e+xcOvGZBuhkh55P1FhzXjs+udiunyl0vW4IY4nQonLuu4kMmHm9C1D49b3ZCKb//EFm wrCK91D0wgq2jiEYB+R+LSzfxJ3rsVYoTPJyo6/PIBXw6fIwvw8MTP65j30AwXcz6qsg yc6w== 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:mime-version:content-transfer-encoding; bh=BtusEg35xRC65GanXSL5Qv2fSCuSNjsCJOc/ZWJ4UuA=; b=qBWgRHgo2MliyubSfrE9Qe0HFiMzly/DET0dDMKRQyji0g+sN/0u9trM6bKMV0xh8W R65+Oy4J4ohHQELPXn/pbXk6k0CwNc+OGKUVL5rsflWwSqqOg9jD/GreUvtBqRhLuHhi 0nGJr+NoJscUi+eSl+wQ+vndt7vW1JvlntI9r+fpNYaynUJ39gdxBnz6NEtu2jq17QQ4 9sGgJFAmUTtYWkUwihJ0GJBRNF5avKx7s/FjyZWCWBpV6dNQjwnuOui06uvj8FFA5GkK MGpCWhFrVpmn5YPYRnc07DdD585v/wWSpXyG9GfoP9r5MjuvodSa/fS4c8Ks4rtaLZ9/ RPrA== X-Gm-Message-State: AOAM532R1wqB8xVprpDd5Wlnw9EyNIGJv+3kUT27yHhgDXetQhWll3Na CdVEimOnb7LlxloqUJI1+kiuOiMk/K1xdA== X-Received: by 2002:a0c:e312:: with SMTP id s18mr6883789qvl.60.1607345782591; Mon, 07 Dec 2020 04:56:22 -0800 (PST) Received: from ip-172-31-39-116.us-east-2.compute.internal (ec2-52-14-134-25.us-east-2.compute.amazonaws.com. [52.14.134.25]) by smtp.gmail.com with ESMTPSA id w15sm1638489qta.95.2020.12.07.04.56.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Dec 2020 04:56:21 -0800 (PST) From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Mon, 7 Dec 2020 12:55:40 +0000 Message-Id: <20201207125545.621159-4-linjie.justin.fu@gmail.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20201207125545.621159-1-linjie.justin.fu@gmail.com> References: <20201207125545.621159-1-linjie.justin.fu@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v3 3/8] lavc/hevc_ps: Add pps parse support for HEVC SCC extension 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: Haihao Xiang , Linjie Fu , Linjie Fu Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: 1WSdfR6xE6m7 Content-Length: 8430 From: Linjie Fu Signed-off-by: Linjie Fu Signed-off-by: Haihao Xiang --- libavcodec/hevc_ps.c | 70 +++++++++++++++++++++++++++++++++++++++++++- libavcodec/hevc_ps.h | 17 +++++++++++ 2 files changed, 86 insertions(+), 1 deletion(-) diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c index d65efc1aef..704b666756 100644 --- a/libavcodec/hevc_ps.c +++ b/libavcodec/hevc_ps.c @@ -1400,6 +1400,48 @@ static int pps_range_extensions(GetBitContext *gb, AVCodecContext *avctx, return(0); } +static int pps_scc_extension(GetBitContext *gb, AVCodecContext *avctx, + HEVCPPS *pps, HEVCSPS *sps) +{ + int num_comps; + int i, ret; + + pps->pps_curr_pic_ref_enabled_flag = get_bits1(gb); + if (pps->residual_adaptive_colour_transform_enabled_flag = get_bits1(gb)) { + pps->pps_slice_act_qp_offsets_present_flag = get_bits1(gb); + pps->pps_act_y_qp_offset = get_se_golomb_long(gb) - 5; + pps->pps_act_cb_qp_offset = get_se_golomb_long(gb) - 5; + pps->pps_act_cr_qp_offset = get_se_golomb_long(gb) - 3; + +#define CHECK_QP_OFFSET(name) (pps->pps_act_ ## name ## _qp_offset < -12 || \ + pps->pps_act_ ## name ## _qp_offset > 12) + ret = CHECK_QP_OFFSET(y) || CHECK_QP_OFFSET(cb) || CHECK_QP_OFFSET(cr); +#undef CHECK_QP_OFFSET + if (ret) { + av_log(avctx, AV_LOG_ERROR, + "PpsActQpOffsetY/Cb/Cr shall be in the range of [-12, 12].\n"); + return AVERROR_INVALIDDATA; + } + } + + if (pps->pps_palette_predictor_initializers_present_flag = get_bits1(gb)) { + if ((pps->pps_num_palette_predictor_initializers = get_ue_golomb_long(gb)) > 0) { + pps->monochrome_palette_flag = get_bits1(gb); + pps->luma_bit_depth_entry_minus8 = get_ue_golomb_long(gb); + if (!pps->monochrome_palette_flag) + pps->chroma_bit_depth_entry_minus8 = get_ue_golomb_long(gb); + num_comps = pps->monochrome_palette_flag ? 1 : 3; + for (int comp = 0; comp < num_comps; comp++) + for (i = 0; i < pps->pps_num_palette_predictor_initializers; i++) + pps->pps_palette_predictor_initializer[comp][i] = + get_bits(gb, 8 + (!comp ? pps->luma_bit_depth_entry_minus8 : + pps->chroma_bit_depth_entry_minus8)); + } + } + + return 0; +} + static inline int setup_pps(AVCodecContext *avctx, GetBitContext *gb, HEVCPPS *pps, HEVCSPS *sps) { @@ -1753,11 +1795,37 @@ int ff_hevc_decode_nal_pps(GetBitContext *gb, AVCodecContext *avctx, if (get_bits1(gb)) { // pps_extension_present_flag pps->pps_range_extensions_flag = get_bits1(gb); - skip_bits(gb, 7); // pps_extension_7bits + + /* hevc-conformance-PS_A_VIDYO_3 in fate has pps_multilayer_extension_flag (1), + * pps_3d_extension_flag (1) and pps_scc_extension_flag (1) but has the wrong + * data for pps_multilayer_extension(), pps_3d_extension(), and pps_scc_extension(). + * To avoid regression for hevc-conformance-PS_A_VIDYO_3, here check + * pps_multilayer_extension_flag, pps_3d_extension_flag and pps_scc_extension_flag + * only for SCC streams */ + if (sps->ptl.general_ptl.profile_idc == FF_PROFILE_HEVC_SCC) { + pps->pps_multilayer_extension_flag = get_bits1(gb); + pps->pps_3d_extension_flag = get_bits1(gb); + pps->pps_scc_extension_flag = get_bits1(gb); + skip_bits(gb, 4); // pps_extension_4bits + } else + skip_bits(gb, 7); + if (sps->ptl.general_ptl.profile_idc == FF_PROFILE_HEVC_REXT && pps->pps_range_extensions_flag) { if ((ret = pps_range_extensions(gb, avctx, pps, sps)) < 0) goto err; } + + if (pps->pps_multilayer_extension_flag || pps->pps_3d_extension_flag) { + av_log(avctx, AV_LOG_ERROR, + "multilayer_extension or 3d_extension not yet implemented\n"); + ret = AVERROR_PATCHWELCOME; + goto err; + } + + if (pps->pps_scc_extension_flag) { + if ((ret = pps_scc_extension(gb, avctx, pps, sps)) < 0) + goto err; + } } ret = setup_pps(avctx, gb, pps, sps); diff --git a/libavcodec/hevc_ps.h b/libavcodec/hevc_ps.h index be23758008..155b66062e 100644 --- a/libavcodec/hevc_ps.h +++ b/libavcodec/hevc_ps.h @@ -312,6 +312,9 @@ typedef struct HEVCPPS { uint8_t slice_header_extension_present_flag; uint8_t log2_max_transform_skip_block_size; uint8_t pps_range_extensions_flag; + uint8_t pps_multilayer_extension_flag; + uint8_t pps_3d_extension_flag; + uint8_t pps_scc_extension_flag; uint8_t cross_component_prediction_enabled_flag; uint8_t chroma_qp_offset_list_enabled_flag; uint8_t diff_cu_chroma_qp_offset_depth; @@ -321,6 +324,20 @@ typedef struct HEVCPPS { uint8_t log2_sao_offset_scale_luma; uint8_t log2_sao_offset_scale_chroma; + // SCC extension parameters + uint8_t pps_curr_pic_ref_enabled_flag; + uint8_t residual_adaptive_colour_transform_enabled_flag; + uint8_t pps_slice_act_qp_offsets_present_flag; + int8_t pps_act_y_qp_offset; // _plus5 + int8_t pps_act_cb_qp_offset; // _plus5 + int8_t pps_act_cr_qp_offset; // _plus3 + uint8_t pps_palette_predictor_initializers_present_flag; + uint8_t pps_num_palette_predictor_initializers; + uint8_t monochrome_palette_flag; + uint8_t luma_bit_depth_entry_minus8; + uint8_t chroma_bit_depth_entry_minus8; + uint8_t pps_palette_predictor_initializer[3][HEVC_MAX_PALETTE_PREDICTOR_SIZE]; + // Inferred parameters unsigned int *column_width; ///< ColumnWidth unsigned int *row_height; ///< RowHeight