openwrt/target/linux/bcm27xx/patches-5.15/950-0576-Pass-V4L2_CID_MPEG...

68 lines
2.2 KiB
Diff

From 3d21c93db479bf4269630676ba7d48dec9bf75fc Mon Sep 17 00:00:00 2001
From: Maxim Devaev <mdevaev@gmail.com>
Date: Wed, 17 Nov 2021 04:57:56 +0300
Subject: [PATCH] Pass V4L2_CID_MPEG_VIDEO_H264_MIN_QP/MAX_QP to
bcm2835-v4l2-codec
Following raspberrypi/linux#4704. This is necessary to set up
quantization for variable bitrate to avoid video flickering.
---
.../bcm2835-codec/bcm2835-v4l2-codec.c | 32 ++++++++++++++++++-
1 file changed, 31 insertions(+), 1 deletion(-)
--- a/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c
+++ b/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c
@@ -2187,6 +2187,28 @@ static int bcm2835_codec_s_ctrl(struct v
ret = bcm2835_codec_set_level_profile(ctx, ctrl);
break;
+ case V4L2_CID_MPEG_VIDEO_H264_MIN_QP:
+ if (!ctx->component)
+ break;
+
+ ret = vchiq_mmal_port_parameter_set(ctx->dev->instance,
+ &ctx->component->output[0],
+ MMAL_PARAMETER_VIDEO_ENCODE_MIN_QUANT,
+ &ctrl->val,
+ sizeof(ctrl->val));
+ break;
+
+ case V4L2_CID_MPEG_VIDEO_H264_MAX_QP:
+ if (!ctx->component)
+ break;
+
+ ret = vchiq_mmal_port_parameter_set(ctx->dev->instance,
+ &ctx->component->output[0],
+ MMAL_PARAMETER_VIDEO_ENCODE_MAX_QUANT,
+ &ctrl->val,
+ sizeof(ctrl->val));
+ break;
+
case V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME: {
u32 mmal_bool = 1;
@@ -3103,7 +3125,7 @@ static int bcm2835_codec_open(struct fil
case ENCODE:
{
/* Encode controls */
- v4l2_ctrl_handler_init(hdl, 9);
+ v4l2_ctrl_handler_init(hdl, 11);
v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
@@ -3152,6 +3174,14 @@ static int bcm2835_codec_open(struct fil
BIT(V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)),
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH);
v4l2_ctrl_new_std(hdl, &bcm2835_codec_ctrl_ops,
+ V4L2_CID_MPEG_VIDEO_H264_MIN_QP,
+ 0, 51,
+ 1, 20);
+ v4l2_ctrl_new_std(hdl, &bcm2835_codec_ctrl_ops,
+ V4L2_CID_MPEG_VIDEO_H264_MAX_QP,
+ 0, 51,
+ 1, 51);
+ v4l2_ctrl_new_std(hdl, &bcm2835_codec_ctrl_ops,
V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME,
0, 0, 0, 0);
if (hdl->error) {