浏览代码

video: driver: fix for fence support

- Add METADATA_PICTURE_TYPE support.
- some fixes for fence support.

Change-Id: Icd2285aa9fef57775122e9d2433f1e5d708ccdd3
Signed-off-by: Akshata Sahukar <[email protected]>
Akshata Sahukar 3 年之前
父节点
当前提交
0abd877e95

+ 9 - 12
driver/platform/kalama/src/msm_vidc_kalama.c

@@ -1752,7 +1752,7 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		HFI_PROP_CONEALED_MB_COUNT,
 		CAP_FLAG_BITMASK},
 
-	{META_HIST_INFO, DEC, CODECS_ALL,
+	{META_HIST_INFO, DEC, HEVC|AV1|VP9,
 		V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
 		0, V4L2_MPEG_VIDC_META_DISABLE,
@@ -1760,6 +1760,14 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		HFI_PROP_HISTOGRAM_INFO,
 		CAP_FLAG_BITMASK},
 
+	{META_PICTURE_TYPE, DEC, CODECS_ALL,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_INPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_CID_MPEG_VIDC_METADATA_PICTURE_TYPE,
+		HFI_PROP_PICTURE_TYPE,
+		CAP_FLAG_BITMASK},
+
 	{META_SEI_MASTERING_DISP, ENC, HEVC|HEIC,
 		V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_TX_INPUT,
@@ -1868,17 +1876,6 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		HFI_PROP_ENC_QP_METADATA,
 		CAP_FLAG_BITMASK},
 
-	{META_ROI_INFO, ENC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE,
-		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_TX_INPUT,
-		0, V4L2_MPEG_VIDC_META_DISABLE,
-		V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO,
-		HFI_PROP_ROI_INFO,
-		CAP_FLAG_INPUT_PORT | CAP_FLAG_BITMASK,
-		{BITRATE_MODE, PIX_FMTS},
-		{0},
-		msm_vidc_adjust_roi_info, NULL},
-
 	{META_ROI_INFO, ENC, H264|HEVC,
 		V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_TX_INPUT,

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

@@ -368,6 +368,7 @@ enum msm_vidc_inst_capability_type {
 	META_TIMESTAMP,
 	META_CONCEALED_MB_CNT,
 	META_HIST_INFO,
+	META_PICTURE_TYPE,
 	META_SEI_MASTERING_DISP,
 	META_SEI_CLL,
 	META_HDR10PLUS,

+ 4 - 0
driver/vidc/src/msm_vdec.c

@@ -1435,6 +1435,10 @@ int msm_vdec_streamon_input(struct msm_vidc_inst *inst)
 	if (rc)
 		return rc;
 
+	rc = msm_vdec_subscribe_metadata(inst, INPUT_PORT);
+	if (rc)
+		return rc;
+
 	rc = msm_vdec_set_delivery_mode_metadata(inst, INPUT_PORT);
 	if (rc)
 		return rc;

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

@@ -707,7 +707,8 @@ void msm_vidc_add_volatile_flag(struct v4l2_ctrl *ctrl)
 {
 	if (ctrl->id == V4L2_CID_MIN_BUFFERS_FOR_OUTPUT ||
 		ctrl->id == V4L2_CID_MIN_BUFFERS_FOR_CAPTURE ||
-		ctrl->id == V4L2_CID_MPEG_VIDC_AV1D_FILM_GRAIN_PRESENT)
+		ctrl->id == V4L2_CID_MPEG_VIDC_AV1D_FILM_GRAIN_PRESENT ||
+		ctrl->id == V4L2_CID_MPEG_VIDC_SW_FENCE_FD)
 		ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
 }
 

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

@@ -68,6 +68,7 @@ static const struct msm_vidc_cap_name cap_name_arr[] = {
 	{META_TIMESTAMP,                 "META_TIMESTAMP"             },
 	{META_CONCEALED_MB_CNT,          "META_CONCEALED_MB_CNT"      },
 	{META_HIST_INFO,                 "META_HIST_INFO"             },
+	{META_PICTURE_TYPE,              "META_PICTURE_TYPE"          },
 	{META_SEI_MASTERING_DISP,        "META_SEI_MASTERING_DISP"    },
 	{META_SEI_CLL,                   "META_SEI_CLL"               },
 	{META_HDR10PLUS,                 "META_HDR10PLUS"             },
@@ -1320,6 +1321,7 @@ bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id)
 			case V4L2_CID_MPEG_VIDC_INPUT_METADATA_FD:
 			case V4L2_CID_MPEG_VIDC_FRAME_RATE:
 			case V4L2_CID_MPEG_VIDC_OPERATING_RATE:
+			case V4L2_CID_MPEG_VIDC_SW_FENCE_ID:
 				allow = true;
 				break;
 			default:
@@ -1408,6 +1410,7 @@ 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",
@@ -2098,9 +2101,8 @@ int msm_vidc_get_fence_fd(struct msm_vidc_inst *inst, int *fence_fd)
 	}
 
 	if (!found) {
-		i_vpr_e(inst, "%s: could not find matching fence for fence id: %d\n",
+		i_vpr_h(inst, "%s: could not find matching fence for fence id: %d\n",
 			__func__, inst->capabilities->cap[FENCE_ID].value);
-		rc = -EINVAL;
 		goto exit;
 	}
 
@@ -3893,6 +3895,9 @@ static int msm_vidc_v4l2_buffer_event(struct msm_vidc_inst *inst,
 	event_data = (struct v4l2_event_vidc_metadata *)event.u.data;
 	event_data->type = INPUT_META_PLANE;
 	event_data->fd = buf->fd;
+	event_data->index = buf->index;
+	event_data->bytesused = buf->data_size;
+	event_data->offset = buf->data_offset;
 
 	v4l2_event_queue_fh(&inst->event_handler, &event);
 

+ 4 - 2
driver/vidc/src/msm_vidc_fence.c

@@ -106,8 +106,10 @@ int msm_vidc_create_fence_fd(struct msm_vidc_inst *inst,
 		goto err_sync_file;
 	}
 	fd_install(fence->fd, fence->sync_file->file);
-	i_vpr_l(inst, "%s: created fd %d for fence %s id: %llu\n", __func__,
-		fence->fd, fence->name, fence->dma_fence.seqno);
+
+	i_vpr_l(inst, "%s: created fd %d for fence %s\n", __func__,
+		fence->fd, fence->name);
+	return rc;
 
 err_sync_file:
 	put_unused_fd(fence->fd);

+ 5 - 0
driver/vidc/src/venus_hfi.c

@@ -3525,6 +3525,11 @@ int venus_hfi_queue_buffer(struct msm_vidc_inst *inst,
 
 	if (is_meta_rx_inp_enabled(inst, META_OUTBUF_FENCE) &&
 		is_output_buffer(buffer->type)) {
+		if (!buffer->fence_id) {
+			i_vpr_e(inst, "%s: fence id cannot be 0\n", __func__);
+			rc = -EINVAL;
+			goto unlock;
+		}
 		rc = hfi_create_packet(inst->packet,
 			inst->packet_size,
 			HFI_PROP_FENCE,

+ 16 - 2
driver/vidc/src/venus_hfi_response.c

@@ -1063,6 +1063,14 @@ static int msm_vidc_check_meta_buffers(struct msm_vidc_inst *inst)
 	};
 
 	for (i = 0; i < ARRAY_SIZE(buffer_type); i++) {
+		/*
+		 * skip input meta buffers check as meta buffers were
+		 * already delivered if output fence enabled.
+		 */
+		if (is_meta_rx_inp_enabled(inst, META_OUTBUF_FENCE)) {
+			if (buffer_type[i] == MSM_VIDC_BUF_INPUT)
+				continue;
+		}
 		buffers = msm_vidc_get_buffers(inst, buffer_type[i], __func__);
 		if (!buffers)
 			return -EINVAL;
@@ -1116,7 +1124,13 @@ static int handle_dequeue_buffers(struct msm_vidc_inst *inst)
 						"vb2 done already", inst, buf);
 				} else {
 					buf->attr |= MSM_VIDC_ATTR_BUFFER_DONE;
-					msm_vidc_buffer_done(inst, buf);
+					rc = msm_vidc_buffer_done(inst, buf);
+					if (rc) {
+						print_vidc_buffer(VIDC_HIGH, "err ",
+							"vb2 done failed", inst, buf);
+						/* ignore the error */
+						rc = 0;
+					}
 				}
 				msm_vidc_put_driver_buf(inst, buf);
 			}
@@ -1734,12 +1748,12 @@ static int __handle_session_response(struct msm_vidc_inst *inst,
 		}
 	}
 
-	memset(&inst->hfi_frame_info, 0, sizeof(struct msm_vidc_hfi_frame_info));
 	if (dequeue) {
 		rc = handle_dequeue_buffers(inst);
 		if (rc)
 			return rc;
 	}
+	memset(&inst->hfi_frame_info, 0, sizeof(struct msm_vidc_hfi_frame_info));
 
 	return rc;
 }

+ 7 - 1
include/uapi/vidc/media/v4l2_vidc_extensions.h

@@ -227,6 +227,8 @@ enum v4l2_mpeg_video_av1_tier {
  */
 #define V4L2_CID_MPEG_VIDC_SW_FENCE_FD                                       \
 	(V4L2_CID_MPEG_VIDC_BASE + 0x3A)
+#define V4L2_CID_MPEG_VIDC_METADATA_PICTURE_TYPE                             \
+	(V4L2_CID_MPEG_VIDC_BASE + 0x3B)
 
 /* add new controls above this line */
 /* Deprecate below controls once availble in gki and gsi bionic header */
@@ -355,6 +357,7 @@ enum v4l2_mpeg_vidc_metadata {
 	METADATA_TIMESTAMP                    = 0x0300015c,
 	METADATA_CONCEALED_MB_COUNT           = 0x0300015f,
 	METADATA_HISTOGRAM_INFO               = 0x03000161,
+	METADATA_PICTURE_TYPE                 = 0x03000162,
 	METADATA_SEI_MASTERING_DISPLAY_COLOUR = 0x03000163,
 	METADATA_SEI_CONTENT_LIGHT_LEVEL      = 0x03000164,
 	METADATA_HDR10PLUS                    = 0x03000165,
@@ -403,7 +406,10 @@ enum meta_interlace_info {
 struct v4l2_event_vidc_metadata {
 	__u32                                type;
 	__s32                                fd;
-	__u8                                 reserved[56];
+	__u32                                index;
+	__u32                                bytesused;
+	__u32                                offset;
+	__u8                                 reserved[44];
 };
 /* vendor events end */