All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arun Iyengar <aiyengar1990@gmail.com>
To: Mauro Carvalho Chehab <mchehab@kernel.org>
Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
	 Paul Kocialkowski <paulk@sys-base.io>,
	 Nicolas Dufresne <nicolas.dufresne@collabora.com>,
	 Hans Verkuil <hverkuil@kernel.org>,
	Arun Iyengar <aiyengar1990@gmail.com>
Subject: [PATCH RFC 01/10] media: hevc: Add H.265 syntax definitions
Date: Tue, 10 Nov 2026 10:07:31 +0000	[thread overview]
Message-ID: <20261110-hevc-encode-uapi-v1-1-38ae9fcfedd4@gmail.com> (raw)
In-Reply-To: <20261110-hevc-encode-uapi-v1-0-38ae9fcfedd4@gmail.com>

Add the ITU-T Rec. H.265 constants that a stateless HEVC encoder needs
to produce a bitstream: NAL unit type codes (Table 7-1), profile IDCs
(Annex A), access unit delimiter picture types (Table 7-2) and the VUI
colour description code points (Tables E.3 to E.5, shared with ITU-T
H.273).

Also add small helpers that classify NAL unit types (IRAP, IDR, BLA,
leading and sub-layer non-reference pictures), since the reference
picture set and picture order count rules depend on them.

These are kernel-internal definitions: the uAPI carries nal_unit_type as
the raw H.265 value, like the HEVC decoding controls already do.

Signed-off-by: Arun Iyengar <aiyengar1990@gmail.com>
---
 include/media/v4l2-hevc.h | 132 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 131 insertions(+), 1 deletion(-)

diff --git a/include/media/v4l2-hevc.h b/include/media/v4l2-hevc.h
index 973c96be16be..cc649b212a6d 100644
--- a/include/media/v4l2-hevc.h
+++ b/include/media/v4l2-hevc.h
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: GPL-2.0-or-later */
 /*
- * Helper functions for HEVC stateless codecs.
+ * Helper functions and ITU-T Rec. H.265 syntax definitions for HEVC stateless
+ * codecs.
  */
 
 #ifndef _MEDIA_V4L2_HEVC_H
@@ -38,4 +39,133 @@ v4l2_hevc_pps_num_tile_rows(const struct v4l2_ctrl_hevc_pps *pps)
 		     ARRAY_SIZE(pps->row_height_minus1));
 }
 
+/* ITU-T Rec. H.265 Table 7-1: NAL unit type codes */
+#define V4L2_HEVC_NAL_TRAIL_N		0
+#define V4L2_HEVC_NAL_TRAIL_R		1
+#define V4L2_HEVC_NAL_TSA_N		2
+#define V4L2_HEVC_NAL_TSA_R		3
+#define V4L2_HEVC_NAL_STSA_N		4
+#define V4L2_HEVC_NAL_STSA_R		5
+#define V4L2_HEVC_NAL_RADL_N		6
+#define V4L2_HEVC_NAL_RADL_R		7
+#define V4L2_HEVC_NAL_RASL_N		8
+#define V4L2_HEVC_NAL_RASL_R		9
+#define V4L2_HEVC_NAL_RSV_VCL_N14	14
+#define V4L2_HEVC_NAL_BLA_W_LP		16
+#define V4L2_HEVC_NAL_BLA_W_RADL	17
+#define V4L2_HEVC_NAL_BLA_N_LP		18
+#define V4L2_HEVC_NAL_IDR_W_RADL	19
+#define V4L2_HEVC_NAL_IDR_N_LP		20
+#define V4L2_HEVC_NAL_CRA_NUT		21
+#define V4L2_HEVC_NAL_RSV_IRAP_VCL23	23
+#define V4L2_HEVC_NAL_VPS		32
+#define V4L2_HEVC_NAL_SPS		33
+#define V4L2_HEVC_NAL_PPS		34
+#define V4L2_HEVC_NAL_AUD		35
+#define V4L2_HEVC_NAL_EOS		36
+#define V4L2_HEVC_NAL_EOB		37
+#define V4L2_HEVC_NAL_FD		38
+#define V4L2_HEVC_NAL_PREFIX_SEI	39
+#define V4L2_HEVC_NAL_SUFFIX_SEI	40
+
+/* ITU-T Rec. H.265 Annex A: general_profile_idc */
+#define V4L2_HEVC_PROFILE_IDC_MAIN		1
+#define V4L2_HEVC_PROFILE_IDC_MAIN_10		2
+#define V4L2_HEVC_PROFILE_IDC_MAIN_STILL_PICTURE	3
+#define V4L2_HEVC_PROFILE_IDC_RANGE_EXTENSIONS	4
+
+/* ITU-T Rec. H.265 Table 7-2: pic_type in access unit delimiters */
+#define V4L2_HEVC_AUD_PIC_TYPE_I	0
+#define V4L2_HEVC_AUD_PIC_TYPE_PI	1
+#define V4L2_HEVC_AUD_PIC_TYPE_BPI	2
+
+/* ITU-T Rec. H.265 Table E.1: aspect_ratio_idc */
+#define V4L2_HEVC_VUI_ASPECT_RATIO_IDC_EXTENDED	255
+
+/* ITU-T Rec. H.265 Table E.2: video_format */
+#define V4L2_HEVC_VUI_VIDEO_FORMAT_UNSPECIFIED	5
+
+/* ITU-T Rec. H.265 Tables E.3 to E.5 (ITU-T H.273 code points) */
+#define V4L2_HEVC_VUI_COLOUR_BT709		1
+#define V4L2_HEVC_VUI_COLOUR_UNSPECIFIED	2
+#define V4L2_HEVC_VUI_COLOUR_BT470_SYSTEM_M	4
+#define V4L2_HEVC_VUI_COLOUR_BT470_SYSTEM_BG	5
+#define V4L2_HEVC_VUI_COLOUR_SMPTE170M		6
+#define V4L2_HEVC_VUI_COLOUR_SMPTE240M		7
+#define V4L2_HEVC_VUI_COLOUR_BT2020		9
+#define V4L2_HEVC_VUI_COLOUR_SMPTE431		11
+
+#define V4L2_HEVC_VUI_TRANSFER_BT709		1
+#define V4L2_HEVC_VUI_TRANSFER_UNSPECIFIED	2
+#define V4L2_HEVC_VUI_TRANSFER_SMPTE170M	6
+#define V4L2_HEVC_VUI_TRANSFER_SMPTE240M	7
+#define V4L2_HEVC_VUI_TRANSFER_LINEAR		8
+#define V4L2_HEVC_VUI_TRANSFER_SRGB		13
+#define V4L2_HEVC_VUI_TRANSFER_SMPTE2084	16
+
+#define V4L2_HEVC_VUI_MATRIX_BT709		1
+#define V4L2_HEVC_VUI_MATRIX_UNSPECIFIED	2
+#define V4L2_HEVC_VUI_MATRIX_BT470_SYSTEM_BG	5
+#define V4L2_HEVC_VUI_MATRIX_SMPTE170M		6
+#define V4L2_HEVC_VUI_MATRIX_SMPTE240M		7
+#define V4L2_HEVC_VUI_MATRIX_BT2020_NCL		9
+#define V4L2_HEVC_VUI_MATRIX_BT2020_CL		10
+
+/* Maximum number of temporal sub-layers (sps_max_sub_layers_minus1 + 1) */
+#define V4L2_HEVC_MAX_SUB_LAYERS	7
+
+/* Maximum number of pictures in a short-term RPS (7.4.8) */
+#define V4L2_HEVC_MAX_ST_RPS_PICS	16
+
+/* Maximum number of long-term pictures signalled in a slice header */
+#define V4L2_HEVC_MAX_LT_PICS		16
+
+static inline bool v4l2_hevc_nal_is_irap(unsigned int nal_unit_type)
+{
+	return nal_unit_type >= V4L2_HEVC_NAL_BLA_W_LP &&
+	       nal_unit_type <= V4L2_HEVC_NAL_RSV_IRAP_VCL23;
+}
+
+static inline bool v4l2_hevc_nal_is_idr(unsigned int nal_unit_type)
+{
+	return nal_unit_type == V4L2_HEVC_NAL_IDR_W_RADL ||
+	       nal_unit_type == V4L2_HEVC_NAL_IDR_N_LP;
+}
+
+static inline bool v4l2_hevc_nal_is_bla(unsigned int nal_unit_type)
+{
+	return nal_unit_type >= V4L2_HEVC_NAL_BLA_W_LP &&
+	       nal_unit_type <= V4L2_HEVC_NAL_BLA_N_LP;
+}
+
+/*
+ * Sub-layer non-reference picture (3.132): even nal_unit_type values in the
+ * VCL range below RSV_VCL_N14.
+ */
+static inline bool v4l2_hevc_nal_is_sub_layer_non_ref(unsigned int nal_unit_type)
+{
+	return nal_unit_type <= V4L2_HEVC_NAL_RSV_VCL_N14 &&
+	       !(nal_unit_type & 1);
+}
+
+static inline bool v4l2_hevc_nal_is_leading(unsigned int nal_unit_type)
+{
+	return nal_unit_type >= V4L2_HEVC_NAL_RADL_N &&
+	       nal_unit_type <= V4L2_HEVC_NAL_RASL_R;
+}
+
+static inline char v4l2_hevc_slice_type_char(unsigned char slice_type)
+{
+	switch (slice_type) {
+	case V4L2_HEVC_SLICE_TYPE_B:
+		return 'B';
+	case V4L2_HEVC_SLICE_TYPE_P:
+		return 'P';
+	case V4L2_HEVC_SLICE_TYPE_I:
+		return 'I';
+	default:
+		return 'X';
+	}
+}
+
 #endif /* _MEDIA_V4L2_HEVC_H */

-- 
2.55.0


WARNING: multiple messages have this Message-ID (diff)
From: Arun Iyengar via B4 Relay <devnull+aiyengar1990.gmail.com@kernel.org>
To: Mauro Carvalho Chehab <mchehab@kernel.org>
Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
	 Paul Kocialkowski <paulk@sys-base.io>,
	 Nicolas Dufresne <nicolas.dufresne@collabora.com>,
	 Hans Verkuil <hverkuil@kernel.org>,
	Arun Iyengar <aiyengar1990@gmail.com>
Subject: [PATCH RFC 01/10] media: hevc: Add H.265 syntax definitions
Date: Tue, 10 Nov 2026 10:07:31 +0000	[thread overview]
Message-ID: <20261110-hevc-encode-uapi-v1-1-38ae9fcfedd4@gmail.com> (raw)
In-Reply-To: <20261110-hevc-encode-uapi-v1-0-38ae9fcfedd4@gmail.com>

From: Arun Iyengar <aiyengar1990@gmail.com>

Add the ITU-T Rec. H.265 constants that a stateless HEVC encoder needs
to produce a bitstream: NAL unit type codes (Table 7-1), profile IDCs
(Annex A), access unit delimiter picture types (Table 7-2) and the VUI
colour description code points (Tables E.3 to E.5, shared with ITU-T
H.273).

Also add small helpers that classify NAL unit types (IRAP, IDR, BLA,
leading and sub-layer non-reference pictures), since the reference
picture set and picture order count rules depend on them.

These are kernel-internal definitions: the uAPI carries nal_unit_type as
the raw H.265 value, like the HEVC decoding controls already do.

Signed-off-by: Arun Iyengar <aiyengar1990@gmail.com>
---
 include/media/v4l2-hevc.h | 132 +++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 131 insertions(+), 1 deletion(-)

diff --git a/include/media/v4l2-hevc.h b/include/media/v4l2-hevc.h
index 973c96be16be..cc649b212a6d 100644
--- a/include/media/v4l2-hevc.h
+++ b/include/media/v4l2-hevc.h
@@ -1,6 +1,7 @@
 /* SPDX-License-Identifier: GPL-2.0-or-later */
 /*
- * Helper functions for HEVC stateless codecs.
+ * Helper functions and ITU-T Rec. H.265 syntax definitions for HEVC stateless
+ * codecs.
  */
 
 #ifndef _MEDIA_V4L2_HEVC_H
@@ -38,4 +39,133 @@ v4l2_hevc_pps_num_tile_rows(const struct v4l2_ctrl_hevc_pps *pps)
 		     ARRAY_SIZE(pps->row_height_minus1));
 }
 
+/* ITU-T Rec. H.265 Table 7-1: NAL unit type codes */
+#define V4L2_HEVC_NAL_TRAIL_N		0
+#define V4L2_HEVC_NAL_TRAIL_R		1
+#define V4L2_HEVC_NAL_TSA_N		2
+#define V4L2_HEVC_NAL_TSA_R		3
+#define V4L2_HEVC_NAL_STSA_N		4
+#define V4L2_HEVC_NAL_STSA_R		5
+#define V4L2_HEVC_NAL_RADL_N		6
+#define V4L2_HEVC_NAL_RADL_R		7
+#define V4L2_HEVC_NAL_RASL_N		8
+#define V4L2_HEVC_NAL_RASL_R		9
+#define V4L2_HEVC_NAL_RSV_VCL_N14	14
+#define V4L2_HEVC_NAL_BLA_W_LP		16
+#define V4L2_HEVC_NAL_BLA_W_RADL	17
+#define V4L2_HEVC_NAL_BLA_N_LP		18
+#define V4L2_HEVC_NAL_IDR_W_RADL	19
+#define V4L2_HEVC_NAL_IDR_N_LP		20
+#define V4L2_HEVC_NAL_CRA_NUT		21
+#define V4L2_HEVC_NAL_RSV_IRAP_VCL23	23
+#define V4L2_HEVC_NAL_VPS		32
+#define V4L2_HEVC_NAL_SPS		33
+#define V4L2_HEVC_NAL_PPS		34
+#define V4L2_HEVC_NAL_AUD		35
+#define V4L2_HEVC_NAL_EOS		36
+#define V4L2_HEVC_NAL_EOB		37
+#define V4L2_HEVC_NAL_FD		38
+#define V4L2_HEVC_NAL_PREFIX_SEI	39
+#define V4L2_HEVC_NAL_SUFFIX_SEI	40
+
+/* ITU-T Rec. H.265 Annex A: general_profile_idc */
+#define V4L2_HEVC_PROFILE_IDC_MAIN		1
+#define V4L2_HEVC_PROFILE_IDC_MAIN_10		2
+#define V4L2_HEVC_PROFILE_IDC_MAIN_STILL_PICTURE	3
+#define V4L2_HEVC_PROFILE_IDC_RANGE_EXTENSIONS	4
+
+/* ITU-T Rec. H.265 Table 7-2: pic_type in access unit delimiters */
+#define V4L2_HEVC_AUD_PIC_TYPE_I	0
+#define V4L2_HEVC_AUD_PIC_TYPE_PI	1
+#define V4L2_HEVC_AUD_PIC_TYPE_BPI	2
+
+/* ITU-T Rec. H.265 Table E.1: aspect_ratio_idc */
+#define V4L2_HEVC_VUI_ASPECT_RATIO_IDC_EXTENDED	255
+
+/* ITU-T Rec. H.265 Table E.2: video_format */
+#define V4L2_HEVC_VUI_VIDEO_FORMAT_UNSPECIFIED	5
+
+/* ITU-T Rec. H.265 Tables E.3 to E.5 (ITU-T H.273 code points) */
+#define V4L2_HEVC_VUI_COLOUR_BT709		1
+#define V4L2_HEVC_VUI_COLOUR_UNSPECIFIED	2
+#define V4L2_HEVC_VUI_COLOUR_BT470_SYSTEM_M	4
+#define V4L2_HEVC_VUI_COLOUR_BT470_SYSTEM_BG	5
+#define V4L2_HEVC_VUI_COLOUR_SMPTE170M		6
+#define V4L2_HEVC_VUI_COLOUR_SMPTE240M		7
+#define V4L2_HEVC_VUI_COLOUR_BT2020		9
+#define V4L2_HEVC_VUI_COLOUR_SMPTE431		11
+
+#define V4L2_HEVC_VUI_TRANSFER_BT709		1
+#define V4L2_HEVC_VUI_TRANSFER_UNSPECIFIED	2
+#define V4L2_HEVC_VUI_TRANSFER_SMPTE170M	6
+#define V4L2_HEVC_VUI_TRANSFER_SMPTE240M	7
+#define V4L2_HEVC_VUI_TRANSFER_LINEAR		8
+#define V4L2_HEVC_VUI_TRANSFER_SRGB		13
+#define V4L2_HEVC_VUI_TRANSFER_SMPTE2084	16
+
+#define V4L2_HEVC_VUI_MATRIX_BT709		1
+#define V4L2_HEVC_VUI_MATRIX_UNSPECIFIED	2
+#define V4L2_HEVC_VUI_MATRIX_BT470_SYSTEM_BG	5
+#define V4L2_HEVC_VUI_MATRIX_SMPTE170M		6
+#define V4L2_HEVC_VUI_MATRIX_SMPTE240M		7
+#define V4L2_HEVC_VUI_MATRIX_BT2020_NCL		9
+#define V4L2_HEVC_VUI_MATRIX_BT2020_CL		10
+
+/* Maximum number of temporal sub-layers (sps_max_sub_layers_minus1 + 1) */
+#define V4L2_HEVC_MAX_SUB_LAYERS	7
+
+/* Maximum number of pictures in a short-term RPS (7.4.8) */
+#define V4L2_HEVC_MAX_ST_RPS_PICS	16
+
+/* Maximum number of long-term pictures signalled in a slice header */
+#define V4L2_HEVC_MAX_LT_PICS		16
+
+static inline bool v4l2_hevc_nal_is_irap(unsigned int nal_unit_type)
+{
+	return nal_unit_type >= V4L2_HEVC_NAL_BLA_W_LP &&
+	       nal_unit_type <= V4L2_HEVC_NAL_RSV_IRAP_VCL23;
+}
+
+static inline bool v4l2_hevc_nal_is_idr(unsigned int nal_unit_type)
+{
+	return nal_unit_type == V4L2_HEVC_NAL_IDR_W_RADL ||
+	       nal_unit_type == V4L2_HEVC_NAL_IDR_N_LP;
+}
+
+static inline bool v4l2_hevc_nal_is_bla(unsigned int nal_unit_type)
+{
+	return nal_unit_type >= V4L2_HEVC_NAL_BLA_W_LP &&
+	       nal_unit_type <= V4L2_HEVC_NAL_BLA_N_LP;
+}
+
+/*
+ * Sub-layer non-reference picture (3.132): even nal_unit_type values in the
+ * VCL range below RSV_VCL_N14.
+ */
+static inline bool v4l2_hevc_nal_is_sub_layer_non_ref(unsigned int nal_unit_type)
+{
+	return nal_unit_type <= V4L2_HEVC_NAL_RSV_VCL_N14 &&
+	       !(nal_unit_type & 1);
+}
+
+static inline bool v4l2_hevc_nal_is_leading(unsigned int nal_unit_type)
+{
+	return nal_unit_type >= V4L2_HEVC_NAL_RADL_N &&
+	       nal_unit_type <= V4L2_HEVC_NAL_RASL_R;
+}
+
+static inline char v4l2_hevc_slice_type_char(unsigned char slice_type)
+{
+	switch (slice_type) {
+	case V4L2_HEVC_SLICE_TYPE_B:
+		return 'B';
+	case V4L2_HEVC_SLICE_TYPE_P:
+		return 'P';
+	case V4L2_HEVC_SLICE_TYPE_I:
+		return 'I';
+	default:
+		return 'X';
+	}
+}
+
 #endif /* _MEDIA_V4L2_HEVC_H */

-- 
2.55.0



  reply	other threads:[~2026-11-10 10:07 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-11-10 10:07 [PATCH RFC 00/10] media: Add a V4L2 HEVC stateless encode uAPI and helpers Arun Iyengar
2026-11-10 10:07 ` Arun Iyengar via B4 Relay
2026-11-10 10:07 ` Arun Iyengar [this message]
2026-11-10 10:07   ` [PATCH RFC 01/10] media: hevc: Add H.265 syntax definitions Arun Iyengar via B4 Relay
2026-11-10 10:07 ` [PATCH RFC 02/10] media: uapi: Add HEVC stateless encode support Arun Iyengar
2026-11-10 10:07   ` Arun Iyengar via B4 Relay
2026-11-10 10:07 ` [PATCH RFC 03/10] media: hevc: Add stateless encode RBSP writer Arun Iyengar
2026-11-10 10:07   ` Arun Iyengar via B4 Relay
2026-11-10 10:07 ` [PATCH RFC 04/10] media: hevc: Add KUnit tests for the " Arun Iyengar
2026-11-10 10:07   ` Arun Iyengar via B4 Relay
2026-11-10 10:07 ` [PATCH RFC 05/10] media: hevc: Add stateless encode core Arun Iyengar
2026-11-10 10:07   ` Arun Iyengar via B4 Relay
2026-11-10 10:07 ` [PATCH RFC 06/10] media: hevc: Add KUnit tests for the " Arun Iyengar
2026-11-10 10:07   ` Arun Iyengar via B4 Relay
2026-11-10 10:07 ` [PATCH RFC 07/10] media: v4l2-hevc-enc: Add a constant bitrate mode Arun Iyengar
2026-11-10 10:07   ` Arun Iyengar via B4 Relay
2026-11-10 10:07 ` [PATCH RFC 08/10] media: v4l2-hevc-enc: Add QP limits for the I pictures Arun Iyengar
2026-11-10 10:07   ` Arun Iyengar via B4 Relay
2026-11-10 10:07 ` [PATCH RFC 09/10] media: v4l2-hevc-enc: Re-encode oversized pictures Arun Iyengar
2026-11-10 10:07   ` Arun Iyengar via B4 Relay
2026-11-10 10:07 ` [PATCH RFC 10/10] media: docs: Document the HEVC stateless encode uAPI Arun Iyengar
2026-11-10 10:07   ` Arun Iyengar via B4 Relay

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20261110-hevc-encode-uapi-v1-1-38ae9fcfedd4@gmail.com \
    --to=aiyengar1990@gmail.com \
    --cc=hverkuil@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab@kernel.org \
    --cc=nicolas.dufresne@collabora.com \
    --cc=paulk@sys-base.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.