msm: vidc: Add VP9 profile/level query support
VP9 profile/levels are not defined in driver. Define them
and add support to query supported profile/level for VP9.
CRs-Fixed: 2086655
Change-Id: I528679a9e20601772f444d77a0ffb4ef5597d1a3
Signed-off-by: Vaibhav Deshu Venkatesh <vdeshuve@codeaurora.org>
diff --git a/drivers/media/platform/msm/vidc/msm_vdec.c b/drivers/media/platform/msm/vidc/msm_vdec.c
index f17f3da..aa20a07 100644
--- a/drivers/media/platform/msm/vidc/msm_vdec.c
+++ b/drivers/media/platform/msm/vidc/msm_vdec.c
@@ -61,6 +61,26 @@
"3.0",
};
+static const char *const vp9_profile[] = {
+ "Unused",
+ "0",
+ "2_10",
+};
+
+static const char *const vp9_level[] = {
+ "Unused",
+ "1.0",
+ "1.1",
+ "2.0",
+ "2.1",
+ "3.0",
+ "3.1",
+ "4.0",
+ "4.1",
+ "5.0",
+ "5.1",
+};
+
static const char *const mpeg2_profile[] = {
"Simple",
"Main",
@@ -231,6 +251,28 @@
.flags = V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_READ_ONLY,
},
{
+ .id = V4L2_CID_MPEG_VIDC_VIDEO_VP9_PROFILE,
+ .name = "VP9 Profile",
+ .type = V4L2_CTRL_TYPE_MENU,
+ .minimum = V4L2_MPEG_VIDC_VIDEO_VP9_PROFILE_UNUSED,
+ .maximum = V4L2_MPEG_VIDC_VIDEO_VP9_PROFILE_P2_10,
+ .default_value = V4L2_MPEG_VIDC_VIDEO_VP9_PROFILE_P0,
+ .menu_skip_mask = 0,
+ .qmenu = vp9_profile,
+ .flags = V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_READ_ONLY,
+ },
+ {
+ .id = V4L2_CID_MPEG_VIDC_VIDEO_VP9_LEVEL,
+ .name = "VP9 Level",
+ .type = V4L2_CTRL_TYPE_MENU,
+ .minimum = V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_UNUSED,
+ .maximum = V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_51,
+ .default_value = V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_51,
+ .menu_skip_mask = 0,
+ .qmenu = vp9_level,
+ .flags = V4L2_CTRL_FLAG_VOLATILE | V4L2_CTRL_FLAG_READ_ONLY,
+ },
+ {
.id = V4L2_CID_MPEG_VIDC_VIDEO_MPEG2_PROFILE,
.name = "MPEG2 Profile",
.type = V4L2_CTRL_TYPE_MENU,
diff --git a/drivers/media/platform/msm/vidc/msm_vidc.c b/drivers/media/platform/msm/vidc/msm_vidc.c
index d08d40f..5f372c7 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc.c
@@ -182,6 +182,7 @@
case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
case V4L2_CID_MPEG_VIDC_VIDEO_HEVC_PROFILE:
case V4L2_CID_MPEG_VIDC_VIDEO_MPEG2_PROFILE:
+ case V4L2_CID_MPEG_VIDC_VIDEO_VP9_PROFILE:
{
prof_level_supported = &inst->capability.profile_level;
for (i = 0; i < prof_level_supported->profile_count; i++) {
@@ -200,6 +201,7 @@
case V4L2_CID_MPEG_VIDC_VIDEO_VP8_PROFILE_LEVEL:
case V4L2_CID_MPEG_VIDC_VIDEO_HEVC_TIER_LEVEL:
case V4L2_CID_MPEG_VIDC_VIDEO_MPEG2_LEVEL:
+ case V4L2_CID_MPEG_VIDC_VIDEO_VP9_LEVEL:
{
prof_level_supported = &inst->capability.profile_level;
for (i = 0; i < prof_level_supported->profile_count; i++) {
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_common.c b/drivers/media/platform/msm/vidc/msm_vidc_common.c
index f9972c1..6e8e1ed 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_common.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc_common.c
@@ -297,6 +297,44 @@
default:
goto unknown_value;
}
+ case V4L2_CID_MPEG_VIDC_VIDEO_VP9_PROFILE:
+ switch (value) {
+ case HAL_VP9_PROFILE_P0:
+ return V4L2_MPEG_VIDC_VIDEO_VP9_PROFILE_P0;
+ case HAL_VP9_PROFILE_P2_10:
+ return V4L2_MPEG_VIDC_VIDEO_VP9_PROFILE_P2_10;
+ case HAL_VP9_PROFILE_UNUSED:
+ return V4L2_MPEG_VIDC_VIDEO_VP9_PROFILE_UNUSED;
+ default:
+ goto unknown_value;
+ }
+ case V4L2_CID_MPEG_VIDC_VIDEO_VP9_LEVEL:
+ switch (value) {
+ case HAL_VP9_LEVEL_1:
+ return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_1;
+ case HAL_VP9_LEVEL_11:
+ return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_11;
+ case HAL_VP9_LEVEL_2:
+ return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_2;
+ case HAL_VP9_LEVEL_21:
+ return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_21;
+ case HAL_VP9_LEVEL_3:
+ return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_3;
+ case HAL_VP9_LEVEL_31:
+ return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_31;
+ case HAL_VP9_LEVEL_4:
+ return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_4;
+ case HAL_VP9_LEVEL_41:
+ return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_41;
+ case HAL_VP9_LEVEL_5:
+ return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_5;
+ case HAL_VP9_LEVEL_51:
+ return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_51;
+ case HAL_VP9_LEVEL_UNUSED:
+ return V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_UNUSED;
+ default:
+ goto unknown_value;
+ }
case V4L2_CID_MPEG_VIDC_VIDEO_MPEG2_PROFILE:
switch (value) {
case HAL_MPEG2_PROFILE_SIMPLE:
diff --git a/drivers/media/platform/msm/vidc/vidc_hfi_api.h b/drivers/media/platform/msm/vidc/vidc_hfi_api.h
index d2a59dc..a4b7276 100644
--- a/drivers/media/platform/msm/vidc/vidc_hfi_api.h
+++ b/drivers/media/platform/msm/vidc/vidc_hfi_api.h
@@ -390,6 +390,26 @@
HAL_TME_LEVEL_INTEGER = 0x00000001,
};
+enum hal_vp9_profile {
+ HAL_VP9_PROFILE_UNUSED = 0x00000000,
+ HAL_VP9_PROFILE_P0 = 0x00000001,
+ HAL_VP9_PROFILE_P2_10 = 0x00000002,
+};
+
+enum hal_vp9_level {
+ HAL_VP9_LEVEL_UNUSED = 0x00000000,
+ HAL_VP9_LEVEL_1 = 0x00000001,
+ HAL_VP9_LEVEL_11 = 0x00000002,
+ HAL_VP9_LEVEL_2 = 0x00000004,
+ HAL_VP9_LEVEL_21 = 0x00000008,
+ HAL_VP9_LEVEL_3 = 0x00000010,
+ HAL_VP9_LEVEL_31 = 0x00000020,
+ HAL_VP9_LEVEL_4 = 0x00000040,
+ HAL_VP9_LEVEL_41 = 0x00000080,
+ HAL_VP9_LEVEL_5 = 0x00000100,
+ HAL_VP9_LEVEL_51 = 0x00000200,
+};
+
struct hal_frame_rate {
enum hal_buffer buffer_type;
u32 frame_rate;
diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
index 5183111..24e93a6 100644
--- a/include/uapi/linux/v4l2-controls.h
+++ b/include/uapi/linux/v4l2-controls.h
@@ -1046,6 +1046,30 @@
#define V4L2_CID_MPEG_VIDC_VIDEO_LAYER_ID \
(V4L2_CID_MPEG_MSM_VIDC_BASE + 65)
+#define V4L2_CID_MPEG_VIDC_VIDEO_VP9_PROFILE \
+ (V4L2_CID_MPEG_MSM_VIDC_BASE + 66)
+enum v4l2_mpeg_vidc_video_vp9_profile {
+ V4L2_MPEG_VIDC_VIDEO_VP9_PROFILE_UNUSED = 0,
+ V4L2_MPEG_VIDC_VIDEO_VP9_PROFILE_P0 = 1,
+ V4L2_MPEG_VIDC_VIDEO_VP9_PROFILE_P2_10 = 2,
+};
+
+#define V4L2_CID_MPEG_VIDC_VIDEO_VP9_LEVEL \
+ (V4L2_CID_MPEG_MSM_VIDC_BASE + 67)
+enum v4l2_mpeg_vidc_video_vp9_level {
+ V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_UNUSED = 0,
+ V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_1 = 1,
+ V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_11 = 2,
+ V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_2 = 3,
+ V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_21 = 4,
+ V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_3 = 5,
+ V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_31 = 6,
+ V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_4 = 7,
+ V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_41 = 8,
+ V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_5 = 9,
+ V4L2_MPEG_VIDC_VIDEO_VP9_LEVEL_51 = 10,
+};
+
#define V4L2_CID_MPEG_VIDC_VIDEO_I_FRAME_QP \
(V4L2_CID_MPEG_MSM_VIDC_BASE + 99)
#define V4L2_CID_MPEG_VIDC_VIDEO_P_FRAME_QP \