Define which HEVC profiles (up to level 5.1) and features
(no scaling, no 10 bits) are supported by the driver.

Signed-off-by: Benjamin Gaignard <benjamin.gaign...@collabora.com>
Reviewed-by: Ezequiel Garcia <ezequ...@collabora.com>
---
 drivers/staging/media/hantro/hantro.h     |  3 ++
 drivers/staging/media/hantro/hantro_drv.c | 58 +++++++++++++++++++++++
 2 files changed, 61 insertions(+)

diff --git a/drivers/staging/media/hantro/hantro.h 
b/drivers/staging/media/hantro/hantro.h
index 6c1b888abe75..4368c0962768 100644
--- a/drivers/staging/media/hantro/hantro.h
+++ b/drivers/staging/media/hantro/hantro.h
@@ -34,6 +34,7 @@ struct hantro_codec_ops;
 #define HANTRO_MPEG2_DECODER   BIT(16)
 #define HANTRO_VP8_DECODER     BIT(17)
 #define HANTRO_H264_DECODER    BIT(18)
+#define HANTRO_HEVC_DECODER    BIT(19)
 #define HANTRO_DECODERS                0xffff0000
 
 /**
@@ -99,6 +100,7 @@ struct hantro_variant {
  * @HANTRO_MODE_H264_DEC: H264 decoder.
  * @HANTRO_MODE_MPEG2_DEC: MPEG-2 decoder.
  * @HANTRO_MODE_VP8_DEC: VP8 decoder.
+ * @HANTRO_MODE_HEVC_DEC: HEVC decoder.
  */
 enum hantro_codec_mode {
        HANTRO_MODE_NONE = -1,
@@ -106,6 +108,7 @@ enum hantro_codec_mode {
        HANTRO_MODE_H264_DEC,
        HANTRO_MODE_MPEG2_DEC,
        HANTRO_MODE_VP8_DEC,
+       HANTRO_MODE_HEVC_DEC,
 };
 
 /*
diff --git a/drivers/staging/media/hantro/hantro_drv.c 
b/drivers/staging/media/hantro/hantro_drv.c
index 02c5c2f1a88b..d9a3a5ef9330 100644
--- a/drivers/staging/media/hantro/hantro_drv.c
+++ b/drivers/staging/media/hantro/hantro_drv.c
@@ -245,6 +245,18 @@ static int hantro_try_ctrl(struct v4l2_ctrl *ctrl)
                if (sps->bit_depth_luma_minus8 != 0)
                        /* Only 8-bit is supported */
                        return -EINVAL;
+       } else if (ctrl->id == V4L2_CID_MPEG_VIDEO_HEVC_SPS) {
+               const struct v4l2_ctrl_hevc_sps *sps = ctrl->p_new.p_hevc_sps;
+
+               if (sps->bit_depth_luma_minus8 != sps->bit_depth_chroma_minus8)
+                       /* Luma and chroma bit depth mismatch */
+                       return -EINVAL;
+               if (sps->bit_depth_luma_minus8 != 0)
+                       /* Only 8-bit is supported */
+                       return -EINVAL;
+               if (sps->flags & V4L2_HEVC_SPS_FLAG_SCALING_LIST_ENABLED)
+                       /* No scaling support */
+                       return -EINVAL;
        }
        return 0;
 }
@@ -351,6 +363,52 @@ static const struct hantro_ctrl controls[] = {
                        .def = V4L2_MPEG_VIDEO_H264_PROFILE_MAIN,
                }
        }, {
+               .codec = HANTRO_HEVC_DECODER,
+               .cfg = {
+                       .id = V4L2_CID_MPEG_VIDEO_HEVC_DECODE_MODE,
+                       .min = V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_FRAME_BASED,
+                       .max = V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_FRAME_BASED,
+                       .def = V4L2_MPEG_VIDEO_HEVC_DECODE_MODE_FRAME_BASED,
+               },
+       }, {
+               .codec = HANTRO_HEVC_DECODER,
+               .cfg = {
+                       .id = V4L2_CID_MPEG_VIDEO_HEVC_START_CODE,
+                       .min = V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B,
+                       .max = V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B,
+                       .def = V4L2_MPEG_VIDEO_HEVC_START_CODE_ANNEX_B,
+               },
+       }, {
+               .codec = HANTRO_HEVC_DECODER,
+               .cfg = {
+                       .id = V4L2_CID_MPEG_VIDEO_HEVC_PROFILE,
+                       .min = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
+                       .max = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10,
+                       .def = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
+               },
+       }, {
+               .codec = HANTRO_HEVC_DECODER,
+               .cfg = {
+                       .id = V4L2_CID_MPEG_VIDEO_HEVC_LEVEL,
+                       .min = V4L2_MPEG_VIDEO_HEVC_LEVEL_1,
+                       .max = V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1,
+               },
+       }, {
+               .codec = HANTRO_HEVC_DECODER,
+               .cfg = {
+                       .id = V4L2_CID_MPEG_VIDEO_HEVC_SPS,
+                       .ops = &hantro_ctrl_ops,
+               },
+       }, {
+               .codec = HANTRO_HEVC_DECODER,
+               .cfg = {
+                       .id = V4L2_CID_MPEG_VIDEO_HEVC_PPS,
+               },
+       }, {
+               .codec = HANTRO_HEVC_DECODER,
+               .cfg = {
+                       .id = V4L2_CID_MPEG_VIDEO_HEVC_DECODE_PARAMS,
+               },
        },
 };
 
-- 
2.25.1

Reply via email to