From patchwork Thu Apr 30 00:33:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 19389 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 5EB3E44BDD1 for ; Thu, 30 Apr 2020 03:34:05 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 3745868C5AB; Thu, 30 Apr 2020 03:34:05 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f174.google.com (mail-qk1-f174.google.com [209.85.222.174]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 656F568C1F9 for ; Thu, 30 Apr 2020 03:33:58 +0300 (EEST) Received: by mail-qk1-f174.google.com with SMTP id t3so4114117qkg.1 for ; Wed, 29 Apr 2020 17:33:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=TJKak9HjcHiItJkrqT9hFXzONuQQU3UltCzlMU3jXQs=; b=IFt2UAVAJJgOWhSyMTFjOGgvVviZTd6ychyE2rMhsIXpVSm1yN75fiklQm/ipgOizj 5VPtlvrK4Sa3sCWrqcql4RNnCwTLy6l/URhpVJbqATw9A8DvyV972mROKd+ebhMH6feh oRYycJZZNYhvroeWmHKiUxeto8gYOCx6A+Uup1gKPvpyy0/j9Hc9EcL+9O0n5xaeugIv 0uTpH30DcpfYGMkBAkKJqUBU5a1zdEBWd5W2Brx+sQa+NFtR/uT0aEh22B+nWCIRdJ3u z2cIMUZvVlC8V5Z70b6bnq6gcRKOLc0YjevAntWzCoC34XYX3b7XItiY1xfI+pJI9Xrk VFXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=TJKak9HjcHiItJkrqT9hFXzONuQQU3UltCzlMU3jXQs=; b=BN7r8HvdrkC8rIXH6UIPBnCSZbkdvpSMjf8ofOAhIHurlCUJUBN1sQaiCPrF5A6vut FI6c5Vy9ti2CCBkRpVWwvEwnBhWvixFmBUUsaw7ufWJ5KBfSewFdv6Iyah31N0mGlczJ OLi1hwCI1ihY1IzeKJIUFVAUN2VyKIs7thYv//UJ76wZlpimue4DEdos+pra4Hfv8Coh PDYiVP4fyLFvof8xtQqtMrS/2Wcl5jSts5z0UmPN5kpRfrTLOQlp9GQi0LZpK5Ng67xi wOJFPjYlm6iF0rnVvjUR/XCwDWbbxvtR0Q3dS1jP6nlhAM6TlYBQMHEPGDIoXSuiNYBT RRCg== X-Gm-Message-State: AGi0PuY/hj2PfnU9+T2b/DdMmw4skcMNDi3fCheBPNOj/bQXjgdbye/H YM0+ZxQqCtGdqkQSwiZ3gZi+xDXBN4g= X-Google-Smtp-Source: APiQypIcmR9soWrMLSvW7Ed45trxhMHj8tuAYLE6HsSrIQJjnJIyj1TbUxhr74tMLqL8y8ceOHyEfw== X-Received: by 2002:ae9:edce:: with SMTP id c197mr1184137qkg.454.1588206836804; Wed, 29 Apr 2020 17:33:56 -0700 (PDT) Received: from localhost.localdomain ([181.23.93.37]) by smtp.gmail.com with ESMTPSA id q27sm571905qkn.7.2020.04.29.17.33.55 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2020 17:33:56 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Wed, 29 Apr 2020 21:33:12 -0300 Message-Id: <20200430003314.1728-1-jamrial@gmail.com> X-Mailer: git-send-email 2.26.2 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/3 v2] avcodec/cbs_h265: rename H265RawPSExtensionData to H265RawExtensionData 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" So that NAL types other than Parameter Set ones may use it. Signed-off-by: James Almer --- No difference compared to v1. libavcodec/cbs_h265.h | 10 +++++----- libavcodec/cbs_h265_syntax_template.c | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libavcodec/cbs_h265.h b/libavcodec/cbs_h265.h index ad746bf35f..2c1e153ad9 100644 --- a/libavcodec/cbs_h265.h +++ b/libavcodec/cbs_h265.h @@ -182,11 +182,11 @@ typedef struct H265RawVUI { uint8_t log2_max_mv_length_vertical; } H265RawVUI; -typedef struct H265RawPSExtensionData { +typedef struct H265RawExtensionData { uint8_t *data; size_t bit_length; AVBufferRef *data_ref; -} H265RawPSExtensionData; +} H265RawExtensionData; typedef struct H265RawVPS { H265RawNALUnitHeader nal_unit_header; @@ -221,7 +221,7 @@ typedef struct H265RawVPS { H265RawHRDParameters hrd_parameters[HEVC_MAX_LAYER_SETS]; uint8_t vps_extension_flag; - H265RawPSExtensionData extension_data; + H265RawExtensionData extension_data; } H265RawVPS; typedef struct H265RawSTRefPicSet { @@ -325,7 +325,7 @@ typedef struct H265RawSPS { uint8_t sps_scc_extension_flag; uint8_t sps_extension_4bits; - H265RawPSExtensionData extension_data; + H265RawExtensionData extension_data; // Range extension. uint8_t transform_skip_rotation_enabled_flag; @@ -413,7 +413,7 @@ typedef struct H265RawPPS { uint8_t pps_scc_extension_flag; uint8_t pps_extension_4bits; - H265RawPSExtensionData extension_data; + H265RawExtensionData extension_data; // Range extension. uint8_t log2_max_transform_skip_block_size_minus2; diff --git a/libavcodec/cbs_h265_syntax_template.c b/libavcodec/cbs_h265_syntax_template.c index 0696eeeb9e..a51b12cfc6 100644 --- a/libavcodec/cbs_h265_syntax_template.c +++ b/libavcodec/cbs_h265_syntax_template.c @@ -59,7 +59,7 @@ static int FUNC(byte_alignment)(CodedBitstreamContext *ctx, RWContext *rw) } static int FUNC(extension_data)(CodedBitstreamContext *ctx, RWContext *rw, - H265RawPSExtensionData *current) + H265RawExtensionData *current) { int err; size_t k; From patchwork Thu Apr 30 00:33:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 19390 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 4A1A744BDD1 for ; Thu, 30 Apr 2020 03:34:06 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 36E6368C5F9; Thu, 30 Apr 2020 03:34:06 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f195.google.com (mail-qk1-f195.google.com [209.85.222.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3F13A68C1F9 for ; Thu, 30 Apr 2020 03:33:59 +0300 (EEST) Received: by mail-qk1-f195.google.com with SMTP id 23so4114341qkf.0 for ; Wed, 29 Apr 2020 17:33:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=gWVhU8TicIhsuF6RFs3k+yaIl8BT3a+ZYhH4TVJfJpY=; b=dem1GIFTxATz9/EKVo9nlrmko79f6WB/Xn5Al4nva2kXh3/r/8AoLosuAmg1Ax1oFs C9Ny+lDqhocrKfd3Uw5W3dfKTkI2vkY60gvGoVQvEhxXPzLwYXkoTDRA8vb112JxRrdA Gy9gwJxyKyiikPNa4M3iaZbxrZLuADkHx4WISlQ6h5Vr3FJ3+mErFbsGNN2wTPS8OUGV 3xfR2BC9GbYAYrF7V2BQUA5dCgOm3B7l0DdJwJifoUpI5LZp3Z0VkpBhcqd5vWKNARPv fmP/nCLyXns8X5uk4CUfZJWdXdXXnyAWUd7F59w5tpSbVlnPR5VwPmm0wph8vtrd1uCy w3BA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=gWVhU8TicIhsuF6RFs3k+yaIl8BT3a+ZYhH4TVJfJpY=; b=KBoKi/YwGjCUJI0hLipbDdTLsS9eQXDTIaVEXq9cxGRR3hFwChNyYAHh/wLNVpal8S lW5XggAy3BA4hWuL60ZKM+vmUM4+nwTvu2Ry9POL6eutKjOb2NqIZLH42FD5YOpmFHzT sWwVITIro2A5NWIeT762E320rpKoPnnxQtoWmTvTDpPHocL9xJa7qivrYDxXAq0pxILp 58rFTDynh6kGWXxBYMPNK7Vx5ErllhVoWi8fa7jmvw+/5liPYL6QhjEGFS5U2Zqsqhom RL2+lNcA5+yDaZvCrTKtUgKC3a65TVh7lGEp1aIknDkgkP6VwWNCAVdX1as8jTXYxuya Khmw== X-Gm-Message-State: AGi0PuYXdFjjCexn8kq1bzXihRQ6X5x9Yc762O5U79EZwv5MADFoL5Mh XiXt9xyaUpzI6xKksTxMjddNEqLwuIs= X-Google-Smtp-Source: APiQypKyP7nIj9JOMFOFW58/e1qeKyHGJ5CgPgIOYRJR92IVyPd8In5S2niCxZ8i+cTqCIMbV1PFZA== X-Received: by 2002:a37:4e08:: with SMTP id c8mr1189056qkb.286.1588206837922; Wed, 29 Apr 2020 17:33:57 -0700 (PDT) Received: from localhost.localdomain ([181.23.93.37]) by smtp.gmail.com with ESMTPSA id q27sm571905qkn.7.2020.04.29.17.33.57 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2020 17:33:57 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Wed, 29 Apr 2020 21:33:13 -0300 Message-Id: <20200430003314.1728-2-jamrial@gmail.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200430003314.1728-1-jamrial@gmail.com> References: <20200430003314.1728-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 2/3 v3] avcodec/cbs_h265: move the payload_extension_present check into its own function 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Will be reused in the following patch. Signed-off-by: James Almer --- Moved the comment for the function to its new place, but otherwise, no difference compared to v2. libavcodec/cbs_h2645.c | 10 ++++++++++ libavcodec/cbs_h265_syntax_template.c | 9 +++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c index d42073cc5a..095e449ddc 100644 --- a/libavcodec/cbs_h2645.c +++ b/libavcodec/cbs_h2645.c @@ -233,6 +233,16 @@ static int cbs_write_se_golomb(CodedBitstreamContext *ctx, PutBitContext *pbc, return 0; } +// payload_extension_present() - true if we are before the last 1-bit +// in the payload structure, which must be in the last byte. +static int cbs_h265_payload_extension_present(GetBitContext *gbc, uint32_t payload_size, + int cur_pos) +{ + int bits_left = payload_size * 8 - cur_pos; + return (bits_left > 0 && + (bits_left > 7 || show_bits(gbc, bits_left) & MAX_UINT_BITS(bits_left - 1))); +} + #define HEADER(name) do { \ ff_cbs_trace_header(ctx, name); \ } while (0) diff --git a/libavcodec/cbs_h265_syntax_template.c b/libavcodec/cbs_h265_syntax_template.c index a51b12cfc6..ed08b06e9c 100644 --- a/libavcodec/cbs_h265_syntax_template.c +++ b/libavcodec/cbs_h265_syntax_template.c @@ -1572,7 +1572,7 @@ static int FUNC(sei_buffering_period)(CodedBitstreamContext *ctx, RWContext *rw, int err, i, length; #ifdef READ - int start_pos, end_pos, bits_left; + int start_pos, end_pos; start_pos = get_bits_count(rw); #endif @@ -1651,12 +1651,9 @@ static int FUNC(sei_buffering_period)(CodedBitstreamContext *ctx, RWContext *rw, } #ifdef READ - // payload_extension_present() - true if we are before the last 1-bit - // in the payload structure, which must be in the last byte. end_pos = get_bits_count(rw); - bits_left = *payload_size * 8 - (end_pos - start_pos); - if (bits_left > 0 && - (bits_left > 7 || ff_ctz(show_bits(rw, bits_left)) < bits_left - 1)) + if (cbs_h265_payload_extension_present(rw, *payload_size, + end_pos - start_pos)) flag(use_alt_cpb_params_flag); else infer(use_alt_cpb_params_flag, 0); From patchwork Thu Apr 30 00:33:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Almer X-Patchwork-Id: 19391 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 0BED7441F60 for ; Thu, 30 Apr 2020 03:34:09 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E680A68C610; Thu, 30 Apr 2020 03:34:08 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk1-f196.google.com (mail-qk1-f196.google.com [209.85.222.196]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 859F768C5E4 for ; Thu, 30 Apr 2020 03:34:00 +0300 (EEST) Received: by mail-qk1-f196.google.com with SMTP id 20so4062439qkl.10 for ; Wed, 29 Apr 2020 17:34:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=SpwuCKkN1Y6AIcH1fCSaf71jFpg05dUPNl1cU/pb6j8=; b=EVTuYE8N8hzL/W8wBVkNNIZZaVKREfi/JOoCeDn+eDJnUyODGtYX7xv8Jf5bXoa9pH dASeMDO/IuOZDiH7RU0tIiflRtTH9hKCXlDTubt+TVVKCA2S4zJAzRNIRKnQiAt2MON3 O/suGUu2L1s99+xuExcMi4WNT9s/lkysqJ0D0NU3nhMp9GCJuQbgH3VDvdfuTxymyH/E 7AQirhp0+3qYxF6xokmVO/jCJgLeXulvpLEyobHLdiXJpC65Mo8IcYR0tCY43akRGosp qzOCDm9P0EEE7haKuJi9UC2A401JQa30/j3Kgxi/D+SDUfElK5RJyhv0ta3obh44pM5v 1EHw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SpwuCKkN1Y6AIcH1fCSaf71jFpg05dUPNl1cU/pb6j8=; b=tNuAz3MuGQODHA31ZVtqxxZHPnsryIndBnesqsl8f/qpGcd3jIJHnL7TzK/+FNH1Uq 1wXIKYOGos/DB1y4siw/IThRJKsU6FjQr+UlikfRd6f7oGMdgiFObr2t/HDEihMSg/Jn AY4tAVWSE5r9bPp+LhdKJDMtm+cLkGFguVwniiHyQsv1l/C/gLH/6fmvXofv3I+elBaM nv6FVVDWo240r3j3/rifLYrpjXE/a8MMh/gAVrGZIM7HbZUMboi/G15YjvIZ/LEbO1Sb NMojXdlXLwoTirOJZl2BM+ff+O1xejK8P2XKeJ3358eAKmiXwjyP0wuvxM+A2eG3vUT+ qXcQ== X-Gm-Message-State: AGi0Pua26qZpnywVJsU5L0aNm7xnKPUWDfIYRnqBdnRU5upD6Fb5+3fX yqzXVX5U93gy0dVsi4VnWXp1G78hnj4= X-Google-Smtp-Source: APiQypJW2H7ybVnGibdbCkqpeWOsn/M2oBBMqwYZVALnlZ5g6lEaiWPSL3TTO2Lcn84qVDy0iATijw== X-Received: by 2002:a37:a348:: with SMTP id m69mr1164640qke.31.1588206839080; Wed, 29 Apr 2020 17:33:59 -0700 (PDT) Received: from localhost.localdomain ([181.23.93.37]) by smtp.gmail.com with ESMTPSA id q27sm571905qkn.7.2020.04.29.17.33.58 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 29 Apr 2020 17:33:58 -0700 (PDT) From: James Almer To: ffmpeg-devel@ffmpeg.org Date: Wed, 29 Apr 2020 21:33:14 -0300 Message-Id: <20200430003314.1728-3-jamrial@gmail.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200430003314.1728-1-jamrial@gmail.com> References: <20200430003314.1728-1-jamrial@gmail.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/3 v3] avcodec/cbs_h265: add missing support for reserved_payload_extension_data SEI bits 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Fixes ticket #8622 Signed-off-by: James Almer --- In writing scenarios, it will now ensure bit_equal_to_one is also always written when currently defined extension data (like in Buffering Period) is present, and not just when unknown extension data is. libavcodec/cbs_h2645.c | 1 + libavcodec/cbs_h265.h | 1 + libavcodec/cbs_h265_syntax_template.c | 71 +++++++++++++++++++++++++-- 3 files changed, 68 insertions(+), 5 deletions(-) diff --git a/libavcodec/cbs_h2645.c b/libavcodec/cbs_h2645.c index 095e449ddc..b432921ecc 100644 --- a/libavcodec/cbs_h2645.c +++ b/libavcodec/cbs_h2645.c @@ -553,6 +553,7 @@ static void cbs_h265_free_sei_payload(H265RawSEIPayload *payload) av_buffer_unref(&payload->payload.other.data_ref); break; } + av_buffer_unref(&payload->extension_data.data_ref); } static void cbs_h265_free_sei(void *opaque, uint8_t *content) diff --git a/libavcodec/cbs_h265.h b/libavcodec/cbs_h265.h index 2c1e153ad9..73897f77a4 100644 --- a/libavcodec/cbs_h265.h +++ b/libavcodec/cbs_h265.h @@ -715,6 +715,7 @@ typedef struct H265RawSEIPayload { AVBufferRef *data_ref; } other; } payload; + H265RawExtensionData extension_data; } H265RawSEIPayload; typedef struct H265RawSEI { diff --git a/libavcodec/cbs_h265_syntax_template.c b/libavcodec/cbs_h265_syntax_template.c index ed08b06e9c..45838467b7 100644 --- a/libavcodec/cbs_h265_syntax_template.c +++ b/libavcodec/cbs_h265_syntax_template.c @@ -1564,7 +1564,8 @@ static int FUNC(slice_segment_header)(CodedBitstreamContext *ctx, RWContext *rw, static int FUNC(sei_buffering_period)(CodedBitstreamContext *ctx, RWContext *rw, H265RawSEIBufferingPeriod *current, - uint32_t *payload_size) + uint32_t *payload_size, + int *more_data) { CodedBitstreamH265Context *h265 = ctx->priv_data; const H265RawSPS *sps; @@ -1658,8 +1659,15 @@ static int FUNC(sei_buffering_period)(CodedBitstreamContext *ctx, RWContext *rw, else infer(use_alt_cpb_params_flag, 0); #else - if (current->use_alt_cpb_params_flag) + // If unknown extension data exists, then use_alt_cpb_params_flag is + // coded in the bitstream and must be written even if it's 0. + if (current->use_alt_cpb_params_flag || *more_data) { flag(use_alt_cpb_params_flag); + // Ensure this bit is not the last in the payload by making the + // more_data_in_payload() check evaluate to true, so it may not + // be mistaken as something else by decoders. + *more_data = 1; + } #endif return 0; @@ -2057,11 +2065,48 @@ static int FUNC(sei_alpha_channel_info)(CodedBitstreamContext *ctx, return 0; } +static int FUNC(payload_extension)(CodedBitstreamContext *ctx, RWContext *rw, + H265RawExtensionData *current, uint32_t payload_size, + int cur_pos) +{ + int err; + size_t byte_length, k; + +#ifdef READ + GetBitContext tmp; + int bits_left, payload_zero_bits; + + if (!cbs_h265_payload_extension_present(rw, payload_size, cur_pos)) + return 0; + + bits_left = 8 * payload_size - cur_pos; + tmp = *rw; + if (bits_left > 8) + skip_bits_long(&tmp, bits_left - 8); + payload_zero_bits = get_bits(&tmp, FFMIN(bits_left, 8)); + if (!payload_zero_bits) + return AVERROR_INVALIDDATA; + payload_zero_bits = ff_ctz(payload_zero_bits); + current->bit_length = bits_left - payload_zero_bits - 1; + allocate(current->data, (current->bit_length + 7) / 8); +#endif + + byte_length = (current->bit_length + 7) / 8; + for (k = 0; k < byte_length; k++) { + int length = FFMIN(current->bit_length - k * 8, 8); + xu(length, reserved_payload_extension_data, current->data[k], + 0, MAX_UINT_BITS(length), 0); + } + + return 0; +} + static int FUNC(sei_payload)(CodedBitstreamContext *ctx, RWContext *rw, H265RawSEIPayload *current, int prefix) { int err, i; - int start_position, end_position; + int start_position, current_position, end_position; + int more_data = !!current->extension_data.bit_length; #ifdef READ start_position = get_bits_count(rw); @@ -2093,8 +2138,15 @@ static int FUNC(sei_payload)(CodedBitstreamContext *ctx, RWContext *rw, CHECK(FUNC(sei_ ## name)(ctx, rw, ¤t->payload.name, \ ¤t->payload_size)); \ break +#define SEI_TYPE_E(type, prefix_valid, suffix_valid, name) \ + case HEVC_SEI_TYPE_ ## type: \ + SEI_TYPE_CHECK_VALID(name, prefix_valid, suffix_valid); \ + CHECK(FUNC(sei_ ## name)(ctx, rw, ¤t->payload.name, \ + ¤t->payload_size, \ + &more_data)); \ + break - SEI_TYPE_S(BUFFERING_PERIOD, 1, 0, buffering_period); + SEI_TYPE_E(BUFFERING_PERIOD, 1, 0, buffering_period); SEI_TYPE_N(PICTURE_TIMING, 1, 0, pic_timing); SEI_TYPE_N(PAN_SCAN_RECT, 1, 0, pan_scan_rect); SEI_TYPE_S(USER_DATA_REGISTERED_ITU_T_T35, @@ -2125,7 +2177,16 @@ static int FUNC(sei_payload)(CodedBitstreamContext *ctx, RWContext *rw, } } - if (byte_alignment(rw)) { + // more_data_in_payload() +#ifdef READ + current_position = get_bits_count(rw) - start_position; + if (current_position != 8 * current->payload_size) { +#else + current_position = put_bits_count(rw) - start_position; + if (byte_alignment(rw) || more_data) { +#endif + CHECK(FUNC(payload_extension)(ctx, rw, ¤t->extension_data, + current->payload_size, current_position)); fixed(1, bit_equal_to_one, 1); while (byte_alignment(rw)) fixed(1, bit_equal_to_zero, 0);