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; }