From patchwork Mon Dec 7 12:55:39 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Linjie Fu X-Patchwork-Id: 24417 Delivered-To: andriy.gelman@gmail.com Received: by 2002:a25:c00a:0:0:0:0:0 with SMTP id c10csp2575319ybf; Mon, 7 Dec 2020 04:56:37 -0800 (PST) X-Google-Smtp-Source: ABdhPJzzPtWWKbhhZ0tBG00TMC0kt+R97YlqJf/+LmCbrjU6lLbc78YszWvT1W+mTv9bG9Nhvvwn X-Received: by 2002:a5d:4cd1:: with SMTP id c17mr3074091wrt.49.1607345797693; Mon, 07 Dec 2020 04:56:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1607345797; cv=none; d=google.com; s=arc-20160816; b=NKmXfE1K5JUScjuG1xyChcDgBHwuGzNwqOPJYyicnhGVNwY0qbegNgAqapymXNfKj8 oa6sRn+iz4FoZUKQT5fPBnq1dfiqF+/BqEgyfJQqxH/PG/Bq8DN2bqptwyMBtZ4nfFzD TboR2/i/JCk8EeQ2tKfqU8LonFEsn2HK0hU1eaaRlep/ukDiZXoyehcIXlCKG+3zm2mE RyZ2xCPCxmu4J1nSuVqD89TTDvg+l3i7kCtFHfe/sf5AijnL1CE0t7wnWFQHM/CmfXDr 1vbytBC2/rYkNDhc9YIhC1FDA/UGesx2qRwBdKGW17gxnUR6F35te0AjkjdobXqRRMF8 Ma7Q== 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=o7qTR/13l+FEluJnnk1ZX3NKzV4a9X6OzqUrEMqnnac=; b=qrKo17Gf96+fU8TfnsgP3BT1ZnGf49YgXz7RQa+5jkX10iUTohx4tBGp2XEc8fcExQ 3nu9gNgalg+9bKEOKHd0YKMSZmU+Y4k9GqvuiORpiJS5gTBMmR5MNN7ovVrag+EWaruJ 1k4as/rYWVXB3+ZOORkWAQJz0fOQ9p7VDT21Cg8uO9MoN5vqPf05a+IEEKYYTP1BXz+/ Z7byS6CSMH94xibOBxvdYSckZckMSfHgDILdAXjfzapLEVGYqduIiqBaaN0QryAnv8/1 hoJYUxcwZGtxJndMz//mEZVlKxaHkYEOqnlmpI+eQHHmShbKC7qaYQkDOWPLuCq83dMz Fbnw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=RZ3pkt9d; 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 s70si10690602wme.158.2020.12.07.04.56.35; Mon, 07 Dec 2020 04:56:37 -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=RZ3pkt9d; 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 201DE68A13C; Mon, 7 Dec 2020 14:56:29 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qv1-f66.google.com (mail-qv1-f66.google.com [209.85.219.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7E27C689A0D for ; Mon, 7 Dec 2020 14:56:21 +0200 (EET) Received: by mail-qv1-f66.google.com with SMTP id 4so6417542qvh.1 for ; Mon, 07 Dec 2020 04:56:21 -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=4W91JjwnkBF2PfS58fwQDCU7JKg6xjzEEy62UGlNdYc=; b=RZ3pkt9d/FTyZVrsVHoZJ4LZPoa68IqBqsnHfhqxewyoR1pjQtdE6lnEs/kaZFFu5W xrHua1/Q56XgmACrixxxLpvN9NgKWPAc0cjX51TUCqiP/U2Y8ZzETjRfZ6yMJqMkBmQU 3/lMVoeun3Jt22/Cmn0Q7be+SsN7HELHBs8yxRF30Zt2LfokZZr8I1G9g/VDxXTaStn3 QgGRYn6xfQtEk4hYV8PxO2ly5Oc+DTPWU2T6T9bUcOggc8Ny62dI4PEdeRAXR1XgpGPk GyDt1tOLg2ns7PbIMKHJ97s3LDY5vrOOyiCZwPlNlzo6nzk1xiGyWxeeReP7gDcqu0qe 3kQw== 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=4W91JjwnkBF2PfS58fwQDCU7JKg6xjzEEy62UGlNdYc=; b=tuwjurlHWv5UD+CZTpAAGSFhRz0QEV3JBk0CmKdO6cfPOFt5ZJeAKpCqbEAEHRgVrp UyFad80NJtfajbjVoZ4TjjHwRUs7k9ufK5qyh6UywriKIJkMNfAdyzmrvF3CjJcFlx7o PhAkqDaazq08EXjqoLx/RrfCXmKahqnpzw523ZGorjys5Lu3/l07oMY9OCG4cdwtStzs oPjpsAfTSZ7MsGiN/zaJiDvEV5S9howlka+vV0Cw4CC6ayIM9FipZQOgLMy/UTiihmud PeYpDkBr9fuVuNdXNmoBPPtLX7JCn8BquGBfpIO9VfJHEq5WpAbxEbuj4CP2XS3awi78 2nUA== X-Gm-Message-State: AOAM533AzvAazc7aYs0HYtQPtocp+Jhg+AtPfgmkPUJ/9DJ+b3bjuMeu xwvsdFJ3iLfb0DiZjQHLV/KTerV/MnhHcA== X-Received: by 2002:a0c:f981:: with SMTP id t1mr21013085qvn.60.1607345779706; Mon, 07 Dec 2020 04:56:19 -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.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Dec 2020 04:56:18 -0800 (PST) From: Linjie Fu To: ffmpeg-devel@ffmpeg.org Date: Mon, 7 Dec 2020 12:55:39 +0000 Message-Id: <20201207125545.621159-3-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 2/8] lavc/hevc_ps: Add sps parse support for HEVC SCC extension syntax 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: Mh7mke28nVqa Content-Length: 7757 From: Linjie Fu According to 7.3.2.2.3 in T-REC-H.265-201911. Signed-off-by: Linjie Fu Signed-off-by: Haihao Xiang --- libavcodec/hevc.h | 3 +++ libavcodec/hevc_ps.c | 44 +++++++++++++++++++++++++++++++++++++++++--- libavcodec/hevc_ps.h | 15 +++++++++++++++ 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/libavcodec/hevc.h b/libavcodec/hevc.h index 1804755327..6b454a75c1 100644 --- a/libavcodec/hevc.h +++ b/libavcodec/hevc.h @@ -154,6 +154,9 @@ enum { // get near that, though, so set a lower limit here with the maximum // possible value for 4K video (at most 135 16x16 Ctb rows). HEVC_MAX_ENTRY_POINT_OFFSETS = HEVC_MAX_TILE_COLUMNS * 135, + + // A.3.7: Screen content coding extensions + HEVC_MAX_PALETTE_PREDICTOR_SIZE = 128, }; diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c index 584e2ba0d6..d65efc1aef 100644 --- a/libavcodec/hevc_ps.c +++ b/libavcodec/hevc_ps.c @@ -909,7 +909,7 @@ int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id, HEVCWindow *ow; int ret = 0; int log2_diff_max_min_transform_block_size; - int bit_depth_chroma, start, vui_present, sublayer_ordering_info; + int bit_depth_chroma, start, vui_present, sublayer_ordering_info, num_comps; int i; // Coded parameters @@ -1130,8 +1130,20 @@ int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id, decode_vui(gb, avctx, apply_defdispwin, sps); if (get_bits1(gb)) { // sps_extension_flag - sps->sps_range_extension_flag = get_bits1(gb); - skip_bits(gb, 7); //sps_extension_7bits = get_bits(gb, 7); + sps->sps_range_extension_flag = get_bits1(gb); + + /* To keep consistency with the workaround for hevc-conformance-PS_A_VIDYO_3 + * in PPS, here ignore sps_multilayer_extension_flag, sps_3d_extension_flag + * and sps_scc_extension_flag for non-SCC streams too. Note multilayer_extension + * or 3d_extension is not implemented in FFmpeg */ + if (sps->ptl.general_ptl.profile_idc == FF_PROFILE_HEVC_SCC) { + sps->sps_multilayer_extension_flag = get_bits1(gb); + sps->sps_3d_extension_flag = get_bits1(gb); + sps->sps_scc_extension_flag = get_bits1(gb); + skip_bits(gb, 4); //sps_extension_4bits = get_bits(gb, 4); + } else + skip_bits(gb, 7); + if (sps->sps_range_extension_flag) { sps->transform_skip_rotation_enabled_flag = get_bits1(gb); sps->transform_skip_context_enabled_flag = get_bits1(gb); @@ -1157,6 +1169,32 @@ int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id, av_log(avctx, AV_LOG_WARNING, "cabac_bypass_alignment_enabled_flag not yet implemented\n"); } + if (sps->sps_multilayer_extension_flag || sps->sps_3d_extension_flag) { + av_log(avctx, AV_LOG_ERROR, + "multilayer_extension or 3d_extension not yet implemented\n"); + return AVERROR_PATCHWELCOME; + } + + if (sps->sps_scc_extension_flag) { + sps->sps_curr_pic_ref_enabled_flag = get_bits1(gb); + sps->palette_mode_enabled_flag = get_bits1(gb); + if (sps->palette_mode_enabled_flag) { + sps->palette_max_size = get_ue_golomb_long(gb); + sps->delta_palette_max_predictor_size = get_ue_golomb_long(gb); + sps->sps_palette_predictor_initializers_present_flag = get_bits1(gb); + + if (sps->sps_palette_predictor_initializers_present_flag) { + sps->sps_num_palette_predictor_initializers_minus1 = get_ue_golomb_long(gb); + num_comps = !sps->chroma_format_idc ? 1 : 3; + for (int comp = 0; comp < num_comps; comp++) + for (i = 0; i <= sps->sps_num_palette_predictor_initializers_minus1; i++) + sps->sps_palette_predictor_initializer[comp][i] = + get_bits(gb, !comp ? sps->bit_depth : sps->bit_depth_chroma); + } + } + sps->motion_vector_resolution_control_idc = get_bits(gb, 2); + sps->intra_boundary_filtering_disabled_flag = get_bits1(gb); + } } if (apply_defdispwin) { sps->output_window.left_offset += sps->vui.def_disp_win.left_offset; diff --git a/libavcodec/hevc_ps.h b/libavcodec/hevc_ps.h index 2a1bbf6489..be23758008 100644 --- a/libavcodec/hevc_ps.h +++ b/libavcodec/hevc_ps.h @@ -223,6 +223,21 @@ typedef struct HEVCSPS { int persistent_rice_adaptation_enabled_flag; int cabac_bypass_alignment_enabled_flag; + // Not yet implemented + int sps_multilayer_extension_flag; + int sps_3d_extension_flag; + + int sps_scc_extension_flag; + int sps_curr_pic_ref_enabled_flag; + int palette_mode_enabled_flag; + int palette_max_size; + int delta_palette_max_predictor_size; + int sps_palette_predictor_initializers_present_flag; + int sps_num_palette_predictor_initializers_minus1; + int sps_palette_predictor_initializer[3][HEVC_MAX_PALETTE_PREDICTOR_SIZE]; + int motion_vector_resolution_control_idc; + int intra_boundary_filtering_disabled_flag; + ///< coded frame dimension in various units int width; int height;