Pass V4L2_CID_MPEG_VIDEO_H264_MIN_QP/MAX_QP to bcm2835-v4l2-codec
authorMaxim Devaev <mdevaev@gmail.com>
Wed, 17 Nov 2021 01:57:56 +0000 (04:57 +0300)
committerPhil Elwell <8911409+pelwell@users.noreply.github.com>
Thu, 25 Nov 2021 15:07:03 +0000 (15:07 +0000)
Following raspberrypi/linux#4704. This is necessary to set up
quantization for variable bitrate to avoid video flickering.

drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c

index 351d693..357c059 100644 (file)
@@ -2187,6 +2187,28 @@ static int bcm2835_codec_s_ctrl(struct v4l2_ctrl *ctrl)
                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;
 
@@ -3111,7 +3133,7 @@ static int bcm2835_codec_open(struct file *file)
        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,
@@ -3160,6 +3182,14 @@ static int bcm2835_codec_open(struct file *file)
                                         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) {