Эх сурвалжийг харах

Merge "video: driver: Change v4l2 metadata controls to BITMASK type"

qctecmdr 3 жил өмнө
parent
commit
a5fd58a834

+ 165 - 82
driver/platform/kalama/src/msm_vidc_kalama.c

@@ -297,10 +297,12 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 	 * to get fence_id in input metadata buffer done.
 	 */
 	{META_OUTBUF_FENCE, DEC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		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_OUTBUF_FENCE,
-		HFI_PROP_FENCE},
+		HFI_PROP_FENCE,
+		CAP_FLAG_BITMASK},
 
 	/*
 	 * Client to do set_ctrl with FENCE_ID to set fence_id
@@ -1602,16 +1604,22 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		NULL, msm_vidc_set_u32},
 
 	{META_BITSTREAM_RESOLUTION, DEC, AV1,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_INPUT |
+			V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_BITSTREAM_RESOLUTION,
-		HFI_PROP_BITSTREAM_RESOLUTION},
+		HFI_PROP_BITSTREAM_RESOLUTION,
+		CAP_FLAG_BITMASK},
 
 	{META_CROP_OFFSETS, DEC, AV1,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_INPUT |
+			V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_CROP_OFFSETS,
-		HFI_PROP_CROP_OFFSETS},
+		HFI_PROP_CROP_OFFSETS,
+		CAP_FLAG_BITMASK},
 
 	{ALL_INTRA, ENC, H264|HEVC,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
@@ -1641,135 +1649,206 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		NULL, NULL},
 
 	{META_LTR_MARK_USE, ENC, H264|HEVC,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_LTR_MARK_USE_DETAILS,
-		HFI_PROP_LTR_MARK_USE_DETAILS},
+		HFI_PROP_LTR_MARK_USE_DETAILS,
+		CAP_FLAG_BITMASK},
 
 	{META_SEQ_HDR_NAL, ENC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_SEQ_HEADER_NAL,
-		HFI_PROP_METADATA_SEQ_HEADER_NAL},
+		HFI_PROP_METADATA_SEQ_HEADER_NAL,
+		CAP_FLAG_BITMASK},
 
 	{META_DPB_MISR, DEC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_DPB_LUMA_CHROMA_MISR,
-		HFI_PROP_DPB_LUMA_CHROMA_MISR},
+		HFI_PROP_DPB_LUMA_CHROMA_MISR,
+		CAP_FLAG_BITMASK},
 
 	{META_OPB_MISR, DEC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_OPB_LUMA_CHROMA_MISR,
-		HFI_PROP_OPB_LUMA_CHROMA_MISR},
+		HFI_PROP_OPB_LUMA_CHROMA_MISR,
+		CAP_FLAG_BITMASK},
 
 	{META_INTERLACE, DEC, H264,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_INTERLACE,
-		HFI_PROP_INTERLACE_INFO},
+		HFI_PROP_INTERLACE_INFO,
+		CAP_FLAG_BITMASK},
 
 	{META_TIMESTAMP, DEC | ENC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_TIMESTAMP,
-		HFI_PROP_TIMESTAMP},
+		HFI_PROP_TIMESTAMP,
+		CAP_FLAG_BITMASK},
 
 	{META_CONCEALED_MB_CNT, DEC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_CONCEALED_MB_COUNT,
-		HFI_PROP_CONEALED_MB_COUNT},
+		HFI_PROP_CONEALED_MB_COUNT,
+		CAP_FLAG_BITMASK},
 
 	{META_HIST_INFO, DEC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_HISTOGRAM_INFO,
-		HFI_PROP_HISTOGRAM_INFO},
+		HFI_PROP_HISTOGRAM_INFO,
+		CAP_FLAG_BITMASK},
 
-	{META_SEI_MASTERING_DISP, DEC|ENC, HEVC|HEIC|AV1,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+	{META_SEI_MASTERING_DISP, ENC, HEVC|HEIC,
+		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_SEI_MASTERING_DISPLAY_COLOUR,
-		HFI_PROP_SEI_MASTERING_DISPLAY_COLOUR},
+		HFI_PROP_SEI_MASTERING_DISPLAY_COLOUR,
+		CAP_FLAG_BITMASK},
+
+	{META_SEI_MASTERING_DISP, DEC, HEVC|HEIC|AV1,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_INPUT |
+			V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_CID_MPEG_VIDC_METADATA_SEI_MASTERING_DISPLAY_COLOUR,
+		HFI_PROP_SEI_MASTERING_DISPLAY_COLOUR,
+		CAP_FLAG_BITMASK},
 
-	{META_SEI_CLL, DEC|ENC, HEVC|HEIC|AV1,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+	{META_SEI_CLL, ENC, HEVC|HEIC,
+		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_SEI_CONTENT_LIGHT_LEVEL,
+		HFI_PROP_SEI_CONTENT_LIGHT_LEVEL,
+		CAP_FLAG_BITMASK},
+
+	{META_SEI_CLL, DEC, HEVC|HEIC|AV1,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_INPUT |
+			V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_SEI_CONTENT_LIGHT_LEVEL,
-		HFI_PROP_SEI_CONTENT_LIGHT_LEVEL},
+		HFI_PROP_SEI_CONTENT_LIGHT_LEVEL,
+		CAP_FLAG_BITMASK},
 
-	{META_HDR10PLUS, DEC | ENC, HEVC|HEIC|AV1,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+	{META_HDR10PLUS, ENC, HEVC|HEIC,
+		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_HDR10PLUS,
+		HFI_PROP_SEI_HDR10PLUS_USERDATA,
+		CAP_FLAG_BITMASK},
+
+	{META_HDR10PLUS, DEC, HEVC|HEIC|AV1,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_INPUT |
+			V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_HDR10PLUS,
-		HFI_PROP_SEI_HDR10PLUS_USERDATA},
+		HFI_PROP_SEI_HDR10PLUS_USERDATA,
+		CAP_FLAG_BITMASK},
 
 	{META_EVA_STATS, ENC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		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_EVA_STATS,
 		HFI_PROP_EVA_STAT_INFO,
-		0,
+		CAP_FLAG_BITMASK,
 		{0},
 		{ENH_LAYER_COUNT}},
 
-	{META_BUF_TAG, DEC | ENC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+	{META_BUF_TAG, ENC, CODECS_ALL,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_TX_INPUT |
+			V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_CID_MPEG_VIDC_METADATA_BUFFER_TAG,
+		HFI_PROP_BUFFER_TAG,
+		CAP_FLAG_BITMASK},
+
+	/*
+	 * when fence enabled, client needs output buffer_tag
+	 * in input metadata buffer done.
+	 */
+	{META_BUF_TAG, DEC, CODECS_ALL,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_TX_INPUT |
+			V4L2_MPEG_VIDC_META_TX_OUTPUT | V4L2_MPEG_VIDC_META_RX_INPUT |
+			V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_BUFFER_TAG,
-		HFI_PROP_BUFFER_TAG},
+		HFI_PROP_BUFFER_TAG,
+		CAP_FLAG_BITMASK},
 
 	{META_DPB_TAG_LIST, DEC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_DPB_TAG_LIST,
-		HFI_PROP_DPB_TAG_LIST},
-
-	{META_OUTPUT_BUF_TAG, DEC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
-		0,
-		HFI_PROP_BUFFER_TAG},
+		HFI_PROP_DPB_TAG_LIST,
+		CAP_FLAG_BITMASK},
 
 	{META_SUBFRAME_OUTPUT, DEC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT,
-		HFI_PROP_SUBFRAME_OUTPUT},
+		HFI_PROP_SUBFRAME_OUTPUT,
+		CAP_FLAG_BITMASK},
 
 	{META_ENC_QP_METADATA, ENC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_ENC_QP_METADATA,
-		HFI_PROP_ENC_QP_METADATA},
+		HFI_PROP_ENC_QP_METADATA,
+		CAP_FLAG_BITMASK},
 
 	{META_ROI_INFO, ENC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		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_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_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		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_INPUT_PORT | CAP_FLAG_BITMASK,
 		{BITRATE_MODE, PIX_FMTS},
 		{MIN_QUALITY},
 		msm_vidc_adjust_roi_info, NULL},
 
 	{META_DEC_QP_METADATA, DEC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_DEC_QP_METADATA,
-		HFI_PROP_DEC_QP_METADATA},
+		HFI_PROP_DEC_QP_METADATA,
+		CAP_FLAG_BITMASK},
 
 	/* configure image properties */
 	{FRAME_WIDTH, ENC, HEIC, 128, 16384, 1, 16384},
