Revert "ampere iter2: HEVC EXT_SPS_ST_RPS / _LT_RPS dynamic-array submission (VDPU381)"

This reverts commit f61f736380.
This commit is contained in:
2026-05-17 09:48:29 +00:00
parent f61f736380
commit a8a91d92d6
4 changed files with 3 additions and 135 deletions
+2 -65
View File
@@ -77,9 +77,7 @@
#include <sys/mman.h>
#include <linux/videodev2.h>
/* iter2: use local hevc-ctrls shim — adds EXT_SPS_ST_RPS / _LT_RPS
* fallback defs guarded by #ifndef when linux-api-headers < 7.0. */
#include <hevc-ctrls.h>
#include <linux/v4l2-controls.h>
#include "utils.h"
#include "v4l2.h"
@@ -601,9 +599,7 @@ int h265_set_controls(struct request_data *driver_data,
struct v4l2_ctrl_hevc_scaling_matrix scaling_matrix;
struct v4l2_ctrl_hevc_slice_params *slice_params_array = NULL;
struct v4l2_ext_control controls[7];
struct v4l2_ctrl_hevc_ext_sps_st_rps *ext_st_rps = NULL;
struct v4l2_ctrl_hevc_ext_sps_lt_rps *ext_lt_rps = NULL;
struct v4l2_ext_control controls[5];
unsigned int n = 0;
unsigned int i;
unsigned int prefix_bytes;
@@ -694,70 +690,11 @@ int h265_set_controls(struct request_data *driver_data,
.size = sizeof(decode_params),
};
/*
* iter2 (ampere-fourier): on VDPU381/383 (has_ext_sps_rps probed at
* CreateContext via VIDIOC_QUERY_EXT_CTRL), submit EXT_SPS_ST_RPS +
* EXT_SPS_LT_RPS as zero-initialized dynamic arrays sized by the
* VAAPI SPS counts (capped at H.265 §7.4.3.2 spec maxima: ST 64, LT
* 32). The kernel registered these dynamic-array controls with
* cfg.dims = { 65 } (vdpu38x_hevc_ctrl_descs); the framework
* init-allocates 1 zeroed element. When num_short_term_ref_pic_sets
* > 1, rkvdec_hevc_prepare_hw_st_rps iterates idx 0..N-1 and the
* single-element kernel allocation triggers an out-of-bounds OOPS.
* Submitting an N-element control extends the framework allocation.
*
* Decode correctness for non-IDR content: VAAPI does NOT expose the
* per-set st_ref_pic_set syntax elements (delta_idx_minus1 etc.) —
* confirmed in va_dec_hevc.h. Submission of all-zero entries gives
* empty inter-pred RPS per set, which is correct for IDR-only
* streams and incorrect for streams with inter-pred RPS dependence.
* iter2 acceptance: stop the OOPS. Decode-correctness for inter-RPS
* streams is a known follow-up.
*/
if (driver_data->has_ext_sps_rps) {
unsigned int n_st = picture->num_short_term_ref_pic_sets;
unsigned int n_lt = picture->num_long_term_ref_pic_sps;
if (n_st > 64)
n_st = 64;
if (n_lt > 32)
n_lt = 32;
if (n_st == 0)
n_st = 1; /* dynamic-array minimum; kernel rejects 0 */
if (n_lt == 0)
n_lt = 1;
ext_st_rps = calloc(n_st,
sizeof(struct v4l2_ctrl_hevc_ext_sps_st_rps));
ext_lt_rps = calloc(n_lt,
sizeof(struct v4l2_ctrl_hevc_ext_sps_lt_rps));
if (ext_st_rps == NULL || ext_lt_rps == NULL) {
free(slice_params_array);
free(ext_st_rps);
free(ext_lt_rps);
return VA_STATUS_ERROR_ALLOCATION_FAILED;
}
controls[n++] = (struct v4l2_ext_control){
.id = V4L2_CID_STATELESS_HEVC_EXT_SPS_ST_RPS,
.ptr = ext_st_rps,
.size = n_st *
sizeof(struct v4l2_ctrl_hevc_ext_sps_st_rps),
};
controls[n++] = (struct v4l2_ext_control){
.id = V4L2_CID_STATELESS_HEVC_EXT_SPS_LT_RPS,
.ptr = ext_lt_rps,
.size = n_lt *
sizeof(struct v4l2_ctrl_hevc_ext_sps_lt_rps),
};
}
rc = v4l2_set_controls(driver_data->video_fd,
surface_object->request_fd,
controls, n);
free(slice_params_array);
free(ext_st_rps);
free(ext_lt_rps);
if (rc < 0)
return VA_STATUS_ERROR_OPERATION_FAILED;