media: hantro: Stop using Hantro dedicated control
authorBenjamin Gaignard <benjamin.gaignard@collabora.com>
Fri, 8 Jul 2022 16:21:53 +0000 (17:21 +0100)
committerMauro Carvalho Chehab <mchehab@kernel.org>
Fri, 15 Jul 2022 16:36:58 +0000 (17:36 +0100)
The number of bits to skip in the slice header can be computed
in the driver by using sps, pps and decode_params information.
This makes it possible to remove Hantro dedicated control.

Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>
Reviewed-by: Ezequiel Garcia <ezequiel@vanguardiasur.com.ar>
Acked-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
Tested-by: Jernej Skrabec <jernej.skrabec@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
drivers/staging/media/hantro/hantro_drv.c
drivers/staging/media/hantro/hantro_g2_hevc_dec.c
include/media/hevc-ctrls.h

index 1a62c56..e355496 100644 (file)
@@ -304,26 +304,6 @@ static int hantro_jpeg_s_ctrl(struct v4l2_ctrl *ctrl)
        return 0;
 }
 
-static int hantro_hevc_s_ctrl(struct v4l2_ctrl *ctrl)
-{
-       struct hantro_ctx *ctx;
-
-       ctx = container_of(ctrl->handler,
-                          struct hantro_ctx, ctrl_handler);
-
-       vpu_debug(1, "s_ctrl: id = %d, val = %d\n", ctrl->id, ctrl->val);
-
-       switch (ctrl->id) {
-       case V4L2_CID_HANTRO_HEVC_SLICE_HEADER_SKIP:
-               ctx->hevc_dec.ctrls.hevc_hdr_skip_length = ctrl->val;
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
 static const struct v4l2_ctrl_ops hantro_ctrl_ops = {
        .try_ctrl = hantro_try_ctrl,
 };
@@ -332,10 +312,6 @@ static const struct v4l2_ctrl_ops hantro_jpeg_ctrl_ops = {
        .s_ctrl = hantro_jpeg_s_ctrl,
 };
 
-static const struct v4l2_ctrl_ops hantro_hevc_ctrl_ops = {
-       .s_ctrl = hantro_hevc_s_ctrl,
-};
-
 #define HANTRO_JPEG_ACTIVE_MARKERS     (V4L2_JPEG_ACTIVE_MARKER_APP0 | \
                                         V4L2_JPEG_ACTIVE_MARKER_COM | \
                                         V4L2_JPEG_ACTIVE_MARKER_DQT | \
@@ -488,18 +464,6 @@ static const struct hantro_ctrl controls[] = {
                        .id = V4L2_CID_STATELESS_HEVC_SCALING_MATRIX,
                },
        }, {
-               .codec = HANTRO_HEVC_DECODER,
-               .cfg = {
-                       .id = V4L2_CID_HANTRO_HEVC_SLICE_HEADER_SKIP,
-                       .name = "Hantro HEVC slice header skip bytes",
-                       .type = V4L2_CTRL_TYPE_INTEGER,
-                       .min = 0,
-                       .def = 0,
-                       .max = 0x100,
-                       .step = 1,
-                       .ops = &hantro_hevc_ctrl_ops,
-               },
-       }, {
                .codec = HANTRO_VP9_DECODER,
                .cfg = {
                        .id = V4L2_CID_STATELESS_VP9_FRAME,
index d28653d..233ecd8 100644 (file)
@@ -117,6 +117,41 @@ static void prepare_tile_info_buffer(struct hantro_ctx *ctx)
                vpu_debug(1, "%s: no chroma!\n", __func__);
 }
 
+static int compute_header_skip_length(struct hantro_ctx *ctx)
+{
+       const struct hantro_hevc_dec_ctrls *ctrls = &ctx->hevc_dec.ctrls;
+       const struct v4l2_ctrl_hevc_decode_params *decode_params = ctrls->decode_params;
+       const struct v4l2_ctrl_hevc_sps *sps = ctrls->sps;
+       const struct v4l2_ctrl_hevc_pps *pps = ctrls->pps;
+       int skip = 0;
+
+       if (pps->flags & V4L2_HEVC_PPS_FLAG_OUTPUT_FLAG_PRESENT)
+               /* size of pic_output_flag */
+               skip++;
+
+       if (sps->flags & V4L2_HEVC_SPS_FLAG_SEPARATE_COLOUR_PLANE)
+               /* size of pic_order_cnt_lsb */
+               skip += 2;
+
+       if (!(decode_params->flags & V4L2_HEVC_DECODE_PARAM_FLAG_IDR_PIC)) {
+               /* size of pic_order_cnt_lsb */
+               skip += sps->log2_max_pic_order_cnt_lsb_minus4 + 4;
+
+               /* size of short_term_ref_pic_set_sps_flag */
+               skip++;
+
+               if (decode_params->short_term_ref_pic_set_size)
+                       /* size of st_ref_pic_set( num_short_term_ref_pic_sets ) */
+                       skip += decode_params->short_term_ref_pic_set_size;
+               else if (sps->num_short_term_ref_pic_sets > 1)
+                       skip += fls(sps->num_short_term_ref_pic_sets - 1);
+
+               skip += decode_params->long_term_ref_pic_set_size;
+       }
+
+       return skip;
+}
+
 static void set_params(struct hantro_ctx *ctx)
 {
        const struct hantro_hevc_dec_ctrls *ctrls = &ctx->hevc_dec.ctrls;
@@ -134,7 +169,7 @@ static void set_params(struct hantro_ctx *ctx)
 
        hantro_reg_write(vpu, &g2_output_8_bits, 0);
 
-       hantro_reg_write(vpu, &g2_hdr_skip_length, ctrls->hevc_hdr_skip_length);
+       hantro_reg_write(vpu, &g2_hdr_skip_length, compute_header_skip_length(ctx));
 
        min_log2_cb_size = sps->log2_min_luma_coding_block_size_minus3 + 3;
        max_log2_ctb_size = min_log2_cb_size + sps->log2_diff_max_min_luma_coding_block_size;
index 42d16e8..9239e8b 100644 (file)
@@ -465,17 +465,4 @@ struct v4l2_ctrl_hevc_scaling_matrix {
        __u8    scaling_list_dc_coef_32x32[2];
 };
 
-/*  MPEG-class control IDs specific to the Hantro driver as defined by V4L2 */
-#define V4L2_CID_CODEC_HANTRO_BASE                             (V4L2_CTRL_CLASS_CODEC | 0x1200)
-/*
- * V4L2_CID_HANTRO_HEVC_SLICE_HEADER_SKIP -
- * the number of data (in bits) to skip in the
- * slice segment header.
- * If non-IDR, the bits to be skipped go from syntax element "pic_output_flag"
- * to before syntax element "slice_temporal_mvp_enabled_flag".
- * If IDR, the skipped bits are just "pic_output_flag"
- * (separate_colour_plane_flag is not supported).
- */
-#define V4L2_CID_HANTRO_HEVC_SLICE_HEADER_SKIP (V4L2_CID_CODEC_HANTRO_BASE + 0)
-
 #endif