@@ -1860,19 +1939,23 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		{0}, {0},
 		NULL, msm_vidc_set_q16},
 	{META_SUBFRAME_OUTPUT, ENC, HEIC,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT,
-		HFI_PROP_SUBFRAME_OUTPUT},
+		HFI_PROP_SUBFRAME_OUTPUT,
+		CAP_FLAG_BITMASK},
 	{COMPLEXITY, ENC, H264 | HEVC,
 		0, 100,
 		1, 100,
 		V4L2_CID_MPEG_VIDC_VENC_COMPLEXITY},
 	{META_MAX_NUM_REORDER_FRAMES, DEC, HEVC | H264,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_MAX_NUM_REORDER_FRAMES,
-		HFI_PROP_MAX_NUM_REORDER_FRAMES},
+		HFI_PROP_MAX_NUM_REORDER_FRAMES,
+		CAP_FLAG_BITMASK},
 };
 
 /*

+ 140 - 73
driver/platform/waipio/src/msm_vidc_waipio.c

@@ -1499,135 +1499,198 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		NULL, NULL},
 
 	{META_LTR_MARK_USE, ENC, H264|HEVC,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_LTR_MARK_USE_DETAILS,
-		HFI_PROP_LTR_MARK_USE_DETAILS},
+		HFI_PROP_LTR_MARK_USE_DETAILS,
+		CAP_FLAG_BITMASK},
 
 	{META_SEQ_HDR_NAL, ENC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_SEQ_HEADER_NAL,
-		HFI_PROP_METADATA_SEQ_HEADER_NAL},
+		HFI_PROP_METADATA_SEQ_HEADER_NAL,
+		CAP_FLAG_BITMASK},
 
 	{META_DPB_MISR, DEC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_DPB_LUMA_CHROMA_MISR,
-		HFI_PROP_DPB_LUMA_CHROMA_MISR},
+		HFI_PROP_DPB_LUMA_CHROMA_MISR,
+		CAP_FLAG_BITMASK},
 
 	{META_OPB_MISR, DEC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_OPB_LUMA_CHROMA_MISR,
-		HFI_PROP_OPB_LUMA_CHROMA_MISR},
+		HFI_PROP_OPB_LUMA_CHROMA_MISR,
+		CAP_FLAG_BITMASK},
 
 	{META_INTERLACE, DEC, H264,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_INTERLACE,
-		HFI_PROP_INTERLACE_INFO},
+		HFI_PROP_INTERLACE_INFO,
+		CAP_FLAG_BITMASK},
 
 	{META_TIMESTAMP, DEC | ENC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_TIMESTAMP,
-		HFI_PROP_TIMESTAMP},
+		HFI_PROP_TIMESTAMP,
+		CAP_FLAG_BITMASK},
 
 	{META_CONCEALED_MB_CNT, DEC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_CONCEALED_MB_COUNT,
-		HFI_PROP_CONEALED_MB_COUNT},
+		HFI_PROP_CONEALED_MB_COUNT,
+		CAP_FLAG_BITMASK},
 
 	{META_HIST_INFO, DEC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_HISTOGRAM_INFO,
-		HFI_PROP_HISTOGRAM_INFO},
+		HFI_PROP_HISTOGRAM_INFO,
+		CAP_FLAG_BITMASK},
 
-	{META_SEI_MASTERING_DISP, DEC|ENC, HEVC|HEIC,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+	{META_SEI_MASTERING_DISP, ENC, HEVC|HEIC,
+		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_SEI_MASTERING_DISPLAY_COLOUR,
-		HFI_PROP_SEI_MASTERING_DISPLAY_COLOUR},
+		HFI_PROP_SEI_MASTERING_DISPLAY_COLOUR,
+		CAP_FLAG_BITMASK},
 
-	{META_SEI_CLL, DEC|ENC, HEVC|HEIC,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+	{META_SEI_MASTERING_DISP, DEC, HEVC|HEIC,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_CID_MPEG_VIDC_METADATA_SEI_MASTERING_DISPLAY_COLOUR,
+		HFI_PROP_SEI_MASTERING_DISPLAY_COLOUR,
+		CAP_FLAG_BITMASK},
+
+	{META_SEI_CLL, ENC, HEVC|HEIC,
+		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_SEI_CONTENT_LIGHT_LEVEL,
+		HFI_PROP_SEI_CONTENT_LIGHT_LEVEL,
+		CAP_FLAG_BITMASK},
+
+	{META_SEI_CLL, DEC, HEVC|HEIC,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_SEI_CONTENT_LIGHT_LEVEL,
-		HFI_PROP_SEI_CONTENT_LIGHT_LEVEL},
+		HFI_PROP_SEI_CONTENT_LIGHT_LEVEL,
+		CAP_FLAG_BITMASK},
+
+	{META_HDR10PLUS, ENC, HEVC|HEIC,
+		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_HDR10PLUS,
+		HFI_PROP_SEI_HDR10PLUS_USERDATA,
+		CAP_FLAG_BITMASK},
 
-	{META_HDR10PLUS, DEC | ENC, HEVC|HEIC,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+	{META_HDR10PLUS, DEC, HEVC|HEIC,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_HDR10PLUS,
-		HFI_PROP_SEI_HDR10PLUS_USERDATA},
+		HFI_PROP_SEI_HDR10PLUS_USERDATA,
+		CAP_FLAG_BITMASK},
 
 	{META_EVA_STATS, ENC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		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_EVA_STATS,
 		HFI_PROP_EVA_STAT_INFO,
-		0,
+		CAP_FLAG_BITMASK,
 		{0},
 		{ENH_LAYER_COUNT}},
 
-	{META_BUF_TAG, DEC | ENC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+	{META_BUF_TAG, ENC, CODECS_ALL,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_TX_INPUT |
+			V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_CID_MPEG_VIDC_METADATA_BUFFER_TAG,
+		HFI_PROP_BUFFER_TAG,
+		CAP_FLAG_BITMASK},
+
+	{META_BUF_TAG, DEC, CODECS_ALL,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_TX_INPUT |
+			V4L2_MPEG_VIDC_META_TX_OUTPUT | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_BUFFER_TAG,
-		HFI_PROP_BUFFER_TAG},
+		HFI_PROP_BUFFER_TAG,
+		CAP_FLAG_BITMASK},
 
 	{META_DPB_TAG_LIST, DEC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_DPB_TAG_LIST,
-		HFI_PROP_DPB_TAG_LIST},
-
-	{META_OUTPUT_BUF_TAG, DEC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
-		0,
-		HFI_PROP_BUFFER_TAG},
+		HFI_PROP_DPB_TAG_LIST,
+		CAP_FLAG_BITMASK},
 
 	{META_SUBFRAME_OUTPUT, DEC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT,
-		HFI_PROP_SUBFRAME_OUTPUT},
+		HFI_PROP_SUBFRAME_OUTPUT,
+		CAP_FLAG_BITMASK},
 
 	{META_ENC_QP_METADATA, ENC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_ENC_QP_METADATA,
-		HFI_PROP_ENC_QP_METADATA},
+		HFI_PROP_ENC_QP_METADATA,
+		CAP_FLAG_BITMASK},
 
 	{META_ROI_INFO, ENC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		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_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_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		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_INPUT_PORT | CAP_FLAG_BITMASK,
 		{BITRATE_MODE, PIX_FMTS},
 		{MIN_QUALITY},
 		msm_vidc_adjust_roi_info, NULL},
 
 	{META_DEC_QP_METADATA, DEC, CODECS_ALL,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_DEC_QP_METADATA,
-		HFI_PROP_DEC_QP_METADATA},
+		HFI_PROP_DEC_QP_METADATA,
+		CAP_FLAG_BITMASK},
 
 	/* configure image properties */
 	{FRAME_WIDTH, ENC, HEIC, 128, 16384, 1, 16384},
