msm: vidc: Add support for TME
Expose TME functionality as an additional
codec type for encoder output.
Change-Id: I06947fb1a7d064bf93d7bcf83d103c594a7f6d99
Signed-off-by: Surajit Podder <spodder@codeaurora.org>
diff --git a/drivers/media/platform/msm/vidc/hfi_packetization.c b/drivers/media/platform/msm/vidc/hfi_packetization.c
index 32e79f2..5e13597 100644
--- a/drivers/media/platform/msm/vidc/hfi_packetization.c
+++ b/drivers/media/platform/msm/vidc/hfi_packetization.c
@@ -164,6 +164,9 @@
case HFI_VIDEO_CODEC_VP9:
hal_codec = HAL_VIDEO_CODEC_VP9;
break;
+ case HFI_VIDEO_CODEC_TME:
+ hal_codec = HAL_VIDEO_CODEC_TME;
+ break;
default:
dprintk(VIDC_INFO, "%s: invalid codec 0x%x\n",
__func__, hfi_codec);
@@ -220,6 +223,9 @@
case HAL_VIDEO_CODEC_VP9:
hfi_codec = HFI_VIDEO_CODEC_VP9;
break;
+ case HAL_VIDEO_CODEC_TME:
+ hfi_codec = HFI_VIDEO_CODEC_TME;
+ break;
default:
dprintk(VIDC_INFO, "%s: invalid codec 0x%x\n",
__func__, hal_codec);
diff --git a/drivers/media/platform/msm/vidc/hfi_response_handler.c b/drivers/media/platform/msm/vidc/hfi_response_handler.c
index e5d1576..e7f9737 100644
--- a/drivers/media/platform/msm/vidc/hfi_response_handler.c
+++ b/drivers/media/platform/msm/vidc/hfi_response_handler.c
@@ -969,6 +969,15 @@
num_properties--;
break;
}
+ case HFI_PROPERTY_TME_VERSION_SUPPORTED:
+ {
+ capabilities->tme_version =
+ *((u32 *)(data_ptr + next_offset));
+ next_offset +=
+ sizeof(u32);
+ num_properties--;
+ break;
+ }
default:
dprintk(VIDC_DBG,
"%s: default case - data_ptr %pK, prop_id 0x%x\n",
diff --git a/drivers/media/platform/msm/vidc/msm_venc.c b/drivers/media/platform/msm/vidc/msm_venc.c
index 5c587e2..bf22fa5 100644
--- a/drivers/media/platform/msm/vidc/msm_venc.c
+++ b/drivers/media/platform/msm/vidc/msm_venc.c
@@ -117,6 +117,17 @@
"Level unknown",
};
+static const char *const tme_profile[] = {
+ "0",
+ "1",
+ "2",
+ "3",
+};
+
+static const char *const tme_level[] = {
+ "Integer",
+};
+
static const char *const hevc_profile[] = {
"Main",
"Main10",
@@ -486,6 +497,46 @@
.qmenu = hevc_tier_level,
},
{
+ .id = V4L2_CID_MPEG_VIDC_VIDEO_TME_PROFILE,
+ .name = "TME Profile",
+ .type = V4L2_CTRL_TYPE_MENU,
+ .minimum = V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_0,
+ .maximum = V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_3,
+ .default_value =
+ V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_0,
+ .menu_skip_mask = ~(
+ (1 << V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_0) |
+ (1 << V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_1) |
+ (1 << V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_2) |
+ (1 << V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_3)
+ ),
+ .qmenu = tme_profile,
+ },
+ {
+ .id = V4L2_CID_MPEG_VIDC_VIDEO_TME_LEVEL,
+ .name = "TME Level",
+ .type = V4L2_CTRL_TYPE_MENU,
+ .minimum = V4L2_MPEG_VIDC_VIDEO_TME_LEVEL_INTEGER,
+ .maximum = V4L2_MPEG_VIDC_VIDEO_TME_LEVEL_INTEGER,
+ .default_value = V4L2_MPEG_VIDC_VIDEO_TME_LEVEL_INTEGER,
+ .menu_skip_mask = ~(
+ (1 << V4L2_MPEG_VIDC_VIDEO_TME_LEVEL_INTEGER)
+ ),
+ .qmenu = tme_level,
+ },
+ {
+ .id = V4L2_CID_MPEG_VIDC_VIDEO_TME_PAYLOAD_VERSION,
+ .name = "TME Payload Version",
+ .type = V4L2_CTRL_TYPE_INTEGER,
+ .minimum = 0,
+ .maximum = 0xFFFFFFF,
+ .default_value = 0,
+ .step = 1,
+ .menu_skip_mask = 0,
+ .flags = V4L2_CTRL_FLAG_READ_ONLY,
+ .qmenu = NULL,
+ },
+ {
.id = V4L2_CID_MPEG_VIDC_VIDEO_ROTATION,
.name = "Rotation",
.type = V4L2_CTRL_TYPE_MENU,
@@ -1064,6 +1115,13 @@
.get_frame_size = get_frame_size_tp10_ubwc,
.type = OUTPUT_PORT,
},
+ {
+ .name = "TME",
+ .description = "TME MBI format",
+ .fourcc = V4L2_PIX_FMT_TME,
+ .get_frame_size = get_frame_size_compressed,
+ .type = CAPTURE_PORT,
+ },
};
static int msm_venc_set_csc(struct msm_vidc_inst *inst);
@@ -1345,6 +1403,29 @@
temp_ctrl->val);
pdata = &profile_level;
break;
+ case V4L2_CID_MPEG_VIDC_VIDEO_TME_PROFILE:
+ temp_ctrl =
+ TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_TME_LEVEL);
+
+ property_id = HAL_PARAM_PROFILE_LEVEL_CURRENT;
+ profile_level.profile = msm_comm_v4l2_to_hal(ctrl->id,
+ ctrl->val);
+ profile_level.level = msm_comm_v4l2_to_hal(
+ V4L2_CID_MPEG_VIDC_VIDEO_TME_LEVEL,
+ temp_ctrl->val);
+ pdata = &profile_level;
+ break;
+ case V4L2_CID_MPEG_VIDC_VIDEO_TME_LEVEL:
+ temp_ctrl = TRY_GET_CTRL(V4L2_CID_MPEG_VIDC_VIDEO_TME_PROFILE);
+
+ property_id = HAL_PARAM_PROFILE_LEVEL_CURRENT;
+ profile_level.level = msm_comm_v4l2_to_hal(ctrl->id,
+ ctrl->val);
+ profile_level.profile = msm_comm_v4l2_to_hal(
+ V4L2_CID_MPEG_VIDC_VIDEO_TME_PROFILE,
+ temp_ctrl->val);
+ pdata = &profile_level;
+ break;
case V4L2_CID_MPEG_VIDC_VIDEO_ROTATION:
{
property_id = HAL_PARAM_VPE_ROTATION;
diff --git a/drivers/media/platform/msm/vidc/msm_vidc.c b/drivers/media/platform/msm/vidc/msm_vidc.c
index 427568c..76d69be 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc.c
@@ -1401,6 +1401,9 @@
}
ctrl->val = bufreq->buffer_count_min_host;
break;
+ case V4L2_CID_MPEG_VIDC_VIDEO_TME_PAYLOAD_VERSION:
+ ctrl->val = inst->capability.tme_version;
+ break;
default:
/*
* Other controls aren't really volatile, shouldn't need to
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_common.c b/drivers/media/platform/msm/vidc/msm_vidc_common.c
index ee538a9..867f9f5 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_common.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc_common.c
@@ -492,6 +492,26 @@
default:
goto unknown_value;
}
+ case V4L2_CID_MPEG_VIDC_VIDEO_TME_PROFILE:
+ switch (value) {
+ case V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_0:
+ return HAL_TME_PROFILE_0;
+ case V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_1:
+ return HAL_TME_PROFILE_1;
+ case V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_2:
+ return HAL_TME_PROFILE_2;
+ case V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_3:
+ return HAL_TME_PROFILE_3;
+ default:
+ goto unknown_value;
+ }
+ case V4L2_CID_MPEG_VIDC_VIDEO_TME_LEVEL:
+ switch (value) {
+ case V4L2_MPEG_VIDC_VIDEO_TME_LEVEL_INTEGER:
+ return HAL_TME_LEVEL_INTEGER;
+ default:
+ goto unknown_value;
+ }
case V4L2_CID_MPEG_VIDC_VIDEO_ROTATION:
switch (value) {
case V4L2_CID_MPEG_VIDC_VIDEO_ROTATION_NONE:
@@ -795,7 +815,6 @@
case V4L2_PIX_FMT_H264_MVC:
codec = HAL_VIDEO_CODEC_MVC;
break;
-
case V4L2_PIX_FMT_MPEG1:
codec = HAL_VIDEO_CODEC_MPEG1;
break;
@@ -811,6 +830,9 @@
case V4L2_PIX_FMT_HEVC:
codec = HAL_VIDEO_CODEC_HEVC;
break;
+ case V4L2_PIX_FMT_TME:
+ codec = HAL_VIDEO_CODEC_TME;
+ break;
default:
dprintk(VIDC_ERR, "Wrong codec: %d\n", fourcc);
codec = HAL_UNUSED_CODEC;
@@ -1260,6 +1282,9 @@
static void msm_vidc_comm_update_ctrl_limits(struct msm_vidc_inst *inst)
{
if (inst->session_type == MSM_VIDC_ENCODER) {
+ if (get_hal_codec(inst->fmts[CAPTURE_PORT].fourcc) ==
+ HAL_VIDEO_CODEC_TME)
+ return;
msm_vidc_comm_update_ctrl(inst,
V4L2_CID_MPEG_VIDC_VIDEO_HYBRID_HIERP_MODE,
&inst->capability.hier_p_hybrid);
@@ -5520,7 +5545,9 @@
dprintk(VIDC_PROF, "reported fps changed for %pK: %d->%d\n",
inst, inst->prop.fps, fps);
inst->prop.fps = fps;
- if (inst->session_type == MSM_VIDC_ENCODER) {
+ if (inst->session_type == MSM_VIDC_ENCODER &&
+ get_hal_codec(inst->fmts[CAPTURE_PORT].fourcc) !=
+ HAL_VIDEO_CODEC_TME) {
frame_rate.frame_rate = inst->prop.fps * BIT(16);
frame_rate.buffer_type = HAL_BUFFER_OUTPUT;
pdata = &frame_rate;
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_platform.c b/drivers/media/platform/msm/vidc/msm_vidc_platform.c
index 8a701cb..f70a13d 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_platform.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc_platform.c
@@ -44,6 +44,7 @@
CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_ENCODER, 125, 675, 320),
CODEC_ENTRY(V4L2_PIX_FMT_HEVC, MSM_VIDC_ENCODER, 125, 675, 320),
CODEC_ENTRY(V4L2_PIX_FMT_VP8, MSM_VIDC_ENCODER, 125, 675, 320),
+ CODEC_ENTRY(V4L2_PIX_FMT_TME, MSM_VIDC_ENCODER, 125, 675, 320),
CODEC_ENTRY(V4L2_PIX_FMT_MPEG2, MSM_VIDC_DECODER, 50, 200, 200),
CODEC_ENTRY(V4L2_PIX_FMT_H264, MSM_VIDC_DECODER, 50, 200, 200),
CODEC_ENTRY(V4L2_PIX_FMT_HEVC, MSM_VIDC_DECODER, 50, 200, 200),
diff --git a/drivers/media/platform/msm/vidc/vidc_hfi_api.h b/drivers/media/platform/msm/vidc/vidc_hfi_api.h
index fbd3b02..972cebf 100644
--- a/drivers/media/platform/msm/vidc/vidc_hfi_api.h
+++ b/drivers/media/platform/msm/vidc/vidc_hfi_api.h
@@ -273,6 +273,7 @@
HAL_VIDEO_CODEC_VP8 = 0x00001000,
HAL_VIDEO_CODEC_HEVC = 0x00002000,
HAL_VIDEO_CODEC_VP9 = 0x00004000,
+ HAL_VIDEO_CODEC_TME = 0x00008000,
HAL_VIDEO_CODEC_HEVC_HYBRID = 0x80000000,
HAL_UNUSED_CODEC = 0x10000000,
};
@@ -385,6 +386,17 @@
HAL_VPX_LEVEL_VERSION_3 = 0x00000008,
};
+enum hal_tme_profile {
+ HAL_TME_PROFILE_0 = 0x00000001,
+ HAL_TME_PROFILE_1 = 0x00000002,
+ HAL_TME_PROFILE_2 = 0x00000004,
+ HAL_TME_PROFILE_3 = 0x00000008,
+};
+
+enum hal_tme_level {
+ HAL_TME_LEVEL_INTEGER = 0x00000001,
+};
+
struct hal_frame_rate {
enum hal_buffer buffer_type;
u32 frame_rate;
@@ -1203,6 +1215,7 @@
enum buffer_mode_type alloc_mode_out;
enum buffer_mode_type alloc_mode_in;
u32 pixelprocess_capabilities;
+ u32 tme_version;
};
struct vidc_hal_sys_init_done {
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
index 1d1928a..5e7595c 100644
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
@@ -1367,6 +1367,8 @@
descr = "HEVC"; break;
case V4L2_PIX_FMT_VP9:
descr = "VP9"; break;
+ case V4L2_PIX_FMT_TME:
+ descr = "TME"; break;
default:
WARN(1, "Unknown pixelformat 0x%08x\n", fmt->pixelformat);
if (fmt->description[0])
diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h
index 731b2f0..5183111 100644
--- a/include/uapi/linux/v4l2-controls.h
+++ b/include/uapi/linux/v4l2-controls.h
@@ -1079,6 +1079,26 @@
#define V4L2_CID_MPEG_VIDC_VIDEO_CONCEAL_COLOR_10BIT \
(V4L2_CID_MPEG_MSM_VIDC_BASE + 110)
+#define V4L2_CID_MPEG_VIDC_VIDEO_TME_PROFILE \
+ (V4L2_CID_MPEG_MSM_VIDC_BASE + 111)
+
+enum v4l2_mpeg_vidc_video_tme_profile {
+ V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_0 = 0,
+ V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_1 = 1,
+ V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_2 = 2,
+ V4L2_MPEG_VIDC_VIDEO_TME_PROFILE_3 = 3,
+};
+
+#define V4L2_CID_MPEG_VIDC_VIDEO_TME_LEVEL \
+ (V4L2_CID_MPEG_MSM_VIDC_BASE + 112)
+
+enum v4l2_mpeg_vidc_video_tme_level {
+ V4L2_MPEG_VIDC_VIDEO_TME_LEVEL_INTEGER = 0,
+};
+
+#define V4L2_CID_MPEG_VIDC_VIDEO_TME_PAYLOAD_VERSION \
+ (V4L2_CID_MPEG_MSM_VIDC_BASE + 113)
+
/* Camera class control IDs */
#define V4L2_CID_CAMERA_CLASS_BASE (V4L2_CTRL_CLASS_CAMERA | 0x900)
diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
index 4f1f9e9..85b7e87 100644
--- a/include/uapi/linux/videodev2.h
+++ b/include/uapi/linux/videodev2.h
@@ -613,6 +613,7 @@
#define V4L2_PIX_FMT_VP8 v4l2_fourcc('V', 'P', '8', '0') /* VP8 */
#define V4L2_PIX_FMT_VP9 v4l2_fourcc('V', 'P', '9', '0') /* VP9 */
#define V4L2_PIX_FMT_HEVC v4l2_fourcc('H', 'E', 'V', 'C') /* for HEVC stream */
+#define V4L2_PIX_FMT_TME v4l2_fourcc('T', 'M', 'E', '0') /* for TME stream */
/* Vendor-specific formats */
#define V4L2_PIX_FMT_CPIA1 v4l2_fourcc('C', 'P', 'I', 'A') /* cpia1 YUV */