فهرست منبع

video: driver: add change to support slice mode decode

Added new capabilty changes to support slice based decoding.

This feature basically enables to decode the given input in terms of
slices and deliver single output to the higher layers when all slices
decoded in a frame.
When HW receives the slices then it will start decoding the slices,
instead of waiting for all the slices belongs to same frame.
So this will help to achieve lower decode latency.

Change-Id: Id107b34baba6d7b4a88238e232e8bf4a0fd6e58e
Signed-off-by: Gaviraju Doddabettahalli Bettegowda <[email protected]>
Gaviraju Doddabettahalli Bettegowda 3 سال پیش
والد
کامیت
9789b56a49

+ 16 - 6
driver/platform/anorak/src/msm_vidc_anorak.c

@@ -378,10 +378,14 @@ static struct msm_platform_inst_capability instance_cap_data_anorak[] = {
 		V4L2_CID_MPEG_VIDC_SUPERFRAME, 0,
 		CAP_FLAG_NONE},
 
-	{SLICE_INTERFACE, DEC, CODECS_ALL,
-		0, 0, 0, 0,
+	{SLICE_DECODE, DEC, H264|HEVC|AV1,
+		V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_MSM_VIDC_ENABLE,
+		1,
+		V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE,
-		0},
+		HFI_PROP_SLICE_DECODE,
+		CAP_FLAG_INPUT_PORT},
 
 	{HEADER_MODE, ENC, CODECS_ALL,
 		V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE,
@@ -1828,7 +1832,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_anor
 
 	{META_OUTBUF_FENCE, DEC, H264|HEVC|VP9|AV1,
 		{OUTPUT_ORDER},
-		{LOWLATENCY_MODE},
+		{LOWLATENCY_MODE, SLICE_DECODE},
 		msm_vidc_adjust_dec_outbuf_fence,
 		NULL},
 
@@ -1856,6 +1860,12 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_anor
 		NULL,
 		NULL},
 
+	{SLICE_DECODE, DEC, H264|HEVC|AV1,
+		{LOWLATENCY_MODE, META_OUTBUF_FENCE, OUTPUT_ORDER},
+		{0},
+		msm_vidc_adjust_dec_slice_mode,
+		msm_vidc_set_u32},
+
 	{HEADER_MODE, ENC, CODECS_ALL,
 		{0},
 		{0},
@@ -1975,7 +1985,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_anor
 
 	{LOWLATENCY_MODE, DEC, H264|HEVC|VP9|AV1,
 		{META_OUTBUF_FENCE},
-		{STAGE},
+		{STAGE, SLICE_DECODE},
 		msm_vidc_adjust_dec_lowlatency_mode,
 		NULL},
 
@@ -2272,7 +2282,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_anor
 
 	{OUTPUT_ORDER, DEC, H264|HEVC|VP9|AV1,
 		{THUMBNAIL_MODE, DISPLAY_DELAY, DISPLAY_DELAY_ENABLE},
-		{META_OUTBUF_FENCE},
+		{META_OUTBUF_FENCE, SLICE_DECODE},
 		msm_vidc_adjust_output_order,
 		msm_vidc_set_u32},
 

+ 14 - 5
driver/platform/kalama/src/msm_vidc_kalama.c

@@ -379,8 +379,11 @@ static struct msm_platform_inst_capability instance_cap_data_kalama[] = {
 		V4L2_CID_MPEG_VIDC_SUPERFRAME, 0,
 		CAP_FLAG_NONE},
 
-	{SLICE_INTERFACE, DEC, CODECS_ALL,
-		0, 0, 0, 0,
+	{SLICE_DECODE, DEC, H264|HEVC|AV1,
+		V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_MSM_VIDC_DISABLE,
+		0,
+		V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE,
 		0},
 
@@ -1829,7 +1832,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_kala
 
 	{META_OUTBUF_FENCE, DEC, H264|HEVC|VP9|AV1,
 		{OUTPUT_ORDER},
-		{LOWLATENCY_MODE},
+		{LOWLATENCY_MODE, SLICE_DECODE},
 		msm_vidc_adjust_dec_outbuf_fence,
 		NULL},
 
@@ -1857,6 +1860,12 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_kala
 		NULL,
 		NULL},
 
+	{SLICE_DECODE, DEC, H264|HEVC|AV1,
+		{LOWLATENCY_MODE, META_OUTBUF_FENCE, OUTPUT_ORDER},
+		{0},
+		NULL,
+		NULL},
+
 	{HEADER_MODE, ENC, CODECS_ALL,
 		{0},
 		{0},
@@ -1976,7 +1985,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_kala
 
 	{LOWLATENCY_MODE, DEC, H264|HEVC|VP9|AV1,
 		{META_OUTBUF_FENCE},
-		{STAGE},
+		{STAGE, SLICE_DECODE},
 		msm_vidc_adjust_dec_lowlatency_mode,
 		NULL},
 
@@ -2273,7 +2282,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_kala
 
 	{OUTPUT_ORDER, DEC, H264|HEVC|VP9|AV1,
 		{THUMBNAIL_MODE, DISPLAY_DELAY, DISPLAY_DELAY_ENABLE},
-		{META_OUTBUF_FENCE},
+		{META_OUTBUF_FENCE, SLICE_DECODE},
 		msm_vidc_adjust_output_order,
 		msm_vidc_set_u32},
 

+ 14 - 5
driver/platform/waipio/src/msm_vidc_waipio.c

@@ -350,8 +350,11 @@ static struct msm_platform_inst_capability instance_cap_data_waipio[] = {
 		V4L2_CID_MPEG_VIDC_SUPERFRAME, 0,
 		CAP_FLAG_NONE},
 
-	{SLICE_INTERFACE, DEC, CODECS_ALL,
-		0, 0, 0, 0,
+	{SLICE_DECODE, DEC, H264|HEVC,
+		V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_MSM_VIDC_DISABLE,
+		0,
+		V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_MPEG_VIDEO_DECODER_SLICE_INTERFACE,
 		0},
 
@@ -1610,7 +1613,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_waip
 
 	{META_OUTBUF_FENCE, DEC, H264|HEVC|VP9,
 		{OUTPUT_ORDER},
-		{LOWLATENCY_MODE},
+		{LOWLATENCY_MODE, SLICE_DECODE},
 		NULL,
 		NULL},
 
@@ -1638,6 +1641,12 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_waip
 		NULL,
 		NULL},
 
+	{SLICE_DECODE, DEC, H264|HEVC,
+		{LOWLATENCY_MODE, META_OUTBUF_FENCE, OUTPUT_ORDER},
+		{0},
+		NULL,
+		NULL},
+
 	{HEADER_MODE, ENC, CODECS_ALL,
 		{0},
 		{0},
@@ -1745,7 +1754,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_waip
 
 	{LOWLATENCY_MODE, DEC, H264|HEVC|VP9,
 		{META_OUTBUF_FENCE},
-		{STAGE},
+		{STAGE, SLICE_DECODE},
 		msm_vidc_adjust_dec_lowlatency_mode,
 		NULL},
 
@@ -2030,7 +2039,7 @@ static struct msm_platform_inst_cap_dependency instance_cap_dependency_data_waip
 
 	{OUTPUT_ORDER, DEC, H264|HEVC|VP9,
 		{THUMBNAIL_MODE, DISPLAY_DELAY, DISPLAY_DELAY_ENABLE},
-		{META_OUTBUF_FENCE},
+		{META_OUTBUF_FENCE, SLICE_DECODE},
 		msm_vidc_adjust_output_order,
 		msm_vidc_set_u32},
 

+ 2 - 0
driver/vidc/inc/hfi_property.h

@@ -569,6 +569,8 @@ enum hfi_saliency_type {
 
 #define HFI_PROP_DISABLE_VUI_TIMING_INFO                        0x03000194
 
+#define HFI_PROP_SLICE_DECODE                                   0x03000196
+
 #define HFI_PROP_END                                            0x03FFFFFF
 
 #define HFI_SESSION_ERROR_BEGIN                                 0x04000000

+ 1 - 0
driver/vidc/inc/msm_vidc_control.h

@@ -53,6 +53,7 @@ int msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_roi_info(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_all_intra(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_dec_outbuf_fence(void *instance, struct v4l2_ctrl *ctrl);
+int msm_vidc_adjust_dec_slice_mode(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_preprocess(void *instance, struct v4l2_ctrl *ctrl);
 
 int msm_vidc_set_header_mode(void *instance,

+ 1 - 1
driver/vidc/inc/msm_vidc_internal.h

@@ -422,7 +422,6 @@ enum msm_vidc_inst_capability_type {
 	FENCE_ID,
 	FENCE_FD,
 	TS_REORDER,
-	SLICE_INTERFACE,
 	HFLIP,
 	VFLIP,
 	ROTATION,
@@ -539,6 +538,7 @@ enum msm_vidc_inst_capability_type {
 	OUTPUT_BUF_HOST_MAX_COUNT,
 	DELIVERY_MODE,
 	VUI_TIMING_INFO,
+	SLICE_DECODE,
 	/* place all leaf(no child) enums before this line */
 	INST_CAP_MAX,
 };

+ 35 - 0
driver/vidc/src/msm_vidc_control.c

@@ -2905,6 +2905,41 @@ int msm_vidc_adjust_dec_outbuf_fence(void *instance, struct v4l2_ctrl *ctrl)
 	return 0;
 }
 
+int msm_vidc_adjust_dec_slice_mode(void *instance, struct v4l2_ctrl *ctrl)
+{
+	struct msm_vidc_inst_capability *capability;
+	struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
+	u32 adjusted_value = 0;
+	s32 low_latency = -1;
+	s32 picture_order = -1;
+	s32 outbuf_fence = V4L2_MPEG_VIDC_META_DISABLE;
+
+	if (!inst || !inst->capabilities) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		return -EINVAL;
+	}
+	capability = inst->capabilities;
+
+	adjusted_value = ctrl ? ctrl->val : capability->cap[SLICE_DECODE].value;
+
+	if (msm_vidc_get_parent_value(inst, SLICE_DECODE, LOWLATENCY_MODE,
+		&low_latency, __func__) ||
+	    msm_vidc_get_parent_value(inst, SLICE_DECODE, OUTPUT_ORDER,
+		&picture_order, __func__) ||
+	    msm_vidc_get_parent_value(inst, SLICE_DECODE, META_OUTBUF_FENCE,
+		&outbuf_fence, __func__))
+		return -EINVAL;
+
+	if (!low_latency || !picture_order ||
+	    !is_meta_rx_inp_enabled(inst, META_OUTBUF_FENCE))
+		adjusted_value = V4L2_MPEG_MSM_VIDC_DISABLE;
+
+	msm_vidc_update_cap_value(inst, SLICE_DECODE,
+		adjusted_value, __func__);
+
+	return 0;
+}
+
 int msm_vidc_prepare_dependency_list(struct msm_vidc_inst *inst)
 {
 	struct list_head root_list, opt_list;

+ 1 - 2
driver/vidc/src/msm_vidc_driver.c

@@ -116,7 +116,6 @@ static const struct msm_vidc_cap_name cap_name_arr[] = {
 	{FENCE_ID,                       "FENCE_ID"                   },
 	{FENCE_FD,                       "FENCE_FD"                   },
 	{TS_REORDER,                     "TS_REORDER"                 },
-	{SLICE_INTERFACE,                "SLICE_INTERFACE"            },
 	{HFLIP,                          "HFLIP"                      },
 	{VFLIP,                          "VFLIP"                      },
 	{ROTATION,                       "ROTATION"                   },
@@ -229,6 +228,7 @@ static const struct msm_vidc_cap_name cap_name_arr[] = {
 	{OUTPUT_BUF_HOST_MAX_COUNT,      "OUTPUT_BUF_HOST_MAX_COUNT"  },
 	{DELIVERY_MODE,                  "DELIVERY_MODE"              },
 	{VUI_TIMING_INFO,                "VUI_TIMING_INFO"            },
+	{SLICE_DECODE,                   "SLICE_DECODE"               },
 	{INST_CAP_MAX,                   "INST_CAP_MAX"               },
 };
 
@@ -1453,7 +1453,6 @@ bool msm_vidc_allow_metadata_subscription(struct msm_vidc_inst *inst, u32 cap_id
 		case META_SEI_MASTERING_DISP:
 		case META_SEI_CLL:
 		case META_HDR10PLUS:
-		case META_PICTURE_TYPE:
 			if (!is_meta_rx_inp_enabled(inst, META_OUTBUF_FENCE)) {
 				i_vpr_h(inst,
 					"%s: cap: %24s not allowed as output buffer fence is disabled\n",

+ 5 - 0
include/uapi/vidc/media/v4l2_vidc_extensions.h

@@ -428,6 +428,10 @@ enum meta_interlace_info {
 	META_INTERLACE_FRAME_INTERLACE_BOTTOMFIELD_FIRST    = 0x00000020,
 };
 
+/*
+ * enum meta_picture_type - specifies input picture type
+ * @META_PICTURE_TYPE_NEW: start of new frame or first slice in a frame
+ */
 enum meta_picture_type {
 	META_PICTURE_TYPE_IDR                            = 0x00000001,
 	META_PICTURE_TYPE_P                              = 0x00000002,
@@ -436,6 +440,7 @@ enum meta_picture_type {
 	META_PICTURE_TYPE_CRA                            = 0x00000010,
 	META_PICTURE_TYPE_BLA                            = 0x00000020,
 	META_PICTURE_TYPE_NOSHOW                         = 0x00000040,
+	META_PICTURE_TYPE_NEW                            = 0x00000080,
 };
 
 /* vendor controls end */