@@ -1718,19 +1781,23 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		{0}, {0},
 		NULL, msm_vidc_set_q16},
 	{META_SUBFRAME_OUTPUT, ENC, HEIC,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT,
-		HFI_PROP_SUBFRAME_OUTPUT},
+		HFI_PROP_SUBFRAME_OUTPUT,
+		CAP_FLAG_BITMASK},
 	{COMPLEXITY, ENC, H264 | HEVC,
 		0, 100,
 		1, 100,
 		V4L2_CID_MPEG_VIDC_VENC_COMPLEXITY},
 	{META_MAX_NUM_REORDER_FRAMES, DEC, HEVC | H264,
-		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
-		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_MAX_NUM_REORDER_FRAMES,
-		HFI_PROP_MAX_NUM_REORDER_FRAMES},
+		HFI_PROP_MAX_NUM_REORDER_FRAMES,
+		CAP_FLAG_BITMASK},
 };
 
 /*

+ 29 - 47
driver/vidc/inc/msm_vidc_driver.h

@@ -101,6 +101,14 @@ static inline is_internal_buffer(enum msm_vidc_buffer_type buffer_type)
 		buffer_type == MSM_VIDC_BUF_PARTIAL_DATA;
 }
 
+static inline bool is_meta_cap(u32 cap)
+{
+	if (cap > INST_CAP_NONE && cap < META_CAP_MAX)
+		return true;
+
+	return false;
+}
+
 static inline bool is_meta_rx_inp_enabled(struct msm_vidc_inst *inst, u32 cap)
 {
 	bool enabled = false;
@@ -148,59 +156,30 @@ static inline bool is_meta_tx_out_enabled(struct msm_vidc_inst *inst, u32 cap)
 static inline bool is_input_meta_enabled(struct msm_vidc_inst *inst)
 {
 	bool enabled = false;
-
-	if (is_decode_session(inst)) {
-		enabled = is_meta_tx_inp_enabled(inst, META_BUF_TAG) ||
-			is_meta_rx_inp_enabled(inst, META_BUF_TAG) ||
-			is_meta_tx_inp_enabled(inst, META_OUTBUF_FENCE) ||
-			is_meta_rx_inp_enabled(inst, META_OUTBUF_FENCE);
-	} else if (is_encode_session(inst)) {
-		enabled = is_meta_tx_inp_enabled(inst, META_SEQ_HDR_NAL) ||
-			is_meta_rx_inp_enabled(inst, META_SEQ_HDR_NAL) ||
-			is_meta_tx_inp_enabled(inst, META_EVA_STATS) ||
-			is_meta_rx_inp_enabled(inst, META_EVA_STATS) ||
-			is_meta_tx_inp_enabled(inst, META_BUF_TAG) ||
-			is_meta_rx_inp_enabled(inst, META_BUF_TAG) ||
-			is_meta_tx_inp_enabled(inst, META_ROI_INFO) ||
-			is_meta_rx_inp_enabled(inst, META_ROI_INFO);
+	u32 i;
+
+	for (i = INST_CAP_NONE + 1; i < META_CAP_MAX; i++) {
+		if (is_meta_tx_inp_enabled(inst, i) ||
+			is_meta_rx_inp_enabled(inst, i)) {
+			enabled = true;
+			break;
+		}
 	}
+
 	return enabled;
 }
 
 static inline bool is_output_meta_enabled(struct msm_vidc_inst *inst)
 {
 	bool enabled = false;
-
-	if (is_decode_session(inst)) {
-		enabled = is_meta_tx_out_enabled(inst, META_BITSTREAM_RESOLUTION) ||
-			is_meta_rx_out_enabled(inst, META_BITSTREAM_RESOLUTION) ||
-			is_meta_tx_out_enabled(inst, META_CROP_OFFSETS) ||
-			is_meta_rx_out_enabled(inst, META_CROP_OFFSETS) ||
-			is_meta_tx_out_enabled(inst, META_DPB_MISR) ||
-			is_meta_rx_out_enabled(inst, META_DPB_MISR) ||
-			is_meta_tx_out_enabled(inst, META_OPB_MISR) ||
-			is_meta_rx_out_enabled(inst, META_OPB_MISR) ||
-			is_meta_tx_out_enabled(inst, META_INTERLACE) ||
-			is_meta_rx_out_enabled(inst, META_INTERLACE) ||
-			is_meta_tx_out_enabled(inst, META_CONCEALED_MB_CNT) ||
-			is_meta_rx_out_enabled(inst, META_CONCEALED_MB_CNT) ||
-			is_meta_tx_out_enabled(inst, META_SEI_MASTERING_DISP) ||
-			is_meta_rx_out_enabled(inst, META_SEI_MASTERING_DISP) ||
-			is_meta_tx_out_enabled(inst, META_SEI_CLL) ||
-			is_meta_rx_out_enabled(inst, META_SEI_CLL) ||
-			is_meta_tx_out_enabled(inst, META_BUF_TAG) ||
-			is_meta_rx_out_enabled(inst, META_BUF_TAG) ||
-			is_meta_tx_out_enabled(inst, META_DPB_TAG_LIST) ||
-			is_meta_rx_out_enabled(inst, META_DPB_TAG_LIST) ||
-			is_meta_tx_out_enabled(inst, META_SUBFRAME_OUTPUT) ||
-			is_meta_rx_out_enabled(inst, META_SUBFRAME_OUTPUT) ||
-			is_meta_tx_out_enabled(inst, META_MAX_NUM_REORDER_FRAMES) ||
-			is_meta_rx_out_enabled(inst, META_MAX_NUM_REORDER_FRAMES);
-	} else if (is_encode_session(inst)) {
-		enabled = is_meta_tx_out_enabled(inst, META_LTR_MARK_USE) ||
-			is_meta_rx_out_enabled(inst, META_LTR_MARK_USE) ||
-			is_meta_tx_out_enabled(inst, META_BUF_TAG) ||
-			is_meta_rx_out_enabled(inst, META_BUF_TAG);
+	u32 i;
+
+	for (i = INST_CAP_NONE + 1; i < META_CAP_MAX; i++) {
+		if (is_meta_tx_out_enabled(inst, i) ||
+			is_meta_rx_out_enabled(inst, i)) {
+			enabled = true;
+			break;
+		}
 	}
 
 	return enabled;
@@ -454,7 +433,10 @@ struct msm_vidc_inst *get_inst(struct msm_vidc_core *core,
 void put_inst(struct msm_vidc_inst *inst);
 bool msm_vidc_allow_s_fmt(struct msm_vidc_inst *inst, u32 type);
 bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id);
-bool msm_vidc_allow_metadata(struct msm_vidc_inst *inst, u32 cap_id);
+bool msm_vidc_allow_metadata_delivery(struct msm_vidc_inst *inst,
+	u32 cap_id, u32 port);
+bool msm_vidc_allow_metadata_subscription(struct msm_vidc_inst *inst,
+	u32 cap_id, u32 port);
 bool msm_vidc_allow_property(struct msm_vidc_inst *inst, u32 hfi_id);
 int msm_vidc_update_property_cap(struct msm_vidc_inst *inst, u32 hfi_id,
 	bool allow);

+ 28 - 24
driver/vidc/inc/msm_vidc_internal.h

@@ -352,6 +352,33 @@ enum msm_vidc_core_capability_type {
  */
 enum msm_vidc_inst_capability_type {
 	INST_CAP_NONE = 0,
+	/* place all metadata after this line
+	 * (Between INST_CAP_NONE and META_CAP_MAX)
+	 */
+	META_SEQ_HDR_NAL,
+	META_BITSTREAM_RESOLUTION,
+	META_CROP_OFFSETS,
+	META_DPB_MISR,
+	META_OPB_MISR,
+	META_INTERLACE,
+	META_OUTBUF_FENCE,
+	META_LTR_MARK_USE,
+	META_TIMESTAMP,
+	META_CONCEALED_MB_CNT,
+	META_HIST_INFO,
+	META_SEI_MASTERING_DISP,
+	META_SEI_CLL,
+	META_HDR10PLUS,
+	META_BUF_TAG,
+	META_DPB_TAG_LIST,
+	META_SUBFRAME_OUTPUT,
+	META_ENC_QP_METADATA,
+	META_DEC_QP_METADATA,
+	META_MAX_NUM_REORDER_FRAMES,
+	META_EVA_STATS,
+	META_ROI_INFO,
+	META_CAP_MAX,
+	/* end of metadata caps */
 	FRAME_WIDTH,
 	LOSSLESS_FRAME_WIDTH,
 	SECURE_FRAME_WIDTH,
@@ -378,7 +405,6 @@ enum msm_vidc_inst_capability_type {
 	MB_CYCLES_FW,
 	MB_CYCLES_FW_VPP,
 	SECURE_MODE,
-	META_OUTBUF_FENCE,
 	FENCE_ID,
 	FENCE_FD,
 	TS_REORDER,
@@ -389,7 +415,6 @@ enum msm_vidc_inst_capability_type {
 	SUPER_FRAME,
 	HEADER_MODE,
 	PREPEND_SPSPPS_TO_IDR,
-	META_SEQ_HDR_NAL,
 	WITHOUT_STARTCODE,
 	NAL_LENGTH_FIELD,
 	REQUEST_I_FRAME,
@@ -451,32 +476,11 @@ enum msm_vidc_inst_capability_type {
 	DRAP,
 	INPUT_METADATA_FD,
 	INPUT_META_VIA_REQUEST,
-	META_BITSTREAM_RESOLUTION,
-	META_CROP_OFFSETS,
-	META_DPB_MISR,
-	META_OPB_MISR,
-	META_INTERLACE,
 	ENC_IP_CR,
-	META_LTR_MARK_USE,
-	META_TIMESTAMP,
-	META_CONCEALED_MB_CNT,
-	META_HIST_INFO,
-	META_SEI_MASTERING_DISP,
-	META_SEI_CLL,
-	META_HDR10PLUS,
-	META_EVA_STATS,
-	META_BUF_TAG,
-	META_DPB_TAG_LIST,
-	META_OUTPUT_BUF_TAG,
-	META_SUBFRAME_OUTPUT,
-	META_ENC_QP_METADATA,
-	META_DEC_QP_METADATA,
 	COMPLEXITY,
-	META_MAX_NUM_REORDER_FRAMES,
 	/* place all root(no parent) enums before this line */
 
 	PROFILE,
-	META_ROI_INFO,
 	ENH_LAYER_COUNT,
 	BIT_RATE,
 	LOWLATENCY_MODE,
@@ -509,7 +513,6 @@ enum msm_vidc_inst_capability_type {
 	INPUT_BUF_HOST_MAX_COUNT,
 	OUTPUT_BUF_HOST_MAX_COUNT,
 	/* place all leaf(no child) enums before this line */
-
 	INST_CAP_MAX,
 };
 
@@ -520,6 +523,7 @@ enum msm_vidc_inst_capability_flags {
 	CAP_FLAG_INPUT_PORT              = BIT(2),
 	CAP_FLAG_OUTPUT_PORT             = BIT(3),
 	CAP_FLAG_CLIENT_SET              = BIT(4),
+	CAP_FLAG_BITMASK                 = BIT(5),
 };
 
 struct msm_vidc_inst_cap {

+ 18 - 54
driver/vidc/src/msm_vdec.c

@@ -931,35 +931,6 @@ static int msm_vdec_subscribe_metadata(struct msm_vidc_inst *inst,
 	u32 payload[32] = {0};
 	u32 i, count = 0;
 	struct msm_vidc_inst_capability *capability;
-	static const u32 metadata_input_list[] = {
-		META_OUTBUF_FENCE,
-		/*
-		 * when fence enabled, client needs output buffer_tag
-		 * in input metadata buffer done.
-		 */
-		META_OUTPUT_BUF_TAG,
-	};
-	static const u32 metadata_output_list[] = {
-		META_BITSTREAM_RESOLUTION,
-		META_CROP_OFFSETS,
-		META_DPB_MISR,
-		META_OPB_MISR,
-		META_INTERLACE,
-		META_TIMESTAMP,
-		META_CONCEALED_MB_CNT,
-		META_HIST_INFO,
-		META_SEI_MASTERING_DISP,
-		META_SEI_CLL,
-		META_HDR10PLUS,
-		/*
-		 * client needs input buffer tag in output metadata buffer done.
-		 */
-		META_BUF_TAG,
-		META_DPB_TAG_LIST,
-		META_SUBFRAME_OUTPUT,
-		META_DEC_QP_METADATA,
-		META_MAX_NUM_REORDER_FRAMES,
-	};
 
 	if (!inst || !inst->capabilities) {
 		d_vpr_e("%s: invalid params\n", __func__);
@@ -970,20 +941,20 @@ static int msm_vdec_subscribe_metadata(struct msm_vidc_inst *inst,
 	capability = inst->capabilities;
 	payload[0] = HFI_MODE_METADATA;
 	if (port == INPUT_PORT) {
-		for (i = 0; i < ARRAY_SIZE(metadata_input_list); i++) {
-			if (is_meta_rx_inp_enabled(inst, metadata_input_list[i]) &&
-				msm_vidc_allow_metadata(inst, metadata_input_list[i])) {
-				payload[count + 1] =
-					capability->cap[metadata_input_list[i]].hfi_id;
+		for (i = INST_CAP_NONE + 1; i < META_CAP_MAX; i++) {
+			if (is_meta_rx_inp_enabled(inst, i) &&
+				msm_vidc_allow_metadata_subscription(
+					inst, i, port)) {
+				payload[count + 1] = capability->cap[i].hfi_id;
 				count++;
 			}
 		}
 	} else if (port == OUTPUT_PORT) {
-		for (i = 0; i < ARRAY_SIZE(metadata_output_list); i++) {
-			if (is_meta_rx_out_enabled(inst, metadata_output_list[i]) &&
-				msm_vidc_allow_metadata(inst, metadata_output_list[i])) {
-				payload[count + 1] =
-					capability->cap[metadata_output_list[i]].hfi_id;
+		for (i = INST_CAP_NONE + 1; i < META_CAP_MAX; i++) {
+			if (is_meta_rx_out_enabled(inst, i) &&
+				msm_vidc_allow_metadata_subscription(
+					inst, i, port)) {
+				payload[count + 1] = capability->cap[i].hfi_id;
 				count++;
 			}
 		}
@@ -1011,12 +982,6 @@ static int msm_vdec_set_delivery_mode_metadata(struct msm_vidc_inst *inst,
 	u32 payload[32] = {0};
 	u32 i, count = 0;
 	struct msm_vidc_inst_capability *capability;
-	static const u32 metadata_input_list[] = {
-		META_BUF_TAG,
-	};
-	static const u32 metadata_output_list[] = {
-		META_OUTPUT_BUF_TAG,
-	};
 
 	if (!inst || !inst->capabilities) {
 		d_vpr_e("%s: invalid params\n", __func__);
@@ -1028,19 +993,18 @@ static int msm_vdec_set_delivery_mode_metadata(struct msm_vidc_inst *inst,
 	payload[0] = HFI_MODE_METADATA;
 
 	if (port == INPUT_PORT) {
-		for (i = 0; i < ARRAY_SIZE(metadata_input_list); i++) {
-			if (is_meta_tx_inp_enabled(inst, metadata_input_list[i])) {
-				payload[count + 1] =
-					capability->cap[metadata_input_list[i]].hfi_id;
+		for (i = INST_CAP_NONE + 1; i < META_CAP_MAX; i++) {
+			if (is_meta_tx_inp_enabled(inst, i)) {
+				payload[count + 1] = capability->cap[i].hfi_id;
 				count++;
 			}
 		}
 	} else if (port == OUTPUT_PORT) {
-		for (i = 0; i < ARRAY_SIZE(metadata_output_list); i++) {
-			if (is_meta_tx_out_enabled(inst, metadata_output_list[i])  &&
-				msm_vidc_allow_metadata(inst, metadata_output_list[i])) {
-				payload[count + 1] =
-					capability->cap[metadata_output_list[i]].hfi_id;
+		for (i = INST_CAP_NONE + 1; i < META_CAP_MAX; i++) {
+			if (is_meta_tx_out_enabled(inst, i)  &&
+				msm_vidc_allow_metadata_delivery(
+					inst, i, port)) {
+				payload[count + 1] = capability->cap[i].hfi_id;
 				count++;
 			}
 		}

+ 12 - 34
driver/vidc/src/msm_venc.c

@@ -681,15 +681,6 @@ static int msm_venc_metadata_delivery(struct msm_vidc_inst *inst,
 	u32 payload[32] = {0};
 	u32 i, count = 0;
 	struct msm_vidc_inst_capability *capability;
-	static const u32 metadata_output_list[] = {};
-	static const u32 metadata_input_list[] = {
-		META_SEI_MASTERING_DISP,
-		META_SEI_CLL,
-		META_HDR10PLUS,
-		META_EVA_STATS,
-		META_BUF_TAG,
-		META_ROI_INFO,
-	};
 
 	if (!inst || !inst->core) {
 		d_vpr_e("%s: invalid params\n", __func__);
@@ -702,18 +693,16 @@ static int msm_venc_metadata_delivery(struct msm_vidc_inst *inst,
 	payload[0] = HFI_MODE_METADATA;
 
 	if (port == INPUT_PORT) {
-		for (i = 0; i < ARRAY_SIZE(metadata_input_list); i++) {
-			if (is_meta_tx_inp_enabled(inst, metadata_input_list[i])) {
-				payload[count + 1] =
-					capability->cap[metadata_input_list[i]].hfi_id;
+		for (i = INST_CAP_NONE + 1; i < META_CAP_MAX; i++) {
+			if (is_meta_tx_inp_enabled(inst, i)) {
+				payload[count + 1] = capability->cap[i].hfi_id;
 				count++;
 			}
 		}
 	} else if (port == OUTPUT_PORT) {
-		for (i = 0; i < ARRAY_SIZE(metadata_output_list); i++) {
-			if (is_meta_tx_out_enabled(inst, metadata_output_list[i])) {
-				payload[count + 1] =
-					capability->cap[metadata_output_list[i]].hfi_id;
+		for (i = INST_CAP_NONE + 1; i < META_CAP_MAX; i++) {
+			if (is_meta_tx_out_enabled(inst, i)) {
+				payload[count + 1] = capability->cap[i].hfi_id;
 				count++;
 			}
 		}
@@ -741,15 +730,6 @@ static int msm_venc_metadata_subscription(struct msm_vidc_inst *inst,
 	u32 payload[32] = {0};
 	u32 i, count = 0;
 	struct msm_vidc_inst_capability *capability;
-	static const u32 metadata_input_list[] = {};
-	static const u32 metadata_output_list[] = {
-		META_LTR_MARK_USE,
-		META_SEQ_HDR_NAL,
-		META_TIMESTAMP,
-		META_BUF_TAG,
-		META_SUBFRAME_OUTPUT,
-		META_ENC_QP_METADATA,
-	};
 
 	if (!inst) {
 		d_vpr_e("%s: invalid params\n", __func__);
@@ -761,18 +741,16 @@ static int msm_venc_metadata_subscription(struct msm_vidc_inst *inst,
 	payload[0] = HFI_MODE_METADATA;
 
 	if (port == INPUT_PORT) {
-		for (i = 0; i < ARRAY_SIZE(metadata_input_list); i++) {
-			if (is_meta_rx_inp_enabled(inst, metadata_input_list[i])) {
-				payload[count + 1] =
-					capability->cap[metadata_input_list[i]].hfi_id;
+		for (i = INST_CAP_NONE + 1; i < META_CAP_MAX; i++) {
+			if (is_meta_rx_inp_enabled(inst, i)) {
+				payload[count + 1] = capability->cap[i].hfi_id;
 				count++;
 			}
 		}
 	} else if (port == OUTPUT_PORT) {
-		for (i = 0; i < ARRAY_SIZE(metadata_output_list); i++) {
-			if (is_meta_rx_out_enabled(inst, metadata_output_list[i])) {
-				payload[count + 1] =
-					capability->cap[metadata_output_list[i]].hfi_id;
+		for (i = INST_CAP_NONE + 1; i < META_CAP_MAX; i++) {
+			if (is_meta_rx_out_enabled(inst, i)) {
+				payload[count + 1] = capability->cap[i].hfi_id;
 				count++;
 			}
 		}

+ 32 - 47
driver/vidc/src/msm_vidc_control.c

@@ -63,32 +63,6 @@ static bool is_priv_ctrl(u32 id)
 	return private;
 }
 
-static bool is_meta_ctrl(u32 id)
-{
-	return (id == V4L2_CID_MPEG_VIDC_METADATA_LTR_MARK_USE_DETAILS ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_SEQ_HEADER_NAL ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_DPB_LUMA_CHROMA_MISR ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_OPB_LUMA_CHROMA_MISR ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_INTERLACE ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_CONCEALED_MB_COUNT ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_HISTOGRAM_INFO ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_SEI_MASTERING_DISPLAY_COLOUR ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_SEI_CONTENT_LIGHT_LEVEL ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_HDR10PLUS ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_EVA_STATS ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_BUFFER_TAG ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_DPB_TAG_LIST ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_TIMESTAMP ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_ENC_QP_METADATA ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_DEC_QP_METADATA ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_BITSTREAM_RESOLUTION ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_CROP_OFFSETS ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_MAX_NUM_REORDER_FRAMES ||
-		id == V4L2_CID_MPEG_VIDC_METADATA_OUTBUF_FENCE);
-}
-
 static const char *const mpeg_video_rate_control[] = {
 	"VBR",
 	"CBR",
@@ -433,7 +407,7 @@ int msm_vidc_update_cap_value(struct msm_vidc_inst *inst, u32 cap_id,
 
 	prev_value = inst->capabilities->cap[cap_id].value;
 
-	if (is_meta_ctrl(inst->capabilities->cap[cap_id].v4l2_id)) {
+	if (is_meta_cap(cap_id)) {
 		/*
 		 * cumulative control value if client set same metadata
 		 * control multiple times.
@@ -831,10 +805,24 @@ int msm_vidc_ctrl_init(struct msm_vidc_inst *inst)
 			ctrl_cfg.max = capability->cap[idx].max;
 			ctrl_cfg.min = capability->cap[idx].min;
 			ctrl_cfg.ops = core->v4l2_ctrl_ops;
-			ctrl_cfg.type = (capability->cap[idx].flags &
-					CAP_FLAG_MENU) ?
-					V4L2_CTRL_TYPE_MENU :
-					V4L2_CTRL_TYPE_INTEGER;
+			if (capability->cap[idx].flags & CAP_FLAG_MENU)
+				ctrl_cfg.type = V4L2_CTRL_TYPE_MENU;
+			else if (capability->cap[idx].flags & CAP_FLAG_BITMASK)
+				ctrl_cfg.type = V4L2_CTRL_TYPE_BITMASK;
+			else
+				ctrl_cfg.type = V4L2_CTRL_TYPE_INTEGER;
+			/* allow all metadata modes from v4l2 side */
+			if (is_meta_cap(idx)) {
+				ctrl_cfg.max = V4L2_MPEG_VIDC_META_MAX - 1;
+				/* bitmask is expected to be enabled for meta controls */
+				if (ctrl_cfg.type != V4L2_CTRL_TYPE_BITMASK) {
+					i_vpr_e(inst,
+						"%s: missing bitmask for cap %s\n",
+						__func__, cap_name(idx));
+					rc = -EINVAL;
+					goto error;
+				}
+			}
 			if (ctrl_cfg.type == V4L2_CTRL_TYPE_MENU) {
 				ctrl_cfg.menu_skip_mask =
 					~(capability->cap[idx].step_or_mask);
@@ -873,8 +861,8 @@ int msm_vidc_ctrl_init(struct msm_vidc_inst *inst)
 			}
 		}
 		if (!ctrl) {
-			i_vpr_e(inst, "%s: invalid ctrl %#x\n", __func__,
-				capability->cap[idx].v4l2_id);
+			i_vpr_e(inst, "%s: invalid ctrl %#x cap %24s\n", __func__,
+				capability->cap[idx].v4l2_id, cap_name(idx));
 			rc = -EINVAL;
 			goto error;
 		}
@@ -1068,25 +1056,22 @@ static int msm_vidc_update_static_property(struct msm_vidc_inst *inst,
 
 		msm_vidc_allow_dcvs(inst);
 	}
-	if (is_meta_ctrl(ctrl->id)) {
-		if (cap_id == META_DPB_TAG_LIST) {
-			/*
-			 * To subscribe HFI_PROP_DPB_TAG_LIST
-			 * data in FBD, HFI_PROP_BUFFER_TAG data
-			 * must be delivered via FTB. Hence, update
-			 * META_OUTPUT_BUF_TAG to transfer on output port
-			 * when META_DPB_TAG_LIST is enbaled.
-			 */
-			if (is_meta_rx_out_enabled(inst, META_DPB_TAG_LIST)) {
-				inst->capabilities->cap[META_OUTPUT_BUF_TAG].value |=
-					V4L2_MPEG_VIDC_META_TX_OUTPUT | V4L2_MPEG_VIDC_META_ENABLE;
-			}
-		}
 
+	if (is_meta_cap(cap_id)) {
+		/* validate metadata control value against allowed settings */
+		if ((ctrl->val & inst->capabilities->cap[cap_id].max) != ctrl->val) {
+			i_vpr_e(inst,
+				"%s: allowed bits for cap %s is %#x, client set %#x\n",
+				__func__, cap_name(cap_id),
+				inst->capabilities->cap[cap_id].max,
+				ctrl->val);
+			return -EINVAL;
+		}
 		rc = msm_vidc_update_meta_port_settings(inst);
 		if (rc)
 			return rc;
 	}
+
 	rc = msm_vidc_update_buffer_count_if_needed(inst, ctrl);
 	if (rc)
 		return rc;

+ 66 - 36
driver/vidc/src/msm_vidc_driver.c

@@ -57,6 +57,29 @@ struct msm_vidc_cap_name {
 
 static const struct msm_vidc_cap_name cap_name_arr[] = {
 	{INST_CAP_NONE,                  "INST_CAP_NONE"              },
+	{META_SEQ_HDR_NAL,               "META_SEQ_HDR_NAL"           },
+	{META_BITSTREAM_RESOLUTION,      "META_BITSTREAM_RESOLUTION"  },
+	{META_CROP_OFFSETS,              "META_CROP_OFFSETS"          },
+	{META_DPB_MISR,                  "META_DPB_MISR"              },
+	{META_OPB_MISR,                  "META_OPB_MISR"              },
+	{META_INTERLACE,                 "META_INTERLACE"             },
+	{META_OUTBUF_FENCE,              "META_OUTBUF_FENCE"          },
+	{META_LTR_MARK_USE,              "META_LTR_MARK_USE"          },
+	{META_TIMESTAMP,                 "META_TIMESTAMP"             },
+	{META_CONCEALED_MB_CNT,          "META_CONCEALED_MB_CNT"      },
+	{META_HIST_INFO,                 "META_HIST_INFO"             },
+	{META_SEI_MASTERING_DISP,        "META_SEI_MASTERING_DISP"    },
+	{META_SEI_CLL,                   "META_SEI_CLL"               },
+	{META_HDR10PLUS,                 "META_HDR10PLUS"             },
+	{META_BUF_TAG,                   "META_BUF_TAG"               },
+	{META_DPB_TAG_LIST,              "META_DPB_TAG_LIST"          },
+	{META_SUBFRAME_OUTPUT,           "META_SUBFRAME_OUTPUT"       },
+	{META_ENC_QP_METADATA,           "META_ENC_QP_METADATA"       },
+	{META_DEC_QP_METADATA,           "META_DEC_QP_METADATA"       },
+	{META_MAX_NUM_REORDER_FRAMES,    "META_MAX_NUM_REORDER_FRAMES"},
+	{META_EVA_STATS,                 "META_EVA_STATS"             },
+	{META_ROI_INFO,                  "META_ROI_INFO"              },
+	{META_CAP_MAX,                   "META_CAP_MAX"               },
 	{FRAME_WIDTH,                    "FRAME_WIDTH"                },
 	{LOSSLESS_FRAME_WIDTH,           "LOSSLESS_FRAME_WIDTH"       },
 	{SECURE_FRAME_WIDTH,             "SECURE_FRAME_WIDTH"         },
@@ -83,7 +106,6 @@ static const struct msm_vidc_cap_name cap_name_arr[] = {
 	{MB_CYCLES_FW,                   "MB_CYCLES_FW"               },
 	{MB_CYCLES_FW_VPP,               "MB_CYCLES_FW_VPP"           },
 	{SECURE_MODE,                    "SECURE_MODE"                },
-	{META_OUTBUF_FENCE,              "META_OUTBUF_FENCE"          },
 	{FENCE_ID,                       "FENCE_ID"                   },
 	{FENCE_FD,                       "FENCE_FD"                   },
 	{TS_REORDER,                     "TS_REORDER"                 },
@@ -94,7 +116,6 @@ static const struct msm_vidc_cap_name cap_name_arr[] = {
 	{SUPER_FRAME,                    "SUPER_FRAME"                },
 	{HEADER_MODE,                    "HEADER_MODE"                },
 	{PREPEND_SPSPPS_TO_IDR,          "PREPEND_SPSPPS_TO_IDR"      },
-	{META_SEQ_HDR_NAL,               "META_SEQ_HDR_NAL"           },
 	{WITHOUT_STARTCODE,              "WITHOUT_STARTCODE"          },
 	{NAL_LENGTH_FIELD,               "NAL_LENGTH_FIELD"           },
 	{REQUEST_I_FRAME,                "REQUEST_I_FRAME"            },
@@ -156,30 +177,9 @@ static const struct msm_vidc_cap_name cap_name_arr[] = {
 	{DRAP,                           "DRAP"                       },
 	{INPUT_METADATA_FD,              "INPUT_METADATA_FD"          },
 	{INPUT_META_VIA_REQUEST,         "INPUT_META_VIA_REQUEST"     },
-	{META_BITSTREAM_RESOLUTION,      "META_BITSTREAM_RESOLUTION"  },
-	{META_CROP_OFFSETS,              "META_CROP_OFFSETS"          },
-	{META_DPB_MISR,                  "META_DPB_MISR"              },
-	{META_OPB_MISR,                  "META_OPB_MISR"              },
-	{META_INTERLACE,                 "META_INTERLACE"             },
 	{ENC_IP_CR,                      "ENC_IP_CR"                  },
-	{META_LTR_MARK_USE,              "META_LTR_MARK_USE"          },
-	{META_TIMESTAMP,                 "META_TIMESTAMP"             },
-	{META_CONCEALED_MB_CNT,          "META_CONCEALED_MB_CNT"      },
-	{META_HIST_INFO,                 "META_HIST_INFO"             },
-	{META_SEI_MASTERING_DISP,        "META_SEI_MASTERING_DISP"    },
-	{META_SEI_CLL,                   "META_SEI_CLL"               },
-	{META_HDR10PLUS,                 "META_HDR10PLUS"             },
-	{META_EVA_STATS,                 "META_EVA_STATS"             },
-	{META_BUF_TAG,                   "META_BUF_TAG"               },
-	{META_DPB_TAG_LIST,              "META_DPB_TAG_LIST"          },
-	{META_OUTPUT_BUF_TAG,            "META_OUTPUT_BUF_TAG"        },
-	{META_SUBFRAME_OUTPUT,           "META_SUBFRAME_OUTPUT"       },
-	{META_ENC_QP_METADATA,           "META_ENC_QP_METADATA"       },
-	{META_DEC_QP_METADATA,           "META_DEC_QP_METADATA"       },
 	{COMPLEXITY,                     "COMPLEXITY"                 },
-	{META_MAX_NUM_REORDER_FRAMES,    "META_MAX_NUM_REORDER_FRAMES"},
 	{PROFILE,                        "PROFILE"                    },
-	{META_ROI_INFO,                  "META_ROI_INFO"              },
 	{ENH_LAYER_COUNT,                "ENH_LAYER_COUNT"            },
 	{BIT_RATE,                       "BIT_RATE"                   },
 	{LOWLATENCY_MODE,                "LOWLATENCY_MODE"            },
@@ -1379,7 +1379,14 @@ exit:
 	return allow;
 }
 
-bool msm_vidc_allow_metadata(struct msm_vidc_inst *inst, u32 cap_id)
+bool msm_vidc_allow_metadata_delivery(struct msm_vidc_inst *inst, u32 cap_id,
+	u32 port)
+{
+	return true;
+}
+
+bool msm_vidc_allow_metadata_subscription(struct msm_vidc_inst *inst, u32 cap_id,
+	u32 port)
 {
 	bool is_allowed = true;
 
@@ -1388,19 +1395,42 @@ bool msm_vidc_allow_metadata(struct msm_vidc_inst *inst, u32 cap_id)
 		return false;
 	}
 
-	switch (cap_id) {
-	case META_OUTPUT_BUF_TAG:
-	case META_DPB_TAG_LIST:
-		if (!is_ubwc_colorformat(inst->capabilities->cap[PIX_FMTS].value)) {
-			i_vpr_h(inst,
-				"%s: cap: %24s not allowed for split mode\n",
-				__func__, cap_name(cap_id));
-			is_allowed = false;
+	if (port == INPUT_PORT) {
+		switch (cap_id) {
+		case META_BUF_TAG:
+		case META_BITSTREAM_RESOLUTION:
+		case META_CROP_OFFSETS:
+		case META_SEI_MASTERING_DISP:
+		case META_SEI_CLL:
+		case META_HDR10PLUS:
+			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",
+					__func__, cap_name(cap_id));
+				is_allowed = false;
+			}
+			break;
+		default:
+			is_allowed = true;
+			break;
 		}
-		break;
-	default:
-		is_allowed = true;
-		break;
+	} else if (port == OUTPUT_PORT) {
+		switch (cap_id) {
+		case META_DPB_TAG_LIST:
+			if (!is_ubwc_colorformat(inst->capabilities->cap[PIX_FMTS].value)) {
+				i_vpr_h(inst,
+					"%s: cap: %24s not allowed for split mode\n",
+					__func__, cap_name(cap_id));
+				is_allowed = false;
+			}
+			break;
+		default:
+			is_allowed = true;
+			break;
+		}
+	} else {
+		i_vpr_e(inst, "%s: invalid port %d\n", __func__, port);
+		is_allowed = false;
 	}
 
 	return is_allowed;