Some drivers firmwares parse by themselves slice header and need
num_delta_pocs_of_ref_rps_idx value to parse slice header
short_term_ref_pic_set().
Use one of the 4 reserved bytes to store this value without
changing the v4l2_ctrl_hevc_decode_params structure size and padding.
This value also exist in DXVA API.
Signed-off-by: Benjamin Gaignard <[email protected]>
---
.../userspace-api/media/v4l/ext-ctrls-codec-stateless.rst | 7 +++++++
include/uapi/linux/v4l2-controls.h | 6 +++++-
2 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst
index 3d8411acd5b8..92ce3e126929 100644
--- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst
+++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst
@@ -2923,6 +2923,13 @@ This structure contains all loop filter related parameters. See sections
- ``poc_lt_curr[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]``
- PocLtCurr as described in section 8.3.2 "Decoding process for reference
picture set": provides the index of the long term references in DPB array.
+ * - __u8
+ - ``num_delta_pocs_of_ref_rps_idx``
+ - When the short_term_ref_pic_set_sps_flag in the slice header is equal to 0,
+ it is the same than derived value NumDeltaPocs[RefRpsIdx]. It can be used to parse
+ the RPS data in slice headers instead of skipping it with @short_term_ref_pic_set_size.
+ When the value of short_term_ref_pic_set_sps_flag in the slice header is
+ equal to 1, num_delta_pocs_of_ref_rps_idx shall be set to 0.
* - struct :c:type:`v4l2_hevc_dpb_entry`
- ``dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]``
- The decoded picture buffer, for meta-data about reference frames.
diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
index 5e80daa4ffe0..7bf59a87a1bf 100644
--- a/include/uapi/linux/v4l2-controls.h
+++ b/include/uapi/linux/v4l2-controls.h
@@ -2385,6 +2385,9 @@ struct v4l2_ctrl_hevc_slice_params {
* @poc_st_curr_after: provides the index of the short term after references
* in DPB array
* @poc_lt_curr: provides the index of the long term references in DPB array
+ * @num_delta_pocs_of_ref_rps_idx: same as the derived value NumDeltaPocs[RefRpsIdx],
+ * can be used to parse the RPS data in slice headers
+ * instead of skipping it with @short_term_ref_pic_set_size.
* @reserved: padding field. Should be zeroed by applications.
* @dpb: the decoded picture buffer, for meta-data about reference frames
* @flags: see V4L2_HEVC_DECODE_PARAM_FLAG_{}
@@ -2400,7 +2403,8 @@ struct v4l2_ctrl_hevc_decode_params {
__u8 poc_st_curr_before[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
__u8 poc_st_curr_after[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
__u8 poc_lt_curr[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
- __u8 reserved[4];
+ __u8 num_delta_pocs_of_ref_rps_idx;
+ __u8 reserved[3];
struct v4l2_hevc_dpb_entry dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
__u64 flags;
};
--
2.34.1
Le mardi 18 avril 2023 à 18:07 +0200, Benjamin Gaignard a écrit :
> Some drivers firmwares parse by themselves slice header and need
> num_delta_pocs_of_ref_rps_idx value to parse slice header
> short_term_ref_pic_set().
> Use one of the 4 reserved bytes to store this value without
> changing the v4l2_ctrl_hevc_decode_params structure size and padding.
>
> This value also exist in DXVA API.
>
> Signed-off-by: Benjamin Gaignard <[email protected]>
>
Reviewed-by: Nicolas Dufresne <[email protected]>
For the info, this is in preparation for MTK VCODEC HEVC driver. It makes our
API (hopefully) on par with DXVA, which has always been the goal, we simply
missed it during review.
regards,
Nicolas
> ---
> .../userspace-api/media/v4l/ext-ctrls-codec-stateless.rst | 7 +++++++
> include/uapi/linux/v4l2-controls.h | 6 +++++-
> 2 files changed, 12 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst
> index 3d8411acd5b8..92ce3e126929 100644
> --- a/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst
> +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-codec-stateless.rst
> @@ -2923,6 +2923,13 @@ This structure contains all loop filter related parameters. See sections
> - ``poc_lt_curr[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]``
> - PocLtCurr as described in section 8.3.2 "Decoding process for reference
> picture set": provides the index of the long term references in DPB array.
> + * - __u8
> + - ``num_delta_pocs_of_ref_rps_idx``
> + - When the short_term_ref_pic_set_sps_flag in the slice header is equal to 0,
> + it is the same than derived value NumDeltaPocs[RefRpsIdx]. It can be used to parse
> + the RPS data in slice headers instead of skipping it with @short_term_ref_pic_set_size.
> + When the value of short_term_ref_pic_set_sps_flag in the slice header is
> + equal to 1, num_delta_pocs_of_ref_rps_idx shall be set to 0.
> * - struct :c:type:`v4l2_hevc_dpb_entry`
> - ``dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX]``
> - The decoded picture buffer, for meta-data about reference frames.
> diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
> index 5e80daa4ffe0..7bf59a87a1bf 100644
> --- a/include/uapi/linux/v4l2-controls.h
> +++ b/include/uapi/linux/v4l2-controls.h
> @@ -2385,6 +2385,9 @@ struct v4l2_ctrl_hevc_slice_params {
> * @poc_st_curr_after: provides the index of the short term after references
> * in DPB array
> * @poc_lt_curr: provides the index of the long term references in DPB array
> + * @num_delta_pocs_of_ref_rps_idx: same as the derived value NumDeltaPocs[RefRpsIdx],
> + * can be used to parse the RPS data in slice headers
> + * instead of skipping it with @short_term_ref_pic_set_size.
> * @reserved: padding field. Should be zeroed by applications.
> * @dpb: the decoded picture buffer, for meta-data about reference frames
> * @flags: see V4L2_HEVC_DECODE_PARAM_FLAG_{}
> @@ -2400,7 +2403,8 @@ struct v4l2_ctrl_hevc_decode_params {
> __u8 poc_st_curr_before[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
> __u8 poc_st_curr_after[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
> __u8 poc_lt_curr[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
> - __u8 reserved[4];
> + __u8 num_delta_pocs_of_ref_rps_idx;
> + __u8 reserved[3];
> struct v4l2_hevc_dpb_entry dpb[V4L2_HEVC_DPB_ENTRIES_NUM_MAX];
> __u64 flags;
> };