Bladeren bron

video: driver: Enable bitwise operations for metadata controls

Enable bitwise operations for metadata controls with below
mentioned bit definitions:
- ENABLE (BIT 0): Enable metadata.
- TX_INP (BIT 1): Client transfers metadata in input port.
- TX_OUT (BIT 2): Client transfers metadata in output port.
- RX_INP (BIT 3): Client receives metadata in input port.
- RX_OUT (BIT 4): Client receives metadata in output port.

Change-Id: Ie3d720528a383632c7766a5ccb09cead0f6b9428
Signed-off-by: Akshata Sahukar <[email protected]>
Akshata Sahukar 3 jaren geleden
bovenliggende
commit
d85f112d92

+ 53 - 59
driver/platform/kalama/src/msm_vidc_kalama.c

@@ -279,13 +279,13 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		NULL, msm_vidc_set_u32},
 
 	/*
-	 * Client will enable V4L2_CID_MPEG_VIDC_INPUT_METADATA_OUTBUF_FENCE
+	 * Client will enable V4L2_CID_MPEG_VIDC_METADATA_OUTBUF_FENCE
 	 * to get fence_id in input metadata buffer done.
 	 */
-	{INPUT_META_OUTBUF_FENCE, DEC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
-		V4L2_CID_MPEG_VIDC_INPUT_METADATA_OUTBUF_FENCE,
+	{META_OUTBUF_FENCE, DEC, CODECS_ALL,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_CID_MPEG_VIDC_METADATA_OUTBUF_FENCE,
 		HFI_PROP_FENCE},
 
 	/*
@@ -372,12 +372,6 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR},
 
-	{META_SEQ_HDR_NAL, ENC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE,
-		V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
-		V4L2_CID_MPEG_VIDC_METADATA_SEQ_HEADER_NAL},
-
 	{WITHOUT_STARTCODE, ENC, CODECS_ALL,
 		V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_MPEG_MSM_VIDC_ENABLE,
@@ -1594,14 +1588,14 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		NULL, msm_vidc_set_u32},
 
 	{META_BITSTREAM_RESOLUTION, DEC, AV1,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_BITSTREAM_RESOLUTION,
 		HFI_PROP_BITSTREAM_RESOLUTION},
 
 	{META_CROP_OFFSETS, DEC, AV1,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_CROP_OFFSETS,
 		HFI_PROP_CROP_OFFSETS},
 
@@ -1633,74 +1627,74 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		NULL, NULL},
 
 	{META_LTR_MARK_USE, ENC, H264|HEVC,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_LTR_MARK_USE_DETAILS,
 		HFI_PROP_LTR_MARK_USE_DETAILS},
 
 	{META_SEQ_HDR_NAL, ENC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_SEQ_HEADER_NAL,
 		HFI_PROP_METADATA_SEQ_HEADER_NAL},
 
 	{META_DPB_MISR, DEC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_DPB_LUMA_CHROMA_MISR,
 		HFI_PROP_DPB_LUMA_CHROMA_MISR},
 
 	{META_OPB_MISR, DEC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_OPB_LUMA_CHROMA_MISR,
 		HFI_PROP_OPB_LUMA_CHROMA_MISR},
 
 	{META_INTERLACE, DEC, H264,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_INTERLACE,
 		HFI_PROP_INTERLACE_INFO},
 
 	{META_TIMESTAMP, DEC | ENC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_TIMESTAMP,
 		HFI_PROP_TIMESTAMP},
 
 	{META_CONCEALED_MB_CNT, DEC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_CONCEALED_MB_COUNT,
 		HFI_PROP_CONEALED_MB_COUNT},
 
 	{META_HIST_INFO, DEC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_HISTOGRAM_INFO,
 		HFI_PROP_HISTOGRAM_INFO},
 
 	{META_SEI_MASTERING_DISP, DEC|ENC, HEVC|HEIC|AV1,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_SEI_MASTERING_DISPLAY_COLOUR,
 		HFI_PROP_SEI_MASTERING_DISPLAY_COLOUR},
 
 	{META_SEI_CLL, DEC|ENC, HEVC|HEIC|AV1,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_SEI_CONTENT_LIGHT_LEVEL,
 		HFI_PROP_SEI_CONTENT_LIGHT_LEVEL},
 
 	{META_HDR10PLUS, DEC | ENC, HEVC|HEIC|AV1,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_HDR10PLUS,
 		HFI_PROP_SEI_HDR10PLUS_USERDATA},
 
 	{META_EVA_STATS, ENC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_EVA_STATS,
 		HFI_PROP_EVA_STAT_INFO,
 		0,
@@ -1708,38 +1702,38 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		{ENH_LAYER_COUNT}},
 
 	{META_BUF_TAG, DEC | ENC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_BUFFER_TAG,
 		HFI_PROP_BUFFER_TAG},
 
 	{META_DPB_TAG_LIST, DEC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, 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_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		0,
 		HFI_PROP_BUFFER_TAG},
 
 	{META_SUBFRAME_OUTPUT, DEC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT,
 		HFI_PROP_SUBFRAME_OUTPUT},
 
 	{META_ENC_QP_METADATA, ENC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_ENC_QP_METADATA,
 		HFI_PROP_ENC_QP_METADATA},
 
 	{META_ROI_INFO, ENC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO,
 		HFI_PROP_ROI_INFO,
 		CAP_FLAG_INPUT_PORT,
@@ -1748,8 +1742,8 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		msm_vidc_adjust_roi_info, NULL},
 
 	{META_ROI_INFO, ENC, H264|HEVC,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO,
 		HFI_PROP_ROI_INFO,
 		CAP_FLAG_INPUT_PORT,
@@ -1758,8 +1752,8 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		msm_vidc_adjust_roi_info, NULL},
 
 	{META_DEC_QP_METADATA, DEC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_DEC_QP_METADATA,
 		HFI_PROP_DEC_QP_METADATA},
 
@@ -1852,8 +1846,8 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		{0}, {0},
 		NULL, msm_vidc_set_q16},
 	{META_SUBFRAME_OUTPUT, ENC, HEIC,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT,
 		HFI_PROP_SUBFRAME_OUTPUT},
 	{COMPLEXITY, ENC, H264 | HEVC,
@@ -1861,8 +1855,8 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		1, 100,
 		V4L2_CID_MPEG_VIDC_VENC_COMPLEXITY},
 	{META_MAX_NUM_REORDER_FRAMES, DEC, HEVC | H264,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_MAX_NUM_REORDER_FRAMES,
 		HFI_PROP_MAX_NUM_REORDER_FRAMES},
 };

+ 44 - 50
driver/platform/waipio/src/msm_vidc_waipio.c

@@ -332,12 +332,6 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR},
 
-	{META_SEQ_HDR_NAL, ENC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE,
-		V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
-		V4L2_CID_MPEG_VIDC_METADATA_SEQ_HEADER_NAL},
-
 	{WITHOUT_STARTCODE, ENC, CODECS_ALL,
 		V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_MPEG_MSM_VIDC_ENABLE,
@@ -1491,74 +1485,74 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		NULL, NULL},
 
 	{META_LTR_MARK_USE, ENC, H264|HEVC,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_LTR_MARK_USE_DETAILS,
 		HFI_PROP_LTR_MARK_USE_DETAILS},
 
 	{META_SEQ_HDR_NAL, ENC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_SEQ_HEADER_NAL,
 		HFI_PROP_METADATA_SEQ_HEADER_NAL},
 
 	{META_DPB_MISR, DEC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_DPB_LUMA_CHROMA_MISR,
 		HFI_PROP_DPB_LUMA_CHROMA_MISR},
 
 	{META_OPB_MISR, DEC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_OPB_LUMA_CHROMA_MISR,
 		HFI_PROP_OPB_LUMA_CHROMA_MISR},
 
 	{META_INTERLACE, DEC, H264,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_INTERLACE,
 		HFI_PROP_INTERLACE_INFO},
 
 	{META_TIMESTAMP, DEC | ENC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_TIMESTAMP,
 		HFI_PROP_TIMESTAMP},
 
 	{META_CONCEALED_MB_CNT, DEC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_CONCEALED_MB_COUNT,
 		HFI_PROP_CONEALED_MB_COUNT},
 
 	{META_HIST_INFO, DEC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_HISTOGRAM_INFO,
 		HFI_PROP_HISTOGRAM_INFO},
 
 	{META_SEI_MASTERING_DISP, DEC|ENC, HEVC|HEIC,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_SEI_MASTERING_DISPLAY_COLOUR,
 		HFI_PROP_SEI_MASTERING_DISPLAY_COLOUR},
 
 	{META_SEI_CLL, DEC|ENC, HEVC|HEIC,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_SEI_CONTENT_LIGHT_LEVEL,
 		HFI_PROP_SEI_CONTENT_LIGHT_LEVEL},
 
 	{META_HDR10PLUS, DEC | ENC, HEVC|HEIC,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_HDR10PLUS,
 		HFI_PROP_SEI_HDR10PLUS_USERDATA},
 
 	{META_EVA_STATS, ENC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_EVA_STATS,
 		HFI_PROP_EVA_STAT_INFO,
 		0,
@@ -1566,38 +1560,38 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		{ENH_LAYER_COUNT}},
 
 	{META_BUF_TAG, DEC | ENC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_BUFFER_TAG,
 		HFI_PROP_BUFFER_TAG},
 
 	{META_DPB_TAG_LIST, DEC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, 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_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		0,
 		HFI_PROP_BUFFER_TAG},
 
 	{META_SUBFRAME_OUTPUT, DEC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT,
 		HFI_PROP_SUBFRAME_OUTPUT},
 
 	{META_ENC_QP_METADATA, ENC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_ENC_QP_METADATA,
 		HFI_PROP_ENC_QP_METADATA},
 
 	{META_ROI_INFO, ENC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO,
 		HFI_PROP_ROI_INFO,
 		CAP_FLAG_INPUT_PORT,
@@ -1606,8 +1600,8 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		msm_vidc_adjust_roi_info, NULL},
 
 	{META_ROI_INFO, ENC, H264|HEVC,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO,
 		HFI_PROP_ROI_INFO,
 		CAP_FLAG_INPUT_PORT,
@@ -1616,8 +1610,8 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		msm_vidc_adjust_roi_info, NULL},
 
 	{META_DEC_QP_METADATA, DEC, CODECS_ALL,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_DEC_QP_METADATA,
 		HFI_PROP_DEC_QP_METADATA},
 
@@ -1710,8 +1704,8 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		{0}, {0},
 		NULL, msm_vidc_set_q16},
 	{META_SUBFRAME_OUTPUT, ENC, HEIC,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT,
 		HFI_PROP_SUBFRAME_OUTPUT},
 	{COMPLEXITY, ENC, H264 | HEVC,
@@ -1719,8 +1713,8 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		1, 100,
 		V4L2_CID_MPEG_VIDC_VENC_COMPLEXITY},
 	{META_MAX_NUM_REORDER_FRAMES, DEC, HEVC | H264,
-		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
-		1, V4L2_MPEG_MSM_VIDC_DISABLE,
+		V4L2_MPEG_VIDC_META_DISABLE, V4L2_MPEG_VIDC_META_MAX,
+		1, V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_CID_MPEG_VIDC_METADATA_MAX_NUM_REORDER_FRAMES,
 		HFI_PROP_MAX_NUM_REORDER_FRAMES},
 };

+ 86 - 21
driver/vidc/inc/msm_vidc_driver.h

@@ -8,6 +8,7 @@
 
 #include <linux/workqueue.h>
 #include <linux/iommu.h>
+#include <media/v4l2_vidc_extensions.h>
 #include "msm_vidc_internal.h"
 #include "msm_vidc_core.h"
 #include "msm_vidc_inst.h"
@@ -99,18 +100,68 @@ static inline is_internal_buffer(enum msm_vidc_buffer_type buffer_type)
 		buffer_type == MSM_VIDC_BUF_VPSS;
 }
 
+static inline bool is_meta_rx_inp_enabled(struct msm_vidc_inst *inst, u32 cap)
+{
+	bool enabled = false;
+
+	if (inst->capabilities->cap[cap].value & V4L2_MPEG_VIDC_META_ENABLE &&
+		inst->capabilities->cap[cap].value & V4L2_MPEG_VIDC_META_RX_INPUT)
+		enabled = true;
+
+	return enabled;
+}
+
+static inline bool is_meta_rx_out_enabled(struct msm_vidc_inst *inst, u32 cap)
+{
+	bool enabled = false;
+
+	if (inst->capabilities->cap[cap].value & V4L2_MPEG_VIDC_META_ENABLE &&
+		inst->capabilities->cap[cap].value & V4L2_MPEG_VIDC_META_RX_OUTPUT)
+		enabled = true;
+
+	return enabled;
+}
+
+static inline bool is_meta_tx_inp_enabled(struct msm_vidc_inst *inst, u32 cap)
+{
+	bool enabled = false;
+
+	if (inst->capabilities->cap[cap].value & V4L2_MPEG_VIDC_META_ENABLE &&
+		inst->capabilities->cap[cap].value & V4L2_MPEG_VIDC_META_TX_INPUT)
+		enabled = true;
+
+	return enabled;
+}
+
+static inline bool is_meta_tx_out_enabled(struct msm_vidc_inst *inst, u32 cap)
+{
+	bool enabled = false;
+
+	if (inst->capabilities->cap[cap].value & V4L2_MPEG_VIDC_META_ENABLE &&
+		inst->capabilities->cap[cap].value & V4L2_MPEG_VIDC_META_TX_OUTPUT)
+		enabled = true;
+
+	return enabled;
+}
+
 static inline bool is_input_meta_enabled(struct msm_vidc_inst *inst)
 {
 	bool enabled = false;
 
 	if (is_decode_session(inst)) {
-		enabled = inst->capabilities->cap[META_BUF_TAG].value ?
-			true : false;
+		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 = (inst->capabilities->cap[META_SEQ_HDR_NAL].value ||
-			inst->capabilities->cap[META_EVA_STATS].value ||
-			inst->capabilities->cap[META_BUF_TAG].value ||
-			inst->capabilities->cap[META_ROI_INFO].value);
+		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);
 	}
 	return enabled;
 }
@@ -120,23 +171,37 @@ static inline bool is_output_meta_enabled(struct msm_vidc_inst *inst)
 	bool enabled = false;
 
 	if (is_decode_session(inst)) {
-		enabled = (inst->capabilities->cap[META_BITSTREAM_RESOLUTION].value ||
-			inst->capabilities->cap[META_CROP_OFFSETS].value ||
-			inst->capabilities->cap[META_DPB_MISR].value ||
-			inst->capabilities->cap[META_OPB_MISR].value ||
-			inst->capabilities->cap[META_INTERLACE].value ||
-			inst->capabilities->cap[META_CONCEALED_MB_CNT].value ||
-			inst->capabilities->cap[META_HIST_INFO].value ||
-			inst->capabilities->cap[META_SEI_MASTERING_DISP].value ||
-			inst->capabilities->cap[META_SEI_CLL].value ||
-			inst->capabilities->cap[META_BUF_TAG].value ||
-			inst->capabilities->cap[META_DPB_TAG_LIST].value ||
-			inst->capabilities->cap[META_SUBFRAME_OUTPUT].value ||
-			inst->capabilities->cap[META_MAX_NUM_REORDER_FRAMES].value);
+		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 = (inst->capabilities->cap[META_LTR_MARK_USE].value ||
-			inst->capabilities->cap[META_BUF_TAG].value);
+		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);
 	}
+
 	return enabled;
 }
 

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

@@ -375,7 +375,7 @@ enum msm_vidc_inst_capability_type {
 	MB_CYCLES_FW,
 	MB_CYCLES_FW_VPP,
 	SECURE_MODE,
-	INPUT_META_OUTBUF_FENCE,
+	META_OUTBUF_FENCE,
 	FENCE_ID,
 	FENCE_FD,
 	TS_REORDER,

+ 21 - 7
driver/vidc/src/msm_vdec.c

@@ -931,7 +931,7 @@ static int msm_vdec_subscribe_metadata(struct msm_vidc_inst *inst,
 	u32 i, count = 0;
 	struct msm_vidc_inst_capability *capability;
 	static const u32 metadata_input_list[] = {
-		INPUT_META_OUTBUF_FENCE,
+		META_OUTBUF_FENCE,
 		/*
 		 * when fence enabled, client needs output buffer_tag
 		 * in input metadata buffer done.
@@ -970,7 +970,7 @@ static int msm_vdec_subscribe_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 (capability->cap[metadata_input_list[i]].value &&
+			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;
@@ -979,7 +979,7 @@ static int msm_vdec_subscribe_metadata(struct msm_vidc_inst *inst,
 		}
 	} else if (port == OUTPUT_PORT) {
 		for (i = 0; i < ARRAY_SIZE(metadata_output_list); i++) {
-			if (capability->cap[metadata_output_list[i]].value &&
+			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;
@@ -1028,7 +1028,7 @@ static int msm_vdec_set_delivery_mode_metadata(struct msm_vidc_inst *inst,
 
 	if (port == INPUT_PORT) {
 		for (i = 0; i < ARRAY_SIZE(metadata_input_list); i++) {
-			if (capability->cap[metadata_input_list[i]].value) {
+			if (is_meta_tx_inp_enabled(inst, metadata_input_list[i])) {
 				payload[count + 1] =
 					capability->cap[metadata_input_list[i]].hfi_id;
 				count++;
@@ -1036,7 +1036,7 @@ static int msm_vdec_set_delivery_mode_metadata(struct msm_vidc_inst *inst,
 		}
 	} else if (port == OUTPUT_PORT) {
 		for (i = 0; i < ARRAY_SIZE(metadata_output_list); i++) {
-			if (capability->cap[metadata_output_list[i]].value  &&
+			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;
@@ -1068,7 +1068,7 @@ static int msm_vdec_set_delivery_mode_property(struct msm_vidc_inst *inst,
 	u32 i, count = 0;
 	struct msm_vidc_inst_capability *capability;
 	static const u32 property_output_list[] = {
-		INPUT_META_OUTBUF_FENCE,
+		META_OUTBUF_FENCE,
 	};
 	static const u32 property_input_list[] = {};
 
@@ -1091,6 +1091,20 @@ static int msm_vdec_set_delivery_mode_property(struct msm_vidc_inst *inst,
 		}
 	} else if (port == OUTPUT_PORT) {
 		for (i = 0; i < ARRAY_SIZE(property_output_list); i++) {
+			if (property_output_list[i] == META_OUTBUF_FENCE &&
+				is_meta_rx_inp_enabled(inst, META_OUTBUF_FENCE)) {
+				/*
+				 * if output buffer fence enabled via
+				 * META_OUTBUF_FENCE, then driver will send
+				 * fence id via HFI_PROP_FENCE to firmware.
+				 * So enable HFI_PROP_FENCE property as
+				 * delivery mode property.
+				 */
+				payload[count + 1] =
+					capability->cap[property_output_list[i]].hfi_id;
+				count++;
+				continue;
+			}
 			if (capability->cap[property_output_list[i]].value) {
 				payload[count + 1] =
 					capability->cap[property_output_list[i]].hfi_id;
@@ -2054,7 +2068,7 @@ int msm_vdec_qbuf(struct msm_vidc_inst *inst, struct vb2_buffer *vb2)
 	}
 
 	if (vb2->type == OUTPUT_META_PLANE) {
-		if (inst->capabilities->cap[META_DPB_TAG_LIST].value) {
+		if (is_meta_rx_out_enabled(inst, META_DPB_TAG_LIST)) {
 			/*
 			 * vb2 is not allowing client to pass data in output meta plane.
 			 * adjust the bytesused as client will send buffer tag metadata

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

@@ -681,7 +681,8 @@ 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_list[] = {
+	static const u32 metadata_output_list[] = {};
+	static const u32 metadata_input_list[] = {
 		META_SEI_MASTERING_DISP,
 		META_SEI_CLL,
 		META_HDR10PLUS,
@@ -699,12 +700,26 @@ static int msm_venc_metadata_delivery(struct msm_vidc_inst *inst,
 
 	capability = inst->capabilities;
 	payload[0] = HFI_MODE_METADATA;
-	for (i = 0; i < ARRAY_SIZE(metadata_list); i++) {
-		if (capability->cap[metadata_list[i]].value) {
-			payload[count + 1] =
-				capability->cap[metadata_list[i]].hfi_id;
-			count++;
+
+	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;
+				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;
+				count++;
+			}
+		}
+	} else {
+		i_vpr_e(inst, "%s: invalid port: %d\n", __func__, port);
+		return -EINVAL;
 	}
 
 	rc = venus_hfi_session_command(inst,
@@ -726,7 +741,8 @@ 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_list[] = {
+	static const u32 metadata_input_list[] = {};
+	static const u32 metadata_output_list[] = {
 		META_LTR_MARK_USE,
 		META_SEQ_HDR_NAL,
 		META_TIMESTAMP,
@@ -743,12 +759,26 @@ static int msm_venc_metadata_subscription(struct msm_vidc_inst *inst,
 
 	capability = inst->capabilities;
 	payload[0] = HFI_MODE_METADATA;
-	for (i = 0; i < ARRAY_SIZE(metadata_list); i++) {
-		if (capability->cap[metadata_list[i]].value) {
-			payload[count + 1] =
-				capability->cap[metadata_list[i]].hfi_id;
-			count++;
+
+	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;
+				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;
+				count++;
+			}
+		}
+	} else {
+		i_vpr_e(inst, "%s: invalid port: %d\n", __func__, port);
+		return -EINVAL;
 	}
 
 	rc = venus_hfi_session_command(inst,

+ 43 - 15
driver/vidc/src/msm_vidc_control.c

@@ -82,8 +82,11 @@ static bool is_meta_ctrl(u32 id)
 		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_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[] = {
@@ -420,18 +423,42 @@ static bool is_parent_available(struct msm_vidc_inst *inst,
 int msm_vidc_update_cap_value(struct msm_vidc_inst *inst, u32 cap_id,
 	s32 adjusted_val, const char *func)
 {
+	int prev_value = 0;
+	bool is_updated = false;
+
 	if (!inst || !inst->capabilities) {
 		d_vpr_e("%s: invalid params\n", __func__);
 		return -EINVAL;
 	}
 
-	if (inst->capabilities->cap[cap_id].value != adjusted_val)
+	prev_value = inst->capabilities->cap[cap_id].value;
+
+	if (is_meta_ctrl(inst->capabilities->cap[cap_id].v4l2_id)) {
+		/*
+		 * cumulative control value if client set same metadata
+		 * control multiple times.
+		 */
+		if (adjusted_val & V4L2_MPEG_VIDC_META_ENABLE) {
+			/* enable metadata */
+			inst->capabilities->cap[cap_id].value |= adjusted_val;
+		} else {
+			/* disable metadata */
+			inst->capabilities->cap[cap_id].value &= ~adjusted_val;
+		}
+		if (prev_value != (prev_value | adjusted_val))
+			is_updated = true;
+	} else {
+		inst->capabilities->cap[cap_id].value = adjusted_val;
+		if (prev_value != adjusted_val)
+			is_updated = true;
+	}
+
+	if (is_updated) {
 		i_vpr_h(inst,
 			"%s: updated database: name: %s, value: %#x -> %#x\n",
 			func, cap_name(cap_id),
-			inst->capabilities->cap[cap_id].value, adjusted_val);
-
-	inst->capabilities->cap[cap_id].value = adjusted_val;
+			prev_value, adjusted_val);
+	}
 
 	return 0;
 }
@@ -1047,11 +1074,13 @@ static int msm_vidc_update_static_property(struct msm_vidc_inst *inst,
 			 * 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 when META_DPB_TAG_LIST
-			 * is updated.
+			 * META_OUTPUT_BUF_TAG to transfer on output port
+			 * when META_DPB_TAG_LIST is enbaled.
 			 */
-			msm_vidc_update_cap_value(inst, META_OUTPUT_BUF_TAG,
-				ctrl->val, __func__);
+			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;
+			}
 		}
 
 		rc = msm_vidc_update_meta_port_settings(inst);
@@ -1754,7 +1783,7 @@ static int msm_vidc_adjust_static_layer_count_and_type(struct msm_vidc_inst *ins
 		goto exit;
 	}
 
-	if (!inst->capabilities->cap[META_EVA_STATS].value &&
+	if (!is_meta_tx_inp_enabled(inst, META_EVA_STATS) &&
 		hb_requested && (layer_count > 1)) {
 		layer_count = 1;
 		i_vpr_h(inst,
@@ -2577,7 +2606,7 @@ int msm_vidc_adjust_min_quality(void *instance, struct v4l2_ctrl *ctrl)
 		goto update_and_exit;
 	}
 
-	if (roi_enable) {
+	if (is_meta_tx_inp_enabled(inst, META_ROI_INFO)) {
 		i_vpr_h(inst,
 			"%s: min quality not supported with roi metadata\n",
 			__func__);
@@ -2585,7 +2614,7 @@ int msm_vidc_adjust_min_quality(void *instance, struct v4l2_ctrl *ctrl)
 		goto update_and_exit;
 	}
 
-	if (enh_layer_count && inst->hfi_layer_type != HFI_HIER_B) {
+	if (enh_layer_count > 0 && inst->hfi_layer_type != HFI_HIER_B) {
 		i_vpr_h(inst,
 			"%s: min quality not supported for HP encoding\n",
 			__func__);
@@ -2927,7 +2956,7 @@ int msm_vidc_set_header_mode(void *instance,
 {
 	int rc = 0;
 	struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
-	int header_mode, prepend_sps_pps, hdr_metadata;
+	int header_mode, prepend_sps_pps;
 	u32 hfi_value = 0;
 	struct msm_vidc_inst_capability *capability;
 
@@ -2939,7 +2968,6 @@ int msm_vidc_set_header_mode(void *instance,
 
 	header_mode = capability->cap[cap_id].value;
 	prepend_sps_pps = capability->cap[PREPEND_SPSPPS_TO_IDR].value;
-	hdr_metadata = capability->cap[META_SEQ_HDR_NAL].value;
 
 	/* prioritize PREPEND_SPSPPS_TO_IDR mode over other header modes */
 	if (prepend_sps_pps)
@@ -2949,7 +2977,7 @@ int msm_vidc_set_header_mode(void *instance,
 	else
 		hfi_value = HFI_SEQ_HEADER_SEPERATE_FRAME;
 
-	if (hdr_metadata)
+	if (is_meta_rx_inp_enabled(inst, META_SEQ_HDR_NAL))
 		hfi_value |= HFI_SEQ_HEADER_METADATA;
 
 	rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,

+ 5 - 5
driver/vidc/src/msm_vidc_driver.c

@@ -82,7 +82,7 @@ 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"                },
-	{INPUT_META_OUTBUF_FENCE,        "INPUT_META_OUTBUF_FENCE"    },
+	{META_OUTBUF_FENCE,              "META_OUTBUF_FENCE"          },
 	{FENCE_ID,                       "FENCE_ID"                   },
 	{FENCE_FD,                       "FENCE_FD"                   },
 	{TS_REORDER,                     "TS_REORDER"                 },
@@ -1416,10 +1416,10 @@ bool msm_vidc_allow_property(struct msm_vidc_inst *inst, u32 hfi_id)
 		}
 		break;
 	case HFI_PROP_FENCE:
-		if (!inst->capabilities->cap[INPUT_META_OUTBUF_FENCE].value) {
+		if (!is_meta_rx_inp_enabled(inst, META_OUTBUF_FENCE)) {
 			i_vpr_h(inst,
 				"%s: cap: %24s not enabled, hence not allowed to subscribe\n",
-				__func__, cap_name(INPUT_META_OUTBUF_FENCE));
+				__func__, cap_name(META_OUTBUF_FENCE));
 			is_allowed = false;
 		}
 		break;
@@ -3305,7 +3305,7 @@ int msm_vidc_queue_buffer_single(struct msm_vidc_inst *inst, struct vb2_buffer *
 	if (!buf)
 		return -EINVAL;
 
-	if (inst->capabilities->cap[INPUT_META_OUTBUF_FENCE].value &&
+	if (is_meta_rx_inp_enabled(inst, META_OUTBUF_FENCE) &&
 		is_output_buffer(buf->type)) {
 		fence = msm_vidc_fence_create(inst);
 		if (!fence)
@@ -3786,7 +3786,7 @@ int msm_vidc_buffer_done(struct msm_vidc_inst *inst,
 
 	if (buf->type == MSM_VIDC_BUF_INPUT_META &&
 		inst->capabilities->cap[INPUT_META_VIA_REQUEST].value) {
-		if (inst->capabilities->cap[INPUT_META_OUTBUF_FENCE].value)
+		if (is_meta_rx_inp_enabled(inst, META_OUTBUF_FENCE))
 			return msm_vidc_v4l2_buffer_event(inst, buf);
 	} else {
 		return msm_vidc_vb2_buffer_done(inst, buf);

+ 1 - 1
driver/vidc/src/venus_hfi.c

@@ -3523,7 +3523,7 @@ int venus_hfi_queue_buffer(struct msm_vidc_inst *inst,
 			goto unlock;
 	}
 
-	if (inst->capabilities->cap[INPUT_META_OUTBUF_FENCE].value &&
+	if (is_meta_rx_inp_enabled(inst, META_OUTBUF_FENCE) &&
 		is_output_buffer(buffer->type)) {
 		rc = hfi_create_packet(inst->packet,
 			inst->packet_size,

+ 1 - 1
driver/vidc/src/venus_hfi_response.c

@@ -1557,7 +1557,7 @@ static int handle_session_property(struct msm_vidc_inst *inst,
 				__func__,  payload_ptr[0], inst->capabilities->cap[PIPE].value);
 		break;
 	case HFI_PROP_FENCE:
-		if (inst->capabilities->cap[INPUT_META_OUTBUF_FENCE].value) {
+		if (is_meta_rx_inp_enabled(inst, META_OUTBUF_FENCE)) {
 			if (payload_ptr) {
 				fence_id = payload_ptr[0];
 				rc = msm_vidc_fence_signal(inst, fence_id);

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

@@ -89,6 +89,16 @@ enum v4l2_mpeg_vidc_blur_types {
 	(V4L2_CID_MPEG_VIDC_BASE + 0x12)
 
 /* various Metadata - encoder & decoder */
+enum v4l2_mpeg_vidc_metadata_bits {
+	V4L2_MPEG_VIDC_META_DISABLE          = 0x0,
+	V4L2_MPEG_VIDC_META_ENABLE           = 0x1,
+	V4L2_MPEG_VIDC_META_TX_INPUT         = 0x2,
+	V4L2_MPEG_VIDC_META_TX_OUTPUT        = 0x4,
+	V4L2_MPEG_VIDC_META_RX_INPUT         = 0x8,
+	V4L2_MPEG_VIDC_META_RX_OUTPUT        = 0x10,
+	V4L2_MPEG_VIDC_META_MAX              = 0x20,
+};
+
 #define V4L2_CID_MPEG_VIDC_METADATA_LTR_MARK_USE_DETAILS                      \
 	(V4L2_CID_MPEG_VIDC_BASE + 0x13)
 #define V4L2_CID_MPEG_VIDC_METADATA_SEQ_HEADER_NAL                            \
@@ -201,7 +211,7 @@ enum v4l2_mpeg_video_av1_tier {
 #define V4L2_CID_MPEG_VIDC_INPUT_METADATA_VIA_REQUEST_ENABLE                 \
 	(V4L2_CID_MPEG_VIDC_BASE + 0x37)
 /* Enables Output buffer fence id via input metadata */
-#define V4L2_CID_MPEG_VIDC_INPUT_METADATA_OUTBUF_FENCE                       \
+#define V4L2_CID_MPEG_VIDC_METADATA_OUTBUF_FENCE                             \
 	(V4L2_CID_MPEG_VIDC_BASE + 0x38)
 /* Control to set fence id to driver in order get corresponding fence fd */
 #define V4L2_CID_MPEG_VIDC_SW_FENCE_ID                                       \