media: s5p-mfc: Add support for UHD encoding.
authorAakarsh Jain <aakarsh.jain@samsung.com>
Wed, 13 Dec 2023 08:11:01 +0000 (13:41 +0530)
committerHans Verkuil <hverkuil-cisco@xs4all.nl>
Wed, 13 Dec 2023 13:33:49 +0000 (14:33 +0100)
MFC driver had restriction on max resolution of 1080p, updated it for
UHD. Added corresponding support to set recommended profile and level
for H264 in UHD scenario.

Cc: linux-fsd@tesla.com
Signed-off-by: Smitha T Murthy <smithatmurthy@gmail.com>
Signed-off-by: Aakarsh Jain <aakarsh.jain@samsung.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
drivers/media/platform/samsung/s5p-mfc/s5p_mfc_enc.c
drivers/media/platform/samsung/s5p-mfc/s5p_mfc_opr_v6.c

index 2f11a1e861e128990dff603e705de22b2207f60a..67fe0302464fa3f834df027624d946945abdc18d 100644 (file)
@@ -1461,9 +1461,12 @@ static int vidioc_try_fmt(struct file *file, void *priv, struct v4l2_format *f)
                        mfc_err("Unsupported format by this MFC version.\n");
                        return -EINVAL;
                }
-
-               v4l_bound_align_image(&pix_fmt_mp->width, 8, 1920, 1,
-                       &pix_fmt_mp->height, 4, 1080, 1, 0);
+               if (IS_MFCV12(dev))
+                       v4l_bound_align_image(&pix_fmt_mp->width, 8, 3840, 1, &pix_fmt_mp
+                                       ->height, 4, 2160, 1, 0);
+               else
+                       v4l_bound_align_image(&pix_fmt_mp->width, 8, 1920, 1, &pix_fmt_mp
+                                       ->height, 4, 1080, 1, 0);
        } else {
                mfc_err("invalid buf type\n");
                return -EINVAL;
index 4a0d0e228e78b76e8ce3062e8ff7a8b561338712..572293f3b1903d178c1114ef2a570b6fc0d4efc1 100644 (file)
@@ -1071,6 +1071,18 @@ static int s5p_mfc_set_enc_params_h264(struct s5p_mfc_ctx *ctx)
        reg |= ((p->num_b_frame & 0x3) << 16);
        writel(reg, mfc_regs->e_gop_config);
 
+       /* UHD encoding case */
+       if (ctx->img_width == 3840 && ctx->img_height == 2160) {
+               if (p_h264->level < 51) {
+                       mfc_debug(2, "Set Level 5.1 for UHD\n");
+                       p_h264->level = 51;
+               }
+               if (p_h264->profile != 0x2) {
+                       mfc_debug(2, "Set High profile for UHD\n");
+                       p_h264->profile = 0x2;
+               }
+       }
+
        /* profile & level */
        reg = 0;
        /** level */