From patchwork Wed Apr 6 15:06:57 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 35229 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c05:b0:7a:e998:b410 with SMTP id bw5csp956501pzb; Wed, 6 Apr 2022 08:07:22 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx4JUuMmjDhKdXHw9ZWWMoDgstPvdk3NNObBdVYUAj0JM7haT7LODhdtngjx0AMg/20oV1A X-Received: by 2002:a17:906:c14b:b0:6da:b30d:76a0 with SMTP id dp11-20020a170906c14b00b006dab30d76a0mr8452445ejc.279.1649257641956; Wed, 06 Apr 2022 08:07:21 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id o23-20020a170906775700b006e075aa2304si11106802ejn.895.2022.04.06.08.07.21; Wed, 06 Apr 2022 08:07:21 -0700 (PDT) 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=@outlook.com header.s=selector1 header.b=VhcMaOGk; arc=fail (body hash mismatch); 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=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E118568AEBD; Wed, 6 Apr 2022 18:07:17 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05olkn2091.outbound.protection.outlook.com [40.92.91.91]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9D65F68AEBD for ; Wed, 6 Apr 2022 18:07:11 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=l7ov4WlxzLFStiP1jGS7IIMzlETlCKgQAbWciFKO2ZOUaCk1NtcUnUQ0tP1vIos0Oz4iz2OJuB/R/11m7lVDrlBPybjhoHodylrTvQb3e6PrAps5qwA+0ZNyqFo3D0j7K8HzXgw3FGTqPPUYgLwlaN0DFhDGJl4HDIpyj3HTNzQaCzI+xWad6hNc4IGmv3BysP6b9p8MhlFIUjZmLjkaFRrJWpdn2riDZH1Z0d3E1sb9ScZ7BUvIhwPmfRDCk9d027ixvYnbpfbcAsdl4l6vYfmDPXBK0ocdZBo03VjGcyN0A8LJigvDFBUHqJ7ujtD/qnLH76DccttkFwYwI6tA/g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1PKwYpbzXOhe+g6x9al1zUOzVbReNbIBX/pfrXfAelY=; b=JEURlHmHlDbGC3RLQ5dZMcxJwfh3+YYqHJRWmZWg4aTbc3XSUG7XsV2KW08GKffnalfgzHl1rOg2UfPoc0ZVcFdjLyOpHAMUS+Md0IC+VSBijpoT0d01DCgSWIAHi5XITJItngYkIpgvIsaeZm/aAYSkTu8+R6ihzwcB+3ScyY8An2JKOR8gmbcAryz+tNCYVjuaNc/Ucut33E1w6LS4swUXxPUT2cthsxQQzMrcXx0elz5KAcdlyRlePi9dmgJPSjA/TBXy4wGjCchl8kggdDIftFAraeQIWUXI1DhvkLfmhEoKg5Pu2xOssZkfE1kdu/SD6ldch9gq/WGtHgMEaA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=1PKwYpbzXOhe+g6x9al1zUOzVbReNbIBX/pfrXfAelY=; b=VhcMaOGkp+LI/pD/Yz7qbJM9h6hRxx2TLwtiapfj949M4ddzN4Es+6mMRj/2yRjwD9c8yeBF72Ob1uhWrGAMNa1nKp+sMFjmekII9oMzP1pX9t1AdcmyDY97GXnAwdkpXrh40FheEbY1YjG8D1F9vGD9tOh8IIIc6PkMK8/dD99Z0fGDa1dZOFa0038nys8UGJbtMNL1d+AUFTtJ/ZiaPStj/SsZivltaiUReGKnhom7z4K2O2KNPcSdjkCpUVms4GtA9O8Y3rXR28Sypqm0Qms6UlzXeoddCgUc6QEFpCwTE9XEWJicRkCVN85UgQWdLq/9lyjKP/Bi4wbayHj92A== Received: from AS8PR01MB7944.eurprd01.prod.exchangelabs.com (2603:10a6:20b:373::5) by DU0PR01MB9965.eurprd01.prod.exchangelabs.com (2603:10a6:10:310::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5144.19; Wed, 6 Apr 2022 15:07:08 +0000 Received: from AS8PR01MB7944.eurprd01.prod.exchangelabs.com ([fe80::6553:a424:79bf:6dc3]) by AS8PR01MB7944.eurprd01.prod.exchangelabs.com ([fe80::6553:a424:79bf:6dc3%3]) with mapi id 15.20.5123.031; Wed, 6 Apr 2022 15:07:08 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 6 Apr 2022 17:06:57 +0200 Message-ID: X-Mailer: git-send-email 2.32.0 X-TMN: [VJDyoR00+LVUBrPwIPC/MQaD21eRaCif] X-ClientProxiedBy: ZR0P278CA0158.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:41::17) To AS8PR01MB7944.eurprd01.prod.exchangelabs.com (2603:10a6:20b:373::5) X-Microsoft-Original-Message-ID: <20220406150658.551367-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: dd2e38f0-33ac-4b84-481e-08da17df1d88 X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiRqiJZBq8DkkBFZTrGpsflvO3W26mmNARqTfiyX4u3BUjLAcM2+CY1QBnd2xnwYh8TxyYAdGvncnR94U7fPU7TvIazLMlKNjex1uxBN7yAM8vHQlI8ab2BzhpRZZ/2c47SdIQT8T0hBUM8Glq/SLXwWeXCbl4M8lKEzfVQsddyulHUFy8nfphwWDZLqY23sCQGhsFplWfcCbDfezZ+B6BCFNerFToMrb0v9cm7ad+UfW4vdAKo6QwPX2uYkQCgxRQ2/OzWN6w2IbNmoAU6/1qzPQFx60kiFtYgdwiAJJPC8OET4ntvEi7h3KUO6mv914BlJdWzmKcupQVwpfXMuIOiLSp/BwBG1YS/1CD7yTp+d0bGig28eEudy570jd4kFCm6B0SGAX7emInmWMQhcr8+6l1pL05mxiF8/qg7ydOnnsSCnejr3uiDQ1wfVIi97napIo8v1/Ckt8mTiMkiztpp/vSWkzYkCVurZT28EaMjRlraTt/l1IZJpBqWF6BdICT3CujUExFd8mT9w7zMuWc+12LkqyLdMcvYGCcDfeKNaSuhKq6r/u9x0G3hykNKpLhBGTD1YE23JLGOsbQmHJ5voP2r7qdfanvqS+W6sBIKPA25acdK7FtOEeTxSNj3ldCUSW3nsd9JWaV3ySf9g7tvkhSFH1pR2sTeCDjqK99ef/B+/+oDxzZijx6ZdvpPNpXd+JbTsBn6MAt5CyxZcdQgEhuOB0Gy+YYe74tHtbJMxS/HWYyRXVgWKZYRNqYnwyvk= X-MS-TrafficTypeDiagnostic: DU0PR01MB9965:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: qJpucp7/q/yZoubO2oEtcf8dniblcEptUMeojl6InndV+4dm/zqi+QXHuVKJmgktFH19SNy6FeYiJ1v2YuSFrFFHVW7NcN3Kn18N7IXTf1/LhAK5L1syOUEaFsMxJ8CD9QHzNTdKuj3fm4+fraSpQhe8Ff4gPJe0fROAw2JoYoQmhyooN9TGII1KIbvtJQGI3+ORYrHXfUXS9DAgJCttfN8/P40ufzFDhg7x6vKmGZzWSP8kJtzbBz5KsBX14uC8QT4oicj0dBKaZXDgN+usMq69F0DSiUHmFjTbXg9qzanaq70A0PVnZ4su9CmIJT7hxBJ5OXSHryf69EBfPOel9l5nImnitst9fd3z+qBxP9nPMH88X9wS9rNi6xMa+ax0OIbneLGz5pE262vzCpuQGLhfv49CPc5V22E3rXX+lh3ML5Luvg7JwZaO2eBHLTjUKkvgufkKTuN8aO8F+jVxDLPc0pPOGj+CHcopm0SDQCky3rpzCHrqiCFT/iI9uBu2zgkEIOzcuaqFkZAAm4z+pXovzDOdLoyjaPLudIjVzaxhHCvuVNZaAyjd059xYW39K3V8pVPXvp7Fc6kv4E73tg== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: pi/MPN1eDU9hLFq/tO6ZdNDHmlayYwYU5y+mQ/55I9eeSq8s6B7OqN4SOmpk8712sKc7k4CQujwcYLGLv+rJa4kLKjm6lt4v/wwdK+DsSdss42ANuXJcNcE+3wzu0VgANnjxty2T9quAOQ/DoLrshbf5DxVjQf2XcOgR165F8bO11yOBJIgKCTOBI578+cCuwxnJ5ASratg8sQDl8uCFTGJDyEkZBSSxUC9USI0e8W5aAgVPNSm0/xNZIrex0WnFdFlvzXv5ZfC28GxzTamqkKVS8vgfPBE9rxp2uBrh4PFo6LNMzY+WONMnKzMJkF336+OpJMHFYwnFBwfi4H4AdK/7J7leMZaKyCuSgdmpH6w0szSJ4dPISGa8GttLFZaEI5zOP7fu0pAMMknKmSh+NxCEiJGBpvSKlLPFdSjOOh+Z99lrHDRthEftj4JGNqA9Qd9gd/SBgKW6x747ln+OxmRvokCyiGneB1wyZ+JLp8Ox5lD0lpCETmQRy3MZg4xVS+dbZ0/bfSGg5lLH+LJS5puKU8DoJGJgJHVl0ey04oLVRa8YjfifKcy/G59WfKoHjOpgEeNBQPNY3535mQEeu80b/Q+Le8S3A936CWcSGZ0XEbT5e+DlEPa0MV2FirF1KQhKIRRRaTt423wNHmOlkwcTBzy6ZjJvd9FCi0Wu+6ZP4BH5qkkvxUmXTfms4M3D92eVoSOn6MlZoQrl1fdIkSvcqkvwPYc+2nuW7FkcCCHEmtgXt12wblPoRtQov7D+gsGIQskGo1uOMhczXYnQWokqmA5F1t5FPjtEXybkZVtKD7FotZWiEMpOk8fDK/b9TiDuDTxahhOTSjA7y+esq1VQTIHc3k/As/yHYp4Fz+Ej4cwfs7V0uFsYGOmxdseJXjt57MavJ4PZ9qMZUvW/JeOkbawKutUz6g7slyFbv/j9ChT0CiA4swdkxMoixMrW6mhGwDcdZZpj716q49M0vdgf237fB2OuNX13WJHhfwDwZ5568RHhmf4GTutJVOOEMLyW7nCq3qXVcXDXDJaCNhfJdieZOENfSCvZx6fH4fvpyvLUnuppbJwIHlg20swd0CH1DB+MiF3W4Tz6atZbMrNe6DGhJwx+OWVQOP9J26mz2fhHZ+/ZxdiU2g5geIdKNAcJNqov9yP+t6dYAtSiBYgg0twEioCTxPyqswAQBvG1geUchNGLmoburjcDFiB+hS/Y9oNa64R0F6sywCDxib1TiCER0uSrsHsPRi/ohnpFosNNYeLzN8VKbuDSWF+8nG7TEKDURkH/8nLSh1h5C8JiNZiKeDNb+Umco84p++ye4bAD11XO0XE8AMa/8jk+AtwM5lIIN+s336thDQnecqLHU+biB2m8TKtfe4nfJMsjekOR7MYLZpT3tRMDdeUEXCtlMv+UktLq+uhX3mXt5Svyq+AhIPCqApBuvW6qVoOGX9haxcVQ9TY+u3ArBg0V X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: dd2e38f0-33ac-4b84-481e-08da17df1d88 X-MS-Exchange-CrossTenant-AuthSource: AS8PR01MB7944.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Apr 2022 15:07:08.3368 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DU0PR01MB9965 Subject: [FFmpeg-devel] [PATCH 1/2] avcodec/hevc_sei: Fix parsing SEI messages X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: kaxznD6gwCB+ SEI messages are naturally byte-aligned by adding padding bits to achieve byte-alignment. The parsing code in libavcodec/hevc_sei.c nevertheless uses a GetBitContext to read it. When doing so, parsing the next SEI message starts exactly at the position where reading the last message (if any) ended. This means that one would have to handle both the payload extension data (which makes most SEI messages extensible structs) as well as the padding bits for byte-alignment. Yet our SEI parsing code in libavcodec/hevc_sei.c does not read these at all. Instead several of the functions used for parsing specific SEI messages use skip_bits_long(); some don't use it at all, in which case it is possible for the GetBitContext to not be byte-aligned at the start of the next SEI message (the parsing code for several types of SEI messages relies on byte-alignment). Fix this by always using a dedicated GetBitContext per SEI message; skipping the necessary amount of bytes in the NALU context is done at a higher level. This also allows to remove unnecessary parsing code that only existed in order to skip enough bytes. Signed-off-by: Andreas Rheinhardt --- libavcodec/hevc_sei.c | 50 +++++++++++-------------------------------- 1 file changed, 12 insertions(+), 38 deletions(-) diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c index ec3036f932..f49264217e 100644 --- a/libavcodec/hevc_sei.c +++ b/libavcodec/hevc_sei.c @@ -44,10 +44,8 @@ static int decode_nal_sei_decoded_picture_hash(HEVCSEIPictureHash *s, GetBitCont s->md5[cIdx][i] = get_bits(gb, 8); } else if (hash_type == 1) { // picture_crc = get_bits(gb, 16); - skip_bits(gb, 16); } else if (hash_type == 2) { // picture_checksum = get_bits_long(gb, 32); - skip_bits(gb, 32); } } return 0; @@ -72,14 +70,12 @@ static int decode_nal_sei_mastering_display_info(HEVCSEIMasteringDisplay *s, Get // Max and min luminance of mastering display s->max_luminance = get_bits_long(gb, 32); s->min_luminance = get_bits_long(gb, 32); - size -= 24; // As this SEI message comes before the first frame that references it, // initialize the flag to 2 and decrement on IRAP access unit so it // persists for the coded video sequence (e.g., between two IRAPs) s->present = 2; - skip_bits_long(gb, 8 * size); return 0; } @@ -91,13 +87,11 @@ static int decode_nal_sei_content_light_info(HEVCSEIContentLight *s, GetBitConte // Max and average light levels s->max_content_light_level = get_bits(gb, 16); s->max_pic_average_light_level = get_bits(gb, 16); - size -= 4; // As this SEI message comes before the first frame that references it, // initialize the flag to 2 and decrement on IRAP access unit so it // persists for the coded video sequence (e.g., between two IRAPs) s->present = 2; - skip_bits_long(gb, 8 * size); return 0; } @@ -114,15 +108,7 @@ static int decode_nal_sei_frame_packing_arrangement(HEVCSEIFramePacking *s, GetB // spatial_flipping_flag, frame0_flipped_flag, field_views_flag skip_bits(gb, 3); s->current_frame_is_frame0_flag = get_bits1(gb); - // frame0_self_contained_flag, frame1_self_contained_flag - skip_bits(gb, 2); - - if (!s->quincunx_subsampling && s->arrangement_type != 5) - skip_bits(gb, 16); // frame[01]_grid_position_[xy] - skip_bits(gb, 8); // frame_packing_arrangement_reserved_byte - skip_bits1(gb); // frame_packing_arrangement_persistence_flag } - skip_bits1(gb); // upsampled_aspect_ratio_flag return 0; } @@ -135,7 +121,7 @@ static int decode_nal_sei_display_orientation(HEVCSEIDisplayOrientation *s, GetB s->vflip = get_bits1(gb); // ver_flip s->anticlockwise_rotation = get_bits(gb, 16); - skip_bits1(gb); // display_orientation_persistence_flag + // skip_bits1(gb); // display_orientation_persistence_flag } return 0; @@ -167,12 +153,7 @@ static int decode_nal_sei_pic_timing(HEVCSEI *s, GetBitContext *gb, const HEVCPa av_log(logctx, AV_LOG_DEBUG, "Frame/Field Tripling\n"); h->picture_struct = HEVC_SEI_PIC_STRUCT_FRAME_TRIPLING; } - get_bits(gb, 2); // source_scan_type - get_bits(gb, 1); // duplicate_flag - skip_bits1(gb); - size--; } - skip_bits_long(gb, 8 * size); return 0; } @@ -187,8 +168,6 @@ static int decode_registered_user_data_closed_caption(HEVCSEIA53Caption *s, GetB if (ret < 0) return ret; - skip_bits_long(gb, size * 8); - return 0; } @@ -241,8 +220,6 @@ static int decode_registered_user_data_dynamic_hdr_plus(HEVCSEIDynamicHDRPlus *s return AVERROR(ENOMEM); } - skip_bits_long(gb, size * 8); - return 0; } @@ -269,8 +246,6 @@ static int decode_registered_user_data_dynamic_hdr_vivid(HEVCSEIDynamicHDRVivid return AVERROR(ENOMEM); } - skip_bits_long(gb, size * 8); - return 0; } @@ -296,7 +271,7 @@ static int decode_nal_sei_user_data_registered_itu_t_t35(HEVCSEI *s, GetBitConte av_log(logctx, AV_LOG_VERBOSE, "Unsupported User Data Registered ITU-T T35 SEI message (country_code = 0x%x)\n", country_code); - goto end; + return 0; } provider_code = get_bits(gb, 16); @@ -361,15 +336,12 @@ static int decode_nal_sei_user_data_registered_itu_t_t35(HEVCSEI *s, GetBitConte break; } -end: - skip_bits_long(gb, size * 8); return 0; } static int decode_nal_sei_active_parameter_sets(HEVCSEI *s, GetBitContext *gb, void *logctx) { int num_sps_ids_minus1; - int i; unsigned active_seq_parameter_set_id; get_bits(gb, 4); // active_video_parameter_set_id @@ -389,9 +361,6 @@ static int decode_nal_sei_active_parameter_sets(HEVCSEI *s, GetBitContext *gb, v } s->active_seq_parameter_set_id = active_seq_parameter_set_id; - for (i = 1; i <= num_sps_ids_minus1; i++) - get_ue_golomb_long(gb); // active_seq_parameter_set_id[i] - return 0; } @@ -404,7 +373,6 @@ static int decode_nal_sei_alternative_transfer(HEVCSEIAlternativeTransfer *s, Ge s->preferred_transfer_characteristics = get_bits(gb, 8); size--; - skip_bits_long(gb, 8 * size); return 0; } @@ -527,7 +495,6 @@ static int decode_nal_sei_prefix(GetBitContext *gb, void *logctx, HEVCSEI *s, return decode_film_grain_characteristics(&s->film_grain_characteristics, gb); default: av_log(logctx, AV_LOG_DEBUG, "Skipped PREFIX SEI %d\n", type); - skip_bits_long(gb, 8 * size); return 0; } } @@ -540,7 +507,6 @@ static int decode_nal_sei_suffix(GetBitContext *gb, void *logctx, HEVCSEI *s, return decode_nal_sei_decoded_picture_hash(&s->picture_hash, gb); default: av_log(logctx, AV_LOG_DEBUG, "Skipped SUFFIX SEI %d\n", type); - skip_bits_long(gb, 8 * size); return 0; } } @@ -548,9 +514,11 @@ static int decode_nal_sei_suffix(GetBitContext *gb, void *logctx, HEVCSEI *s, static int decode_nal_sei_message(GetBitContext *gb, void *logctx, HEVCSEI *s, const HEVCParamSets *ps, int nal_unit_type) { + GetBitContext message_gb; int payload_type = 0; int payload_size = 0; int byte = 0xFF; + av_unused int ret; av_log(logctx, AV_LOG_DEBUG, "Decoding SEI\n"); while (byte == 0xFF) { @@ -568,10 +536,14 @@ static int decode_nal_sei_message(GetBitContext *gb, void *logctx, HEVCSEI *s, } if (get_bits_left(gb) < 8LL*payload_size) return AVERROR_INVALIDDATA; + ret = init_get_bits8(&message_gb, gb->buffer + get_bits_count(gb) / 8, + payload_size); + av_assert1(ret >= 0); + skip_bits_long(gb, 8 * payload_size); if (nal_unit_type == HEVC_NAL_SEI_PREFIX) { - return decode_nal_sei_prefix(gb, logctx, s, ps, payload_type, payload_size); + return decode_nal_sei_prefix(&message_gb, logctx, s, ps, payload_type, payload_size); } else { /* nal_unit_type == NAL_SEI_SUFFIX */ - return decode_nal_sei_suffix(gb, logctx, s, payload_type, payload_size); + return decode_nal_sei_suffix(&message_gb, logctx, s, payload_type, payload_size); } } @@ -585,6 +557,8 @@ int ff_hevc_decode_nal_sei(GetBitContext *gb, void *logctx, HEVCSEI *s, { int ret; + av_assert1((get_bits_count(gb) % 8) == 0); + do { ret = decode_nal_sei_message(gb, logctx, s, ps, type); if (ret < 0) From patchwork Wed Apr 6 15:09:23 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 35230 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:c05:b0:7a:e998:b410 with SMTP id bw5csp958220pzb; Wed, 6 Apr 2022 08:09:43 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxBN/c8/OaWbUQQhmJc1e1XKoE2glenciUoVZ12/ao+EeMEtBCVUM8lqiKPOOHhfyDmaYBD X-Received: by 2002:a17:906:478d:b0:6e8:289d:c13c with SMTP id cw13-20020a170906478d00b006e8289dc13cmr1875106ejc.301.1649257783341; Wed, 06 Apr 2022 08:09:43 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id cf3-20020a170906b2c300b006e7f6476797si5921606ejb.739.2022.04.06.08.09.42; Wed, 06 Apr 2022 08:09:43 -0700 (PDT) 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=@outlook.com header.s=selector1 header.b=lo88dyMX; arc=fail (body hash mismatch); 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=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2473F68B183; Wed, 6 Apr 2022 18:09:40 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR02-AM5-obe.outbound.protection.outlook.com (mail-oln040092067045.outbound.protection.outlook.com [40.92.67.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0557E689B39 for ; Wed, 6 Apr 2022 18:09:33 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ZdT3rObXu/dm9pZeuLVD/BS7NQAjL83Vn7naSIBMQgNyXvk2wGGRsaHCrngT8+i843LUIw07BUsHmncO96UOMZvgwbdRukQRl4EB9TOkpATB62FJ/yWSlKKJAmta26UG2G78Y2GCuyzDE6xAh7JAGgzA2fN/KUdz1L1UJBXN9yzfuLHuGYmMONRrB8pLBxxP+OPL7m4P4irdGXdP1h9zG50IDAJiJb347A1dzxZ5U6o24o9ljeKKDCuSvFGRZCe9+qkograT76Zawzw5NmPBfEOq8T2P/7OzdD7i/+fVPTfYP1b2FHMLp4i3k5fFKp/LfWF68kOyQor8NMlfbo67dA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=GtuJBATCX0uYYYam6Hb/o6TfwCtgJSfFnZU58ubuKQY=; b=DrHqjiwQ1pNcbVp0nYZzAuRhgmBPcataAYHH9xl4ptctArZas9HRy7wfVerAHVbg7ziv+FRb17n23OyIZ2YePtvIQQfNbPcnY7QKpVjF9i8fvLoHAXroq371spdZfGbtuPT1P0gql0/M+UrwArs6Mm8l2QWo8wEx0VzofI06S80GGlT5hg4kUUKoXy1kJZE9Bafy4DSLKon7HWwnRvxELRvsB50ol/CYIYr8Um5K1FLVHyLjryyh7bDs4Y+om1YTGmk1azCJ1oBG13BWVJCWl8XC9NDre4pe1//9pjeWx83JcJFjjNVrnJCP5B+j4NjeJwzhcXNNehHtG11P941cwA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=GtuJBATCX0uYYYam6Hb/o6TfwCtgJSfFnZU58ubuKQY=; b=lo88dyMXHkKoqvyUgVQ/8TN9+WRfA1rTbJ7RfYpVaYxj4WJlNWeRacyhQ82qxnuc3t625qbygb1DVykJe8vZnZAMk2DAny3w9YNijiRJzEy9MZjC/buuZ/EIn0mc80TmJtQurEX3sEcfoB+OwlExNgQMubS0rszoOfC02mBicSvurKs9eZh9C/mOUjWk2j479e0F9knbfMSM1jMU0lvePFDoUsk0CriPp2Edf16fP/XSd5Z+Lv1eMxUciyOLkBJv+z/+V/F/PAdUNCaWYzXs3B917UJ+n6oUZ1qyOzw65B+DPfb3/oXE+LfHuPoqkCM9HDTqzk3aJOFYaYje2TdRCQ== Received: from AS8PR01MB7944.eurprd01.prod.exchangelabs.com (2603:10a6:20b:373::5) by DB8PR01MB5932.eurprd01.prod.exchangelabs.com (2603:10a6:10:e4::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5123.31; Wed, 6 Apr 2022 15:09:32 +0000 Received: from AS8PR01MB7944.eurprd01.prod.exchangelabs.com ([fe80::6553:a424:79bf:6dc3]) by AS8PR01MB7944.eurprd01.prod.exchangelabs.com ([fe80::6553:a424:79bf:6dc3%3]) with mapi id 15.20.5123.031; Wed, 6 Apr 2022 15:09:32 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 6 Apr 2022 17:09:23 +0200 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [1fW2AH2+6hkRkTgEZ1dpc7YzW1YA5lQO] X-ClientProxiedBy: ZR0P278CA0146.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:41::7) To AS8PR01MB7944.eurprd01.prod.exchangelabs.com (2603:10a6:20b:373::5) X-Microsoft-Original-Message-ID: <20220406150923.551567-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: d429a73f-fb31-4ba5-6b2a-08da17df7404 X-MS-Exchange-SLBlob-MailProps: +LiGfBxqLEvwtqrN8Wh1Vh6M61oXeegMC1u7NrabmuGzismAZbkpk4m8p1ek12HBKVMiwKYmZYGp7Tbruvgba6inhpbtwebXvQ4ZR6FEOG8AIgnhPeFWfmizJf1Jh9zG22aPFd/0IyJGu3vgRb/RTiKnemyPncv+Up05f7cYM0w24a+5eLD+n/6FUmbDp3/nW/J5CbSlZXXLp0xoz6VMqb7zbFjKP9zpFdtTOitBKP+3Ja5WgSz5mm5lGbQAf+XkpPyRpcK4lCyZmhR+Sx6NtWMM5MnVw97O0SSfXKQ26Y+QIGifZLzT+Fh/MS3jgLOWulR9hf3AskMMviKoBjR8kYeJ78zfxiUrQzG19Z6nGmjlWIGervaYKoXjn20jFLhxvfyRaYsrMLHvUB3Db0VI6IcAI/43c55aEs+PAm6hJB7mVw2h2K6CxQKuSzHez9/0xzLcNBIQlTplDB7iDj9W11gcOrSgfX8RTD7r54tp1rWAh9jHRZs2mt1k7lPtH0L+RlTd6eXQxZcz4cNTfM5apuSX9ggwFZB3Rm9MawSPmO9KnYYiEHOO5qKyCGODA8Jh2FeFS1z2O/noLvMolbEFE6SuO9cykmebd2jTnk60eyi7dAFOtD/V2XEMpU6SXQhzS/KBonfQ+ncVjhsQy3DilfxTcOXdNyFevf6O+oGqq/KSSoRcnrnQ2Bzbyj9bukMy6hG0Z0qN3WwH+0cgu7zXLFIlsWrDnpXzuDWKkbFYX8RvMtFjGzOI8+Dc2nzwPaQIu1YMjIa8dxQITbyQOuyuHmQ6SCyhXW21 X-MS-TrafficTypeDiagnostic: DB8PR01MB5932:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: r2oVuc+ha0V1vNqcvQMHyU6AxWtqIQyHtwFJW6M9x6HrG3Mx2bXgr6SeMGI8BHxchRZ6FmQoVA4gpDDHnD0mTC8BMEmoVQU4KqH9u8tS4iN3Aic6tT6m6nRPegKMUWeCwzjJ/pYFDfBgEi75uz/1uUZ4kmW4EvQtHrZStS9gZrPccjl25c7QDslg4bpWegCoUbYnUBXEAdSgQiSO60nepjlOX3AWM1e1jnCCunu1R1oyXYGWTmXGbgM6Fz9PMCylz0mV0eYUmdpRgDxfZwg6nHaXezTfIWFeYjGpx7HoDLxHYeoNtPEdDwK4q0L2ErBxj7hUM4P0vE4KjnNu5dVghoPOkd64VHK7GfOft4ONX3Eg3VSr0zSzuh9J9yPnQlmRJMFFGRW2HeD1ur/olXB5IyQ+qhSyEiANhZxPVZ+rpLLLwwFKhmCMjs+xF+NG5zHX5GWgvPM4BQewefgzX2hLlyKzpjJk1UM71z9RywHBqRVqP/ZIyvGNXGDAP/97emhy9nY8NgTOiuusldalW8Y4LtyroLr33wj6JKlrd9lxt59923BZz/0tU9PY2xwdh8KG2l8pv4QZs38Q2K+Igu7WQA== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: CHULesmJ8h7n8nfKKzQvDCAE9oHTMtfRkyq5Umx1C5GgyC7/NuFiRHo3shoEP9ZvMoIXHw1V6XAZHXIOUa0gebKgLq/SeAxxd62Cbzxj3SMVGAB+6wltZ0vmvCByyIrDdo8aLiJFnPyTeY1TBn2jW6qtkgUDbvhhfr24u/pu8ID3gPHgDJFTuBt6UKPkX9FLUBGtw/nxNrpV2AZnFVDj2ui5zImpzNg0BlqJSFGsn5pRYdG2A9RpRxvel6nnQ32efwJTvuRgwIReZhekkGp+6F4bzY3mDY21buvt302xIV7ObfU6KLEo+ilqRhkdlz2KIWjri1i1PFZQSS8Lv/7GyRof1ktdiEXEkqShTnjV9pPsS/tAonc0Ug4Ww1+FPusn96wI9oEoszN6j851u3cLyRCIpTDhrK+hamyM4p9xaXCUR8HFGvk51BXqUyvATJKcUQqP5QykdmHeNmNDsIJ5DwFPuZXH+yEa2gM30nExcYEj+ALU6gKcaCkz+9rgtR72NalfX25i6BDJUfSt+WlWHZTBnn/rIz7LgRb63j00oThI9i+rBdkqBzsJ65zj7h6QQmuqjX5mNsk2Q37+uRZQrpEajVeyFB4Os/DxClbKRreZwn/Q/uJCcsoNu7wmJAT/LPStTq5uYEVov0PPN9KmGTN9nYqbNdls4pJ6+6ZP0sE12Dd3jvkfjLnjOs/RXnBJVXuI8/Y46HKXlxtFaSx5n3b9lMRlhXDAMAITUQ0d8gsDQtpMF9z6cWzk4RMJ9PfXggE4HnGq5YTGyCxA0JQ6ACpe/LD1e0dvoOXq/PjqIL+Gx/nAj0ZNuJe5Pqz4Lj4IUbENDMkXl69zpoS4/okVymLMtVc5YuoyIMaWW2naVWK5lYhkYvDKLFW1MCDG83OV2wHdHzsbUj1Z2x325s48fElr1zGqjs+Ez3mBPHl02jPlbSWCeJBiALPrRJSAFyuxx0kA1e9UKsJ93Btf8wAv6Bk3VUh/PZNoqSSTRzYiP8hujdbNPVBVyKsAiIFtotmCJ4VsgNbq07c6GJD5VK4lZbgPSKtqgNzUUiNR3MltuloKk5Gz/IcZeswvrPOUhW+52BC+xGKbkX7fN/C3lRaEsZJqRIRGRLlaRSIqKvWDPno1FOPF3kLd715csLJ4FgFq2WzDFWjvH3MFXlu80hSUveL1GSGxwbiMaRR+kFtoRYo2xdCkvb9VNiX9cIkRGQD193hMMIMUxf1qWqNWWBfHybMNfHnr6uLmzn4cRCF8t53Vl1EJ/OJr5YG3yJgvVqQPTWH1RGxNp1ZA/uehxIFUeTk/UN54+4oWL50E7rRdMSw14thXs3L4ONzy/VVrTRw1lynFIemuLVl40v/+i7lwf/HE6SfSGGlALkDe1IaZa04DMM+rP75z6UeeDNJoeQa35MkY0KqTb71MIP4vAMdjtiMjAz4o+bXw0aT+ottvrRiDFOSf0oZwMHYf4TNL/pnQ X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: d429a73f-fb31-4ba5-6b2a-08da17df7404 X-MS-Exchange-CrossTenant-AuthSource: AS8PR01MB7944.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Apr 2022 15:09:32.1532 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB8PR01MB5932 Subject: [FFmpeg-devel] [PATCH 2/2] avcodec/hevc_sei: Don't use GetBit-API for byte-aligned reads X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: ookHcIu2Xy4f Instead use the bytestream2-API. Signed-off-by: Andreas Rheinhardt --- libavcodec/hevc_sei.c | 176 ++++++++++++++++++++++-------------------- 1 file changed, 91 insertions(+), 85 deletions(-) diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c index f49264217e..2557117500 100644 --- a/libavcodec/hevc_sei.c +++ b/libavcodec/hevc_sei.c @@ -23,25 +23,26 @@ */ #include "atsc_a53.h" +#include "bytestream.h" #include "dynamic_hdr10_plus.h" #include "dynamic_hdr_vivid.h" #include "golomb.h" #include "hevc_ps.h" #include "hevc_sei.h" -static int decode_nal_sei_decoded_picture_hash(HEVCSEIPictureHash *s, GetBitContext *gb) +static int decode_nal_sei_decoded_picture_hash(HEVCSEIPictureHash *s, + GetByteContext *gb) { - int cIdx, i; + int cIdx; uint8_t hash_type; //uint16_t picture_crc; //uint32_t picture_checksum; - hash_type = get_bits(gb, 8); + hash_type = bytestream2_get_byte(gb); for (cIdx = 0; cIdx < 3/*((s->sps->chroma_format_idc == 0) ? 1 : 3)*/; cIdx++) { if (hash_type == 0) { s->is_md5 = 1; - for (i = 0; i < 16; i++) - s->md5[cIdx][i] = get_bits(gb, 8); + bytestream2_get_buffer(gb, s->md5[cIdx], sizeof(s->md5[cIdx])); } else if (hash_type == 1) { // picture_crc = get_bits(gb, 16); } else if (hash_type == 2) { @@ -51,25 +52,26 @@ static int decode_nal_sei_decoded_picture_hash(HEVCSEIPictureHash *s, GetBitCont return 0; } -static int decode_nal_sei_mastering_display_info(HEVCSEIMasteringDisplay *s, GetBitContext *gb, int size) +static int decode_nal_sei_mastering_display_info(HEVCSEIMasteringDisplay *s, + GetByteContext *gb) { int i; - if (size < 24) + if (bytestream2_get_bytes_left(gb) < 24) return AVERROR_INVALIDDATA; // Mastering primaries for (i = 0; i < 3; i++) { - s->display_primaries[i][0] = get_bits(gb, 16); - s->display_primaries[i][1] = get_bits(gb, 16); + s->display_primaries[i][0] = bytestream2_get_be16u(gb); + s->display_primaries[i][1] = bytestream2_get_be16u(gb); } // White point (x, y) - s->white_point[0] = get_bits(gb, 16); - s->white_point[1] = get_bits(gb, 16); + s->white_point[0] = bytestream2_get_be16u(gb); + s->white_point[1] = bytestream2_get_be16u(gb); // Max and min luminance of mastering display - s->max_luminance = get_bits_long(gb, 32); - s->min_luminance = get_bits_long(gb, 32); + s->max_luminance = bytestream2_get_be32u(gb); + s->min_luminance = bytestream2_get_be32u(gb); // As this SEI message comes before the first frame that references it, // initialize the flag to 2 and decrement on IRAP access unit so it @@ -79,14 +81,15 @@ static int decode_nal_sei_mastering_display_info(HEVCSEIMasteringDisplay *s, Get return 0; } -static int decode_nal_sei_content_light_info(HEVCSEIContentLight *s, GetBitContext *gb, int size) +static int decode_nal_sei_content_light_info(HEVCSEIContentLight *s, + GetByteContext *gb) { - if (size < 4) + if (bytestream2_get_bytes_left(gb) < 4) return AVERROR_INVALIDDATA; // Max and average light levels - s->max_content_light_level = get_bits(gb, 16); - s->max_pic_average_light_level = get_bits(gb, 16); + s->max_content_light_level = bytestream2_get_be16u(gb); + s->max_pic_average_light_level = bytestream2_get_be16u(gb); // As this SEI message comes before the first frame that references it, // initialize the flag to 2 and decrement on IRAP access unit so it // persists for the coded video sequence (e.g., between two IRAPs) @@ -127,8 +130,8 @@ static int decode_nal_sei_display_orientation(HEVCSEIDisplayOrientation *s, GetB return 0; } -static int decode_nal_sei_pic_timing(HEVCSEI *s, GetBitContext *gb, const HEVCParamSets *ps, - void *logctx, int size) +static int decode_nal_sei_pic_timing(HEVCSEI *s, GetBitContext *gb, + const HEVCParamSets *ps, void *logctx) { HEVCSEIPictureTiming *h = &s->picture_timing; HEVCSPS *sps; @@ -158,23 +161,24 @@ static int decode_nal_sei_pic_timing(HEVCSEI *s, GetBitContext *gb, const HEVCPa return 0; } -static int decode_registered_user_data_closed_caption(HEVCSEIA53Caption *s, GetBitContext *gb, - int size) +static int decode_registered_user_data_closed_caption(HEVCSEIA53Caption *s, + GetByteContext *gb) { int ret; - ret = ff_parse_a53_cc(&s->buf_ref, gb->buffer + get_bits_count(gb) / 8, size); - + ret = ff_parse_a53_cc(&s->buf_ref, gb->buffer, + bytestream2_get_bytes_left(gb)); if (ret < 0) return ret; return 0; } -static int decode_nal_sei_user_data_unregistered(HEVCSEIUnregistered *s, GetBitContext *gb, - int size) +static int decode_nal_sei_user_data_unregistered(HEVCSEIUnregistered *s, + GetByteContext *gb) { AVBufferRef *buf_ref, **tmp; + int size = bytestream2_get_bytes_left(gb); if (size < 16 || size >= INT_MAX - 1) return AVERROR_INVALIDDATA; @@ -188,8 +192,7 @@ static int decode_nal_sei_user_data_unregistered(HEVCSEIUnregistered *s, GetBitC if (!buf_ref) return AVERROR(ENOMEM); - for (int i = 0; i < size; i++) - buf_ref->data[i] = get_bits(gb, 8); + bytestream2_get_bufferu(gb, buf_ref->data, size); buf_ref->data[size] = 0; buf_ref->size = size; s->buf_ref[s->nb_buf_ref++] = buf_ref; @@ -198,7 +201,7 @@ static int decode_nal_sei_user_data_unregistered(HEVCSEIUnregistered *s, GetBitC } static int decode_registered_user_data_dynamic_hdr_plus(HEVCSEIDynamicHDRPlus *s, - GetBitContext *gb, int size) + GetByteContext *gb) { size_t meta_size; int err; @@ -206,8 +209,8 @@ static int decode_registered_user_data_dynamic_hdr_plus(HEVCSEIDynamicHDRPlus *s if (!metadata) return AVERROR(ENOMEM); - err = ff_parse_itu_t_t35_to_dynamic_hdr10_plus(metadata, - gb->buffer + get_bits_count(gb) / 8, size); + err = ff_parse_itu_t_t35_to_dynamic_hdr10_plus(metadata, gb->buffer, + bytestream2_get_bytes_left(gb)); if (err < 0) { av_free(metadata); return err; @@ -224,7 +227,7 @@ static int decode_registered_user_data_dynamic_hdr_plus(HEVCSEIDynamicHDRPlus *s } static int decode_registered_user_data_dynamic_hdr_vivid(HEVCSEIDynamicHDRVivid *s, - GetBitContext *gb, int size) + GetByteContext *gb) { size_t meta_size; int err; @@ -233,7 +236,7 @@ static int decode_registered_user_data_dynamic_hdr_vivid(HEVCSEIDynamicHDRVivid return AVERROR(ENOMEM); err = ff_parse_itu_t_t35_to_dynamic_hdr_vivid(metadata, - gb->buffer + get_bits_count(gb) / 8, size); + gb->buffer, bytestream2_get_bytes_left(gb)); if (err < 0) { av_free(metadata); return err; @@ -249,22 +252,20 @@ static int decode_registered_user_data_dynamic_hdr_vivid(HEVCSEIDynamicHDRVivid return 0; } -static int decode_nal_sei_user_data_registered_itu_t_t35(HEVCSEI *s, GetBitContext *gb, - void *logctx, int size) +static int decode_nal_sei_user_data_registered_itu_t_t35(HEVCSEI *s, GetByteContext *gb, + void *logctx) { int country_code, provider_code; - if (size < 3) + if (bytestream2_get_bytes_left(gb) < 3) return AVERROR_INVALIDDATA; - size -= 3; - country_code = get_bits(gb, 8); + country_code = bytestream2_get_byteu(gb); if (country_code == 0xFF) { - if (size < 1) + if (bytestream2_get_bytes_left(gb) < 3) return AVERROR_INVALIDDATA; - skip_bits(gb, 8); - size--; + bytestream2_skipu(gb, 1); } if (country_code != 0xB5 && country_code != 0x26) { // usa_country_code and cn_country_code @@ -274,20 +275,19 @@ static int decode_nal_sei_user_data_registered_itu_t_t35(HEVCSEI *s, GetBitConte return 0; } - provider_code = get_bits(gb, 16); + provider_code = bytestream2_get_be16u(gb); switch (provider_code) { case 0x04: { // cuva_provider_code const uint16_t cuva_provider_oriented_code = 0x0005; uint16_t provider_oriented_code; - if (size < 2) + if (bytestream2_get_bytes_left(gb) < 2) return AVERROR_INVALIDDATA; - size -= 2; - provider_oriented_code = get_bits(gb, 16); + provider_oriented_code = bytestream2_get_be16u(gb); if (provider_oriented_code == cuva_provider_oriented_code) { - return decode_registered_user_data_dynamic_hdr_vivid(&s->dynamic_hdr_vivid, gb, size); + return decode_registered_user_data_dynamic_hdr_vivid(&s->dynamic_hdr_vivid, gb); } break; } @@ -298,29 +298,27 @@ static int decode_nal_sei_user_data_registered_itu_t_t35(HEVCSEI *s, GetBitConte uint16_t provider_oriented_code; uint8_t application_identifier; - if (size < 3) + if (bytestream2_get_bytes_left(gb) < 3) return AVERROR_INVALIDDATA; - size -= 3; - provider_oriented_code = get_bits(gb, 16); - application_identifier = get_bits(gb, 8); + provider_oriented_code = bytestream2_get_be16u(gb); + application_identifier = bytestream2_get_byteu(gb); if (provider_oriented_code == smpte2094_40_provider_oriented_code && application_identifier == smpte2094_40_application_identifier) { - return decode_registered_user_data_dynamic_hdr_plus(&s->dynamic_hdr_plus, gb, size); + return decode_registered_user_data_dynamic_hdr_plus(&s->dynamic_hdr_plus, gb); } break; } case 0x31: { // atsc_provider_code uint32_t user_identifier; - if (size < 4) + if (bytestream2_get_bytes_left(gb) < 4) return AVERROR_INVALIDDATA; - size -= 4; - user_identifier = get_bits_long(gb, 32); + user_identifier = bytestream2_get_be32u(gb); switch (user_identifier) { case MKBETAG('G', 'A', '9', '4'): - return decode_registered_user_data_closed_caption(&s->a53_caption, gb, size); + return decode_registered_user_data_closed_caption(&s->a53_caption, gb); default: av_log(logctx, AV_LOG_VERBOSE, "Unsupported User Data Registered ITU-T T35 SEI message (atsc user_identifier = 0x%04x)\n", @@ -364,14 +362,14 @@ static int decode_nal_sei_active_parameter_sets(HEVCSEI *s, GetBitContext *gb, v return 0; } -static int decode_nal_sei_alternative_transfer(HEVCSEIAlternativeTransfer *s, GetBitContext *gb, int size) +static int decode_nal_sei_alternative_transfer(HEVCSEIAlternativeTransfer *s, + GetByteContext *gb) { - if (size < 1) + if (bytestream2_get_bytes_left(gb) < 1) return AVERROR_INVALIDDATA; s->present = 1; - s->preferred_transfer_characteristics = get_bits(gb, 8); - size--; + s->preferred_transfer_characteristics = bytestream2_get_byteu(gb); return 0; } @@ -465,30 +463,31 @@ static int decode_film_grain_characteristics(HEVCSEIFilmGrainCharacteristics *h, return 0; } -static int decode_nal_sei_prefix(GetBitContext *gb, void *logctx, HEVCSEI *s, - const HEVCParamSets *ps, int type, int size) +static int decode_nal_sei_prefix(GetBitContext *gb, GetByteContext *gbyte, + void *logctx, HEVCSEI *s, + const HEVCParamSets *ps, int type) { switch (type) { case 256: // Mismatched value from HM 8.1 - return decode_nal_sei_decoded_picture_hash(&s->picture_hash, gb); + return decode_nal_sei_decoded_picture_hash(&s->picture_hash, gbyte); case SEI_TYPE_FRAME_PACKING_ARRANGEMENT: return decode_nal_sei_frame_packing_arrangement(&s->frame_packing, gb); case SEI_TYPE_DISPLAY_ORIENTATION: return decode_nal_sei_display_orientation(&s->display_orientation, gb); case SEI_TYPE_PIC_TIMING: - return decode_nal_sei_pic_timing(s, gb, ps, logctx, size); + return decode_nal_sei_pic_timing(s, gb, ps, logctx); case SEI_TYPE_MASTERING_DISPLAY_COLOUR_VOLUME: - return decode_nal_sei_mastering_display_info(&s->mastering_display, gb, size); + return decode_nal_sei_mastering_display_info(&s->mastering_display, gbyte); case SEI_TYPE_CONTENT_LIGHT_LEVEL_INFO: - return decode_nal_sei_content_light_info(&s->content_light, gb, size); + return decode_nal_sei_content_light_info(&s->content_light, gbyte); case SEI_TYPE_ACTIVE_PARAMETER_SETS: return decode_nal_sei_active_parameter_sets(s, gb, logctx); case SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35: - return decode_nal_sei_user_data_registered_itu_t_t35(s, gb, logctx, size); + return decode_nal_sei_user_data_registered_itu_t_t35(s, gbyte, logctx); case SEI_TYPE_USER_DATA_UNREGISTERED: - return decode_nal_sei_user_data_unregistered(&s->unregistered, gb, size); + return decode_nal_sei_user_data_unregistered(&s->unregistered, gbyte); case SEI_TYPE_ALTERNATIVE_TRANSFER_CHARACTERISTICS: - return decode_nal_sei_alternative_transfer(&s->alternative_transfer, gb, size); + return decode_nal_sei_alternative_transfer(&s->alternative_transfer, gbyte); case SEI_TYPE_TIME_CODE: return decode_nal_sei_timecode(&s->timecode, gb); case SEI_TYPE_FILM_GRAIN_CHARACTERISTICS: @@ -499,21 +498,22 @@ static int decode_nal_sei_prefix(GetBitContext *gb, void *logctx, HEVCSEI *s, } } -static int decode_nal_sei_suffix(GetBitContext *gb, void *logctx, HEVCSEI *s, - int type, int size) +static int decode_nal_sei_suffix(GetBitContext *gb, GetByteContext *gbyte, + void *logctx, HEVCSEI *s, int type) { switch (type) { case SEI_TYPE_DECODED_PICTURE_HASH: - return decode_nal_sei_decoded_picture_hash(&s->picture_hash, gb); + return decode_nal_sei_decoded_picture_hash(&s->picture_hash, gbyte); default: av_log(logctx, AV_LOG_DEBUG, "Skipped SUFFIX SEI %d\n", type); return 0; } } -static int decode_nal_sei_message(GetBitContext *gb, void *logctx, HEVCSEI *s, +static int decode_nal_sei_message(GetByteContext *gb, void *logctx, HEVCSEI *s, const HEVCParamSets *ps, int nal_unit_type) { + GetByteContext message_gbyte; GetBitContext message_gb; int payload_type = 0; int payload_size = 0; @@ -522,48 +522,54 @@ static int decode_nal_sei_message(GetBitContext *gb, void *logctx, HEVCSEI *s, av_log(logctx, AV_LOG_DEBUG, "Decoding SEI\n"); while (byte == 0xFF) { - if (get_bits_left(gb) < 16 || payload_type > INT_MAX - 255) + if (bytestream2_get_bytes_left(gb) < 2 || payload_type > INT_MAX - 255) return AVERROR_INVALIDDATA; - byte = get_bits(gb, 8); + byte = bytestream2_get_byteu(gb); payload_type += byte; } byte = 0xFF; while (byte == 0xFF) { - if (get_bits_left(gb) < 8 + 8LL*payload_size) + if (bytestream2_get_bytes_left(gb) < 1 + payload_size) return AVERROR_INVALIDDATA; - byte = get_bits(gb, 8); + byte = bytestream2_get_byteu(gb); payload_size += byte; } - if (get_bits_left(gb) < 8LL*payload_size) + if (bytestream2_get_bytes_left(gb) < payload_size) return AVERROR_INVALIDDATA; - ret = init_get_bits8(&message_gb, gb->buffer + get_bits_count(gb) / 8, - payload_size); + bytestream2_init(&message_gbyte, gb->buffer, payload_size); + ret = init_get_bits8(&message_gb, gb->buffer, payload_size); av_assert1(ret >= 0); - skip_bits_long(gb, 8 * payload_size); + bytestream2_skipu(gb, payload_size); if (nal_unit_type == HEVC_NAL_SEI_PREFIX) { - return decode_nal_sei_prefix(&message_gb, logctx, s, ps, payload_type, payload_size); + return decode_nal_sei_prefix(&message_gb, &message_gbyte, + logctx, s, ps, payload_type); } else { /* nal_unit_type == NAL_SEI_SUFFIX */ - return decode_nal_sei_suffix(&message_gb, logctx, s, payload_type, payload_size); + return decode_nal_sei_suffix(&message_gb, &message_gbyte, + logctx, s, payload_type); } } -static int more_rbsp_data(GetBitContext *gb) +static int more_rbsp_data(GetByteContext *gb) { - return get_bits_left(gb) > 0 && show_bits(gb, 8) != 0x80; + return bytestream2_get_bytes_left(gb) > 0 && + bytestream2_peek_byteu(gb) != 0x80; } int ff_hevc_decode_nal_sei(GetBitContext *gb, void *logctx, HEVCSEI *s, const HEVCParamSets *ps, int type) { + GetByteContext gbyte; int ret; av_assert1((get_bits_count(gb) % 8) == 0); + bytestream2_init(&gbyte, gb->buffer + get_bits_count(gb) / 8, + (get_bits_left(gb) + 7) / 8); do { - ret = decode_nal_sei_message(gb, logctx, s, ps, type); + ret = decode_nal_sei_message(&gbyte, logctx, s, ps, type); if (ret < 0) return ret; - } while (more_rbsp_data(gb)); + } while (more_rbsp_data(&gbyte)); return 1; }