From patchwork Sat Jul 2 22:21:42 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 36599 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:8b27:b0:88:1bbf:7fd2 with SMTP id l39csp1883673pzh; Sat, 2 Jul 2022 15:22:23 -0700 (PDT) X-Google-Smtp-Source: AGRyM1t4OxEUvPATjNf/R6uMboSftWvSZlrWdMPQ/nSv45krfbPVh2YopHtA/s/gEJHhbmM3MKCM X-Received: by 2002:a17:907:75e8:b0:722:e8c5:ee96 with SMTP id jz8-20020a17090775e800b00722e8c5ee96mr8435088ejc.147.1656800543239; Sat, 02 Jul 2022 15:22:23 -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 jg16-20020a170907971000b00726bdf6ee00si15666511ejc.842.2022.07.02.15.22.22; Sat, 02 Jul 2022 15:22:23 -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=cbCU1dSB; 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 8237168B944; Sun, 3 Jul 2022 01:22:20 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-DB8-obe.outbound.protection.outlook.com (mail-db8eur05olkn2106.outbound.protection.outlook.com [40.92.89.106]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E69B368B926 for ; Sun, 3 Jul 2022 01:22:13 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=HAW+Xca3C64eJDIUhFxAi+y33N2xDgsKY4x/VyHyaL0Rh3oxUtnFqssQ1e2lA1Gy7884mGdHE1uASK4rLrNEfFPX52Q0s0+qJxXYuUVYitg1hnDWpJLMMXnf0AZL1DyQkIzkw5LwCpgJ3qdizlUGDKYVoTmZFWly5gCeWc5pEDrceoOxxK8aRHAbeF2/ea6VpqRHSRQKfnYmAkRSUsBrVmpzg3qWF2ksFdpCIFASIVoLJ2fjFSbd5iDZM9l+wk6s1Cl268GL9v0gWt2DosrTYf9Z2gdh/5nwJr4aLASUvdX3gnx5PDw86of10isjBVDcgIJyp93mBz/RL7Mri/GqcQ== 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=PF/xINVLVEg6+giw2NhtVgDL74UErP2Nhkajd5av7Vs=; b=hclm1RkpfA4F6Fa4Ykwn3W0+QoBIXtj2/1s2uDStcA3uSOJe1fEPcRChq4y0J+OxyFfFDlAmygJJiPxdUn1h2s1PUPJRKKNtrV/f9OQfd03aetKa67uTDNFu/4/XfYjP7s7Ec36/VMdlbyQihNCINUwb5Um993/0XRR9P8ilHHbOG5HyUKWuef9bcG6nUI4Z6YL5bGfqgVIfDXTIcwuzJVSBF6oQU4fEDCvYC/MXzvYp4s1gvFgqzHQcnMskmeMG96SIrUl0TH0f9SrOCp2AIt1muU12REiNmyONGPyPp9xaIAaxPB1NbfQIvlWHw8SaakRmFC6xlcsJuXD7zQgdrA== 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=PF/xINVLVEg6+giw2NhtVgDL74UErP2Nhkajd5av7Vs=; b=cbCU1dSB9iQud2kl3k2MSSFyp5VnZdUoNg/aXmGrqopWx6uBpBvmR4xk5x1jGLUzInh9x81zrya2EBdLx33OXrkDSf7e2+BSkaYYsCGF1Edle5LqL7fX0hsl5vG2+TuJR+xjWem1vICMCmztKDIK6nAeAjCAUECJIa81zLl9fmmQiMrUCqxgPhnbB16ohJqgRnTw57UQXNeqQjE2z4wu/kjKtOXsLH68DT3aryw/EmYxxCcPLNpLn9O6fNyLnxtjWoGr/RLNUffB0dZdV+bCaiEUWwmZT6HTLGc27d6g+5wo/4IAUkuDTxN58t4TmpXINLWl7oViEu6nxU2nyVJE9g== Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) by VI1PR01MB4240.eurprd01.prod.exchangelabs.com (2603:10a6:803:6e::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.5395.14; Sat, 2 Jul 2022 22:22:12 +0000 Received: from DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::60b9:9f29:40cc:f01c]) by DB6PR0101MB2214.eurprd01.prod.exchangelabs.com ([fe80::60b9:9f29:40cc:f01c%10]) with mapi id 15.20.5395.018; Sat, 2 Jul 2022 22:22:11 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Sun, 3 Jul 2022 00:21:42 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [vqg7aRubAOaOiCaTDJMMiTgfRijI+2/V] X-ClientProxiedBy: FR3P281CA0089.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:1f::18) To DB6PR0101MB2214.eurprd01.prod.exchangelabs.com (2603:10a6:4:42::27) X-Microsoft-Original-Message-ID: <20220702222200.169681-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 84fb50a8-93ba-4146-7de0-08da5c794f37 X-MS-Exchange-SLBlob-MailProps: +LiGfBxqLEtZ2Se9LXW8/h2t+qO8GfncnrsP5vP/A5nHBedlMgadBWQgcM3jGem2sX7FqDnz1OCtPC0pctizv9J4GswtCiYg1yL7xyOnBNeDgvjpzZTIuiP80CKK964E95OEbXwjBodGW/4O/1/pCwsAxGwS0i/4NE4YyGjRe9pP3h+/7uzijWkd/2esBGgDUjQiGGZUnzgt4SEFQtnnuCdDBaVcd1ni69xnP1V7V8UeEA2r2JGsdm8aK3mSrcpSrKTPa9+e4uZ8M8ZKX3GnlX7mQJnO31pRhxjN01q8cXGcvlBaMItCcVwsczjlsxAQpddEZ+xMtolyywfLndT0BCVzAOAmbikmIvtNaTB0r63Y8cwHHyWNd3dBfpxWMXGeqUSxWAt0+0KhOgWRgto6s88fLoEJ51fMfNruIWJV+VsF5S5pbLb25umJXL8Uu7dcg8nX8Vb2O1TZnJ1dS0BGE4K2FhbR382sHIqZrIYFLeS7eTTuwXzxqj4qbIwb5QaTuuT8FlwJKHf2l3cBx0gCIjxkTae3t+dFmpXa2jmDpM2g0WYNyQ0Tu7IqRvM6r5NtK3hmrPrGslF9D4uk5za2z4NVvyRFONNOojivXW45TQ+5bRF9Pgpmh5gPeU/jXAIMe1wwJqIeCCtL1/r6Hlxo0XBrrD1IqeXvTj4IV64sZ/QCT5SdaPNnKhkwjed4GJE3n9U6XvbRXBbh8dve6v2Y8AoeYhuliN0UKigd/tGepcMpLUmtJ3aT03rqkbkOOELfTpk4o5vxLd5r2rpdE3chFtXArNdxoqhO X-MS-TrafficTypeDiagnostic: VI1PR01MB4240:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: Ehgvdxb/izM8SntY+Tag4YxvzDwmH3peHuicCVKh9oAXwBrNpEG+3RVf7B5vrC5JcBbjYXlC6lY499+iZjrPhViUF/JWyFvLxY6RqKg/slxDite8WKZfDrIIcG77KMz6vVyVHNOaTwUSxtPw2ou3e9XFshorimpVYRI3PSkGofZ0Gcz8q57hQCgdQiL2IiNHA7+y5lofvtDfc6o101iB9n8mzH93ri1QhRuRYrd0Xs5ekB9EB7gOG4vFUVTBcN97ZqPmc2zGt2eNtgMTMIovdik9Ue3a+npH4o/73ZOyXEp4DUM6o+8A8Zu8jP+6wi17zvExfhrRVpYQ0UEPyomOi41iuskanBbd1bo/ls+rBHo0W4RCQft0KsyEfIA5E+8L5G20RVTeLY+zKnkhawv4iXu9+k1MeIFDgJQ0qnkIqV8mFwTmPaOr2Ld0Bs1gB1AXpM+Xj08baty73Z7JRAM5NGvc2Q8fZnjd/J1oxFMhNdWXyMPdlNATe+IYupzluhgAiTp0MH17WT8YtCqqqnGnttiKcrULwZC5tJAoF3/zcqIPA/QRrfJJ9OlWHr00J0IGD3io0CldTwr+5rr3xrD0anWLVbc3RiJ2GQ00d1RcCxeLZRO+yJEcVg+8Z195/zix16rU2DHC8OlOIpQzgxF4Cw== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: WbmxxTymatDVR15K1w8husfnTeQSwg3ZVUFSHA2hDfrvu1A940XyEssm2ljTBBInQ+8OsIzqqscaXfRBt/23874nDKguwTgJwuX4AIc4zyPXiDy44BeZnljZtK6rmGBQD+Sulvc5Jy07UaXhAx3ECMb0UHooRVXXcnZZezBJFpVKvQtk41GAgV5EC7+ju2YsNnKoLGnA7e4gu4FfMhRgpD1TMKLRXDTpY+k+vf4gnmjZCwT5dzGAQ4F0cfEKPRGwriMe9CjKHzo5Xr1zPAn3BnqINhlylJ2Pv9zgKw+VlZukGgmaGjA2JtYUo2da6vyQIJ3jS9hHHKfYUnBZSZI51452yrJNaJQiHBMs/WIekHkXWoI959nZGuOocCjKd05wXdD9MyKdW3spLz1OAukFYpJG1KRTqQJ6q04hqzjgV+k6M8m8w/DDf1kl45Jr/Mwp13Hzy1ZrW0dmxrZyEihKNpKxIA1lmQQO6QI1BRdl7t33txxNijI5vsvht+CwV4zABCZfr13bob2WI5vvJ2tzHzBTd7LfeFtp1O7GYPd9ciZUGu95AqrZ67LFr/5og6S4oyUcFU0N4civbg+ns8iXJNme4p2A7n+1wdJSu2xl5S98ieMlXGORs1dXXUoKQQjj6gr8Ujy8R+Ec59pXbuwLLEIlJAQPrNf46XJuxka8LkHTGltnYlsn5vJtue6sMOXt26iu2a7T8+vtqAxpJhLj2YTf2Hse6gUrmwYC1Yy8l7P47uYR8VUxymWRyAp1rFL46zjOTIDnhFVutk703hUX7Bdyv6/5X/XLC3Mfca2oTr73xjK5f26M36YPsS9j2uinePJin2vGjIOQBTyZ0ZEfSaIG/zEoCgL8lsoUVbjOyDfInJylw8lM7Y7J2vV/3p6wFHtp7yKV+M0VDY+xiqDINf/Kcrd+dQfywF3d/ZyJT/6WIiX9ZQ443jEjFsl4t7N3GrlaQeWsXM1qkupN3LWtpvJRQpRZCNzwsDQbHTQyaTwM95RKxH38HZQ5QieO+JmH7+40Qw7PruU7OE/mcYQcrLQyzyaULiOHWflYQK3AkZrg6c3n9fA1ThC1j3urWyTP8y8n6RFzcUvrtRZmg0++8rf87IrXVQRSK7oGtA3grjCd5qTPXtmzTWpfNcBtMm2HtFG0F7515LcRukH+6HqDr9YgnUfWH5Kgcb1msiO4zfI7jU2qW5WJnVT0FMQzePORL5udYqvfmfNsM7AYLSIP8D/+TX5bM4UYKuX4SIuA3l8VdOR2qE2R8qpRDDQLcsWps4pELqTFbopphyVRNZeANMLpLQdL1INvCmrfpPwfmws= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 84fb50a8-93ba-4146-7de0-08da5c794f37 X-MS-Exchange-CrossTenant-AuthSource: DB6PR0101MB2214.eurprd01.prod.exchangelabs.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 02 Jul 2022 22:22:11.8890 (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: VI1PR01MB4240 Subject: [FFmpeg-devel] [PATCH 02/20] avcodec/h264_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: XfmSgK8WlqUW SEI NALUs and several SEI messages are naturally byte-aligned, so reading them via the bytestream-API is more natural. Signed-off-by: Andreas Rheinhardt --- libavcodec/h264_sei.c | 145 ++++++++++++++++++++---------------------- libavcodec/h264_sei.h | 2 +- 2 files changed, 70 insertions(+), 77 deletions(-) diff --git a/libavcodec/h264_sei.c b/libavcodec/h264_sei.c index 034ddb8f1c..d62a276779 100644 --- a/libavcodec/h264_sei.c +++ b/libavcodec/h264_sei.c @@ -33,6 +33,7 @@ #include "libavutil/macros.h" #include "libavutil/mem.h" #include "atsc_a53.h" +#include "bytestream.h" #include "get_bits.h" #include "golomb.h" #include "h264_ps.h" @@ -70,8 +71,10 @@ int ff_h264_sei_process_picture_timing(H264SEIPictureTiming *h, const SPS *sps, void *logctx) { GetBitContext gb; + av_unused int ret; - init_get_bits(&gb, h->payload, h->payload_size_bits); + ret = init_get_bits8(&gb, h->payload, h->payload_size_bytes); + av_assert1(ret >= 0); if (sps->nal_hrd_parameters_present_flag || sps->vcl_hrd_parameters_present_flag) { @@ -133,44 +136,36 @@ int ff_h264_sei_process_picture_timing(H264SEIPictureTiming *h, const SPS *sps, return 0; } -static int decode_picture_timing(H264SEIPictureTiming *h, GetBitContext *gb, +static int decode_picture_timing(H264SEIPictureTiming *h, GetByteContext *gb, void *logctx) { - int index = get_bits_count(gb); - int size_bits = get_bits_left(gb); - int size = (size_bits + 7) / 8; + int size = bytestream2_get_bytes_left(gb); - if (index & 7) { - av_log(logctx, AV_LOG_ERROR, "Unaligned SEI payload\n"); - return AVERROR_INVALIDDATA; - } if (size > sizeof(h->payload)) { av_log(logctx, AV_LOG_ERROR, "Picture timing SEI payload too large\n"); return AVERROR_INVALIDDATA; } - memcpy(h->payload, gb->buffer + index / 8, size); + bytestream2_get_bufferu(gb, h->payload, size); - h->payload_size_bits = size_bits; + h->payload_size_bytes = size; h->present = 1; return 0; } -static int decode_registered_user_data_afd(H264SEIAFD *h, GetBitContext *gb, int size) +static int decode_registered_user_data_afd(H264SEIAFD *h, GetByteContext *gb) { int flag; - if (size-- < 1) + if (bytestream2_get_bytes_left(gb) <= 0) return AVERROR_INVALIDDATA; - skip_bits(gb, 1); // 0 - flag = get_bits(gb, 1); // active_format_flag - skip_bits(gb, 6); // reserved + + flag = !!(bytestream2_get_byteu(gb) & 0x40); // active_format_flag if (flag) { - if (size-- < 1) + if (bytestream2_get_bytes_left(gb) <= 0) return AVERROR_INVALIDDATA; - skip_bits(gb, 4); // reserved - h->active_format_description = get_bits(gb, 4); + h->active_format_description = bytestream2_get_byteu(gb) & 0xF; h->present = 1; } @@ -178,31 +173,26 @@ static int decode_registered_user_data_afd(H264SEIAFD *h, GetBitContext *gb, int } static int decode_registered_user_data_closed_caption(H264SEIA53Caption *h, - GetBitContext *gb, void *logctx, - int size) + GetByteContext *gb) { - if (size < 3) - return AVERROR(EINVAL); - - return ff_parse_a53_cc(&h->buf_ref, gb->buffer + get_bits_count(gb) / 8, size); + return ff_parse_a53_cc(&h->buf_ref, gb->buffer, + bytestream2_get_bytes_left(gb)); } -static int decode_registered_user_data(H264SEIContext *h, GetBitContext *gb, - void *logctx, int size) +static int decode_registered_user_data(H264SEIContext *h, 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); // itu_t_t35_country_code + country_code = bytestream2_get_byteu(gb); // itu_t_t35_country_code if (country_code == 0xFF) { - if (size < 1) + if (bytestream2_get_bytes_left(gb) < 3) return AVERROR_INVALIDDATA; - skip_bits(gb, 8); // itu_t_t35_country_code_extension_byte - size--; + bytestream2_skipu(gb, 1); // itu_t_t35_country_code_extension_byte } if (country_code != 0xB5) { // usa_country_code @@ -213,23 +203,21 @@ static int decode_registered_user_data(H264SEIContext *h, GetBitContext *gb, } /* itu_t_t35_payload_byte follows */ - provider_code = get_bits(gb, 16); + provider_code = bytestream2_get_be16u(gb); switch (provider_code) { 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('D', 'T', 'G', '1'): // afd_data - return decode_registered_user_data_afd(&h->afd, gb, size); + return decode_registered_user_data_afd(&h->afd, gb); case MKBETAG('G', 'A', '9', '4'): // closed captions - return decode_registered_user_data_closed_caption(&h->a53_caption, gb, - logctx, size); + return decode_registered_user_data_closed_caption(&h->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", @@ -248,11 +236,11 @@ static int decode_registered_user_data(H264SEIContext *h, GetBitContext *gb, return 0; } -static int decode_unregistered_user_data(H264SEIUnregistered *h, GetBitContext *gb, - void *logctx, int size) +static int decode_unregistered_user_data(H264SEIUnregistered *h, GetByteContext *gb, + void *logctx) { uint8_t *user_data; - int e, build, i; + int e, build, size = bytestream2_get_bytes_left(gb); AVBufferRef *buf_ref, **tmp; if (size < 16 || size >= INT_MAX - 1) @@ -268,10 +256,8 @@ static int decode_unregistered_user_data(H264SEIUnregistered *h, GetBitContext * return AVERROR(ENOMEM); user_data = buf_ref->data; - for (i = 0; i < size; i++) - user_data[i] = get_bits(gb, 8); - - user_data[i] = 0; + bytestream2_get_bufferu(gb, user_data, size); + user_data[size] = 0; buf_ref->size = size; h->buf_ref[h->nb_buf_ref++] = buf_ref; @@ -384,36 +370,36 @@ static int decode_display_orientation(H264SEIDisplayOrientation *h, return 0; } -static int decode_green_metadata(H264SEIGreenMetaData *h, GetBitContext *gb) +static int decode_green_metadata(H264SEIGreenMetaData *h, GetByteContext *gb) { - h->green_metadata_type = get_bits(gb, 8); + h->green_metadata_type = bytestream2_get_byte(gb); if (h->green_metadata_type == 0) { - h->period_type = get_bits(gb, 8); + h->period_type = bytestream2_get_byte(gb); if (h->period_type == 2) - h->num_seconds = get_bits(gb, 16); + h->num_seconds = bytestream2_get_be16(gb); else if (h->period_type == 3) - h->num_pictures = get_bits(gb, 16); + h->num_pictures = bytestream2_get_be16(gb); - h->percent_non_zero_macroblocks = get_bits(gb, 8); - h->percent_intra_coded_macroblocks = get_bits(gb, 8); - h->percent_six_tap_filtering = get_bits(gb, 8); - h->percent_alpha_point_deblocking_instance = get_bits(gb, 8); + h->percent_non_zero_macroblocks = bytestream2_get_byte(gb); + h->percent_intra_coded_macroblocks = bytestream2_get_byte(gb); + h->percent_six_tap_filtering = bytestream2_get_byte(gb); + h->percent_alpha_point_deblocking_instance = bytestream2_get_byte(gb); } else if (h->green_metadata_type == 1) { - h->xsd_metric_type = get_bits(gb, 8); - h->xsd_metric_value = get_bits(gb, 16); + h->xsd_metric_type = bytestream2_get_byte(gb); + h->xsd_metric_value = bytestream2_get_be16(gb); } return 0; } static int decode_alternative_transfer(H264SEIAlternativeTransfer *h, - GetBitContext *gb) + GetByteContext *gb) { h->present = 1; - h->preferred_transfer_characteristics = get_bits(gb, 8); + h->preferred_transfer_characteristics = bytestream2_get_byte(gb); return 0; } @@ -463,45 +449,52 @@ static int decode_film_grain_characteristics(H264SEIFilmGrainCharacteristics *h, int ff_h264_sei_decode(H264SEIContext *h, GetBitContext *gb, const H264ParamSets *ps, void *logctx) { + GetByteContext gbyte; int master_ret = 0; - while (get_bits_left(gb) > 16 && show_bits(gb, 16)) { + av_assert1((get_bits_count(gb) % 8) == 0); + bytestream2_init(&gbyte, gb->buffer + get_bits_count(gb) / 8, + get_bits_left(gb) / 8); + + while (bytestream2_get_bytes_left(&gbyte) > 2 && bytestream2_peek_ne16(&gbyte)) { + GetByteContext gbyte_payload; GetBitContext gb_payload; int type = 0; unsigned size = 0; int ret = 0; do { - if (get_bits_left(gb) < 8) + if (bytestream2_get_bytes_left(&gbyte) <= 0) return AVERROR_INVALIDDATA; - type += show_bits(gb, 8); - } while (get_bits(gb, 8) == 255); + type += bytestream2_peek_byteu(&gbyte); + } while (bytestream2_get_byteu(&gbyte) == 255); do { - if (get_bits_left(gb) < 8) + if (bytestream2_get_bytes_left(&gbyte) <= 0) return AVERROR_INVALIDDATA; - size += show_bits(gb, 8); - } while (get_bits(gb, 8) == 255); + size += bytestream2_peek_byteu(&gbyte); + } while (bytestream2_get_byteu(&gbyte) == 255); - if (size > get_bits_left(gb) / 8) { + if (size > bytestream2_get_bytes_left(&gbyte)) { av_log(logctx, AV_LOG_ERROR, "SEI type %d size %d truncated at %d\n", - type, 8*size, get_bits_left(gb)); + type, size, bytestream2_get_bytes_left(&gbyte)); return AVERROR_INVALIDDATA; } - ret = init_get_bits8(&gb_payload, gb->buffer + get_bits_count(gb) / 8, size); + bytestream2_init (&gbyte_payload, gbyte.buffer, size); + ret = init_get_bits8(&gb_payload, gbyte.buffer, size); if (ret < 0) return ret; switch (type) { case SEI_TYPE_PIC_TIMING: // Picture timing SEI - ret = decode_picture_timing(&h->picture_timing, &gb_payload, logctx); + ret = decode_picture_timing(&h->picture_timing, &gbyte_payload, logctx); break; case SEI_TYPE_USER_DATA_REGISTERED_ITU_T_T35: - ret = decode_registered_user_data(h, &gb_payload, logctx, size); + ret = decode_registered_user_data(h, &gbyte_payload, logctx); break; case SEI_TYPE_USER_DATA_UNREGISTERED: - ret = decode_unregistered_user_data(&h->unregistered, &gb_payload, logctx, size); + ret = decode_unregistered_user_data(&h->unregistered, &gbyte_payload, logctx); break; case SEI_TYPE_RECOVERY_POINT: ret = decode_recovery_point(&h->recovery_point, &gb_payload, logctx); @@ -516,10 +509,10 @@ int ff_h264_sei_decode(H264SEIContext *h, GetBitContext *gb, ret = decode_display_orientation(&h->display_orientation, &gb_payload); break; case SEI_TYPE_GREEN_METADATA: - ret = decode_green_metadata(&h->green_metadata, &gb_payload); + ret = decode_green_metadata(&h->green_metadata, &gbyte_payload); break; case SEI_TYPE_ALTERNATIVE_TRANSFER_CHARACTERISTICS: - ret = decode_alternative_transfer(&h->alternative_transfer, &gb_payload); + ret = decode_alternative_transfer(&h->alternative_transfer, &gbyte_payload); break; case SEI_TYPE_FILM_GRAIN_CHARACTERISTICS: ret = decode_film_grain_characteristics(&h->film_grain_characteristics, &gb_payload); @@ -537,7 +530,7 @@ int ff_h264_sei_decode(H264SEIContext *h, GetBitContext *gb, type, -get_bits_left(&gb_payload)); } - skip_bits_long(gb, 8 * size); + bytestream2_skipu(&gbyte, size); } return master_ret; diff --git a/libavcodec/h264_sei.h b/libavcodec/h264_sei.h index f9166b45df..d7866f42ad 100644 --- a/libavcodec/h264_sei.h +++ b/libavcodec/h264_sei.h @@ -66,7 +66,7 @@ typedef struct H264SEITimeCode { typedef struct H264SEIPictureTiming { // maximum size of pic_timing according to the spec should be 274 bits uint8_t payload[40]; - int payload_size_bits; + int payload_size_bytes; int present; H264_SEI_PicStructType pic_struct;