summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Kocialkowski <paul.kocialkowski@bootlin.com>2021-01-07 14:31:37 +0100
committerMichael Grzeschik <m.grzeschik@pengutronix.de>2022-06-13 15:07:17 +0200
commitec2b92670100c6bd075ca859bc3392b5b913be27 (patch)
tree74c5dcb808a0f0964fbf241d1af1703a44079d70
parent02ef0ae921721b7470beb627f9c837fd3b34b2e5 (diff)
downloadlinux-ec2b92670100c6bd075ca859bc3392b5b913be27.tar.gz
linux-ec2b92670100c6bd075ca859bc3392b5b913be27.tar.xz
media: Introduce Hantro V4L2 H.264 stateless encoding API
Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
-rw-r--r--drivers/media/v4l2-core/v4l2-ctrls-core.c23
-rw-r--r--drivers/media/v4l2-core/v4l2-ctrls-defs.c12
-rw-r--r--include/uapi/linux/v4l2-controls.h55
-rw-r--r--include/uapi/linux/videodev2.h3
4 files changed, 93 insertions, 0 deletions
diff --git a/drivers/media/v4l2-core/v4l2-ctrls-core.c b/drivers/media/v4l2-core/v4l2-ctrls-core.c
index 949c1884d9c1..8ab11fcfc882 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls-core.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls-core.c
@@ -280,6 +280,15 @@ static void std_log(const struct v4l2_ctrl *ctrl)
case V4L2_CTRL_TYPE_H264_PRED_WEIGHTS:
pr_cont("H264_PRED_WEIGHTS");
break;
+ case V4L2_CTRL_TYPE_H264_ENCODE_PARAMS:
+ pr_cont("H264_ENCODE_PARAMS");
+ break;
+ case V4L2_CTRL_TYPE_H264_ENCODE_RC:
+ pr_cont("H264_ENCODE_RC");
+ break;
+ case V4L2_CTRL_TYPE_H264_ENCODE_FEEDBACK:
+ pr_cont("H264_ENCODE_FEEDBACK");
+ break;
case V4L2_CTRL_TYPE_FWHT_PARAMS:
pr_cont("FWHT_PARAMS");
break;
@@ -741,6 +750,11 @@ static int std_validate_compound(const struct v4l2_ctrl *ctrl, u32 idx,
zero_reserved(*p_h264_dec_params);
break;
+ case V4L2_CTRL_TYPE_H264_ENCODE_PARAMS:
+ case V4L2_CTRL_TYPE_H264_ENCODE_RC:
+ case V4L2_CTRL_TYPE_H264_ENCODE_FEEDBACK:
+ break;
+
case V4L2_CTRL_TYPE_VP8_FRAME:
p_vp8_frame = p;
@@ -1422,6 +1436,15 @@ static struct v4l2_ctrl *v4l2_ctrl_new(struct v4l2_ctrl_handler *hdl,
case V4L2_CTRL_TYPE_H264_PRED_WEIGHTS:
elem_size = sizeof(struct v4l2_ctrl_h264_pred_weights);
break;
+ case V4L2_CTRL_TYPE_H264_ENCODE_PARAMS:
+ elem_size = sizeof(struct v4l2_ctrl_h264_encode_params);
+ break;
+ case V4L2_CTRL_TYPE_H264_ENCODE_RC:
+ elem_size = sizeof(struct v4l2_ctrl_h264_encode_rc);
+ break;
+ case V4L2_CTRL_TYPE_H264_ENCODE_FEEDBACK:
+ elem_size = sizeof(struct v4l2_ctrl_h264_encode_feedback);
+ break;
case V4L2_CTRL_TYPE_VP8_FRAME:
elem_size = sizeof(struct v4l2_ctrl_vp8_frame);
break;
diff --git a/drivers/media/v4l2-core/v4l2-ctrls-defs.c b/drivers/media/v4l2-core/v4l2-ctrls-defs.c
index 16f42d2fd359..6210d1df4c75 100644
--- a/drivers/media/v4l2-core/v4l2-ctrls-defs.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls-defs.c
@@ -1181,6 +1181,9 @@ const char *v4l2_ctrl_get_name(u32 id)
case V4L2_CID_STATELESS_H264_PRED_WEIGHTS: return "H264 Prediction Weight Table";
case V4L2_CID_STATELESS_H264_SLICE_PARAMS: return "H264 Slice Parameters";
case V4L2_CID_STATELESS_H264_DECODE_PARAMS: return "H264 Decode Parameters";
+ case V4L2_CID_STATELESS_H264_ENCODE_PARAMS: return "H264 Encode Parameters";
+ case V4L2_CID_STATELESS_H264_ENCODE_RC: return "H264 Encode Rate-Control";
+ case V4L2_CID_STATELESS_H264_ENCODE_FEEDBACK: return "H264 Encode Feedback";
case V4L2_CID_STATELESS_FWHT_PARAMS: return "FWHT Stateless Parameters";
case V4L2_CID_STATELESS_VP8_FRAME: return "VP8 Frame Parameters";
case V4L2_CID_STATELESS_MPEG2_SEQUENCE: return "MPEG-2 Sequence Header";
@@ -1499,6 +1502,15 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type,
case V4L2_CID_STATELESS_H264_PRED_WEIGHTS:
*type = V4L2_CTRL_TYPE_H264_PRED_WEIGHTS;
break;
+ case V4L2_CID_STATELESS_H264_ENCODE_PARAMS:
+ *type = V4L2_CTRL_TYPE_H264_ENCODE_PARAMS;
+ break;
+ case V4L2_CID_STATELESS_H264_ENCODE_RC:
+ *type = V4L2_CTRL_TYPE_H264_ENCODE_RC;
+ break;
+ case V4L2_CID_STATELESS_H264_ENCODE_FEEDBACK:
+ *type = V4L2_CTRL_TYPE_H264_ENCODE_FEEDBACK;
+ break;
case V4L2_CID_STATELESS_VP8_FRAME:
*type = V4L2_CTRL_TYPE_VP8_FRAME;
break;
diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
index dfff69ed88f7..4430f5cb2212 100644
--- a/include/uapi/linux/v4l2-controls.h
+++ b/include/uapi/linux/v4l2-controls.h
@@ -1618,6 +1618,61 @@ struct v4l2_ctrl_h264_decode_params {
__u32 flags;
};
+#define V4L2_CID_STATELESS_H264_ENCODE_PARAMS (V4L2_CID_CODEC_STATELESS_BASE + 8)
+
+struct v4l2_ctrl_h264_encode_params {
+ /* Slice parameters */
+
+ __u8 slice_type;
+ __u8 pic_parameter_set_id;
+ __u16 frame_num;
+ __u16 idr_pic_id;
+ __u8 cabac_init_idc;
+ __u8 disable_deblocking_filter_idc;
+ __s8 slice_alpha_c0_offset_div2;
+ __s8 slice_beta_offset_div2;
+
+ __s32 slice_size_mb_rows;
+
+ /* PPS parameters */
+
+ __s8 pic_init_qp_minus26;
+ __s8 chroma_qp_index_offset;
+
+ __u32 flags; /* V4L2_H264_ENCODE_FLAG_ */
+
+ /* Reference */
+
+ __u64 reference_ts;
+};
+
+#define V4L2_H264_ENCODE_FLAG_ENTROPY_CODING_MODE 0x01
+#define V4L2_H264_ENCODE_FLAG_TRANSFORM_8X8_MODE 0x02
+#define V4L2_H264_ENCODE_FLAG_CONSTRAINED_INTRA_PRED 0x04
+
+#define V4L2_CID_STATELESS_H264_ENCODE_RC (V4L2_CID_CODEC_STATELESS_BASE + 9)
+
+struct v4l2_ctrl_h264_encode_rc {
+ __u32 qp;
+ __u32 qp_min;
+ __u32 qp_max;
+ __s32 mad_qp_delta;
+ __u32 mad_threshold;
+
+ __u32 cp_distance_mbs;
+ __u32 cp_target[10];
+ __s32 cp_target_error[6];
+ __s32 cp_qp_delta[7];
+};
+
+#define V4L2_CID_STATELESS_H264_ENCODE_FEEDBACK (V4L2_CID_CODEC_STATELESS_BASE + 10)
+
+struct v4l2_ctrl_h264_encode_feedback {
+ __u32 qp_sum;
+ __u32 cp[10];
+ __u32 mad_count;
+ __u32 rlc_count;
+};
/* Stateless FWHT control, used by the vicodec driver */
diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
index 343b95107fce..00a06590ba89 100644
--- a/include/uapi/linux/videodev2.h
+++ b/include/uapi/linux/videodev2.h
@@ -1823,6 +1823,9 @@ enum v4l2_ctrl_type {
V4L2_CTRL_TYPE_H264_SLICE_PARAMS = 0x0203,
V4L2_CTRL_TYPE_H264_DECODE_PARAMS = 0x0204,
V4L2_CTRL_TYPE_H264_PRED_WEIGHTS = 0x0205,
+ V4L2_CTRL_TYPE_H264_ENCODE_PARAMS = 0x0206,
+ V4L2_CTRL_TYPE_H264_ENCODE_RC = 0x0207,
+ V4L2_CTRL_TYPE_H264_ENCODE_FEEDBACK = 0x0208,
V4L2_CTRL_TYPE_FWHT_PARAMS = 0x0220,