1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
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) {
|