Browse Source

video: driver: fixes to get enc start/stop working

below are the fixes added to get enc start/stop working
along with setting default values to firmware for basic
functionality controls.
  - Create and queue COMV and NON COMV internal buffers
  - Use HFI_PAYLOAD_64_PACKED as payload_info type instead
    of HFI_PAYLOAD_32_PACKED HFI_PROP_CROP_OFFSETS
  - Introduce new control port specifier flags in instance
    database to help set correct port to controls while
    packetization
  - Add support to map basic functionality controls
    v4l2 enum values to hfi enum values
  - Enable static adjust and set controls support

Change-Id: Idc0dc3e3d07d8f6349c74136327a45d77ced1035
Signed-off-by: Akshata Sahukar <[email protected]>
Akshata Sahukar 4 years ago
parent
commit
bdc2de6c93

+ 102 - 91
driver/platform/waipio/src/msm_vidc_waipio.c

@@ -115,7 +115,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		0, 64, 1, 4,
 		0, 64, 1, 4,
 		V4L2_CID_MIN_BUFFERS_FOR_CAPTURE,
 		V4L2_CID_MIN_BUFFERS_FOR_CAPTURE,
 		HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
 		HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	/* (8192 * 4320) / 256 */
 	/* (8192 * 4320) / 256 */
 	{MBPF, ENC|DEC, CODECS_ALL, 64, 138240, 1, 138240},
 	{MBPF, ENC|DEC, CODECS_ALL, 64, 138240, 1, 138240},
@@ -132,7 +132,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_MPEG_VIDEO_B_FRAMES,
 		V4L2_CID_MPEG_VIDEO_B_FRAMES,
 		HFI_PROP_MAX_B_FRAMES,
 		HFI_PROP_MAX_B_FRAMES,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	/* ((4096 * 2304) / 256) * 60 fps */
 	/* ((4096 * 2304) / 256) * 60 fps */
 	{POWER_SAVE_MBPS, ENC, CODECS_ALL,
 	{POWER_SAVE_MBPS, ENC, CODECS_ALL,
@@ -173,13 +173,13 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDC_B_FRAME_MIN_QP,
 		V4L2_CID_MPEG_VIDC_B_FRAME_MIN_QP,
 		HFI_PROP_MIN_QP_PACKED,
 		HFI_PROP_MIN_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{B_FRAME_MAX_QP, ENC, HEVC|H264,
 	{B_FRAME_MAX_QP, ENC, HEVC|H264,
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDC_B_FRAME_MAX_QP,
 		V4L2_CID_MPEG_VIDC_B_FRAME_MAX_QP,
 		HFI_PROP_MAX_QP_PACKED,
 		HFI_PROP_MAX_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{HFLIP, ENC, CODECS_ALL,
 	{HFLIP, ENC, CODECS_ALL,
 		V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_MPEG_MSM_VIDC_DISABLE,
@@ -187,7 +187,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_HFLIP,
 		V4L2_CID_HFLIP,
 		HFI_PROP_FLIP,
 		HFI_PROP_FLIP,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{VFLIP, ENC, CODECS_ALL,
 	{VFLIP, ENC, CODECS_ALL,
 		V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_MPEG_MSM_VIDC_DISABLE,
@@ -195,7 +195,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_VFLIP,
 		V4L2_CID_VFLIP,
 		HFI_PROP_FLIP,
 		HFI_PROP_FLIP,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{PREPEND_SPSPPS_TO_IDR, ENC, CODECS_ALL,
 	{PREPEND_SPSPPS_TO_IDR, ENC, CODECS_ALL,
 		V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_MPEG_MSM_VIDC_DISABLE,
@@ -203,13 +203,13 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR,
 		V4L2_CID_MPEG_VIDEO_PREPEND_SPSPPS_TO_IDR,
 		HFI_PROP_SEQ_HEADER_MODE,
 		HFI_PROP_SEQ_HEADER_MODE,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{REQUEST_I_FRAME, ENC, CODECS_ALL,
 	{REQUEST_I_FRAME, ENC, CODECS_ALL,
 		0, 0, 0, 0,
 		0, 0, 0, 0,
 		V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME,
 		V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME,
 		HFI_PROP_REQUEST_SYNC_FRAME,
 		HFI_PROP_REQUEST_SYNC_FRAME,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{SLICE_INTERFACE, DEC, CODECS_ALL,
 	{SLICE_INTERFACE, DEC, CODECS_ALL,
 		0, 0, 0, 0,
 		0, 0, 0, 0,
@@ -231,7 +231,9 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
 		V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
 		V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
 		V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
 		HFI_PROP_RATE_CONTROL,
 		HFI_PROP_RATE_CONTROL,
-		CAP_FLAG_ROOT | CAP_FLAG_MENU},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+		{0}, {0},
+		NULL, msm_vidc_set_u32},
 
 
 	{HEADER_MODE, ENC, CODECS_ALL,
 	{HEADER_MODE, ENC, CODECS_ALL,
 		V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE,
 		V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE,
@@ -241,14 +243,16 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE,
 		V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE,
 		V4L2_CID_MPEG_VIDEO_HEADER_MODE,
 		V4L2_CID_MPEG_VIDEO_HEADER_MODE,
 		HFI_PROP_SEQ_HEADER_MODE,
 		HFI_PROP_SEQ_HEADER_MODE,
-		CAP_FLAG_ROOT | CAP_FLAG_MENU},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+		{0}, {0},
+		NULL, msm_vidc_set_u32},
 
 
 	// confirm codec
 	// confirm codec
 	{GOP_SIZE, ENC, CODECS_ALL,
 	{GOP_SIZE, ENC, CODECS_ALL,
 		0, MAX_GOP, 1, 2 * DEFAULT_FPS - 1,
 		0, MAX_GOP, 1, 2 * DEFAULT_FPS - 1,
 		V4L2_CID_MPEG_VIDEO_GOP_SIZE,
 		V4L2_CID_MPEG_VIDEO_GOP_SIZE,
 		HFI_PROP_MAX_GOP_FRAMES,
 		HFI_PROP_MAX_GOP_FRAMES,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{GOP_CLOSURE, ENC, CODECS_ALL,
 	{GOP_CLOSURE, ENC, CODECS_ALL,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
@@ -260,10 +264,10 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		1, 220000000, 1, 20000000,
 		1, 220000000, 1, 20000000,
 		V4L2_CID_MPEG_VIDEO_BITRATE,
 		V4L2_CID_MPEG_VIDEO_BITRATE,
 		HFI_PROP_TOTAL_BITRATE,
 		HFI_PROP_TOTAL_BITRATE,
-		CAP_FLAG_DYNAMIC_ALLOWED,
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
 		/* TO DO parents */ {0},
 		/* TO DO parents */ {0},
 		{SLICE_MAX_BYTES},
 		{SLICE_MAX_BYTES},
-		msm_vidc_adjust_bitrate, msm_vidc_set_s32},
+		msm_vidc_adjust_bitrate, msm_vidc_set_u32},
 
 
 	{BIT_RATE, DEC, CODECS_ALL, 1, 220000000, 1, 220000000},
 	{BIT_RATE, DEC, CODECS_ALL, 1, 220000000, 1, 220000000},
 
 
@@ -280,7 +284,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_MPEG_VIDC_SECURE,
 		V4L2_CID_MPEG_VIDC_SECURE,
 		HFI_PROP_SECURE,
 		HFI_PROP_SECURE,
-		CAP_FLAG_ROOT,
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT,
 		{0},
 		{0},
 		{0}},
 		{0}},
 
 
@@ -288,13 +292,15 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		VIDC_BLUR_NONE, VIDC_BLUR_ADAPTIVE, 1, VIDC_BLUR_NONE,
 		VIDC_BLUR_NONE, VIDC_BLUR_ADAPTIVE, 1, VIDC_BLUR_NONE,
 		V4L2_CID_MPEG_VIDC_VIDEO_BLUR_TYPES,
 		V4L2_CID_MPEG_VIDC_VIDEO_BLUR_TYPES,
 		HFI_PROP_BLUR_TYPES,
 		HFI_PROP_BLUR_TYPES,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT,
+		{0}, {0},
+		NULL, msm_vidc_set_u32},
 
 
 	{BLUR_RESOLUTION, ENC, CODECS_ALL,
 	{BLUR_RESOLUTION, ENC, CODECS_ALL,
 		0, S32_MAX, 1, 0,
 		0, S32_MAX, 1, 0,
 		V4L2_CID_MPEG_VIDC_VIDEO_BLUR_RESOLUTION,
 		V4L2_CID_MPEG_VIDC_VIDEO_BLUR_RESOLUTION,
 		HFI_PROP_BLUR_RESOLUTION,
 		HFI_PROP_BLUR_RESOLUTION,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	/* Needed for control initialization. TODO */
 	/* Needed for control initialization. TODO */
 	/* {CSC_CUSTOM_MATRIX, ENC, CODECS_ALL,
 	/* {CSC_CUSTOM_MATRIX, ENC, CODECS_ALL,
@@ -303,14 +309,14 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_CUSTOM_MATRIX,
 		V4L2_CID_MPEG_VIDC_VIDEO_VPE_CSC_CUSTOM_MATRIX,
 		HFI_PROP_CSC_MATRIX,
 		HFI_PROP_CSC_MATRIX,
-		CAP_FLAG_ROOT}, */
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, */
 
 
 	{HEIC, ENC, HEVC,
 	{HEIC, ENC, HEVC,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_MPEG_VIDC_HEIC,
 		V4L2_CID_MPEG_VIDC_HEIC,
 		HFI_PROP_HEIC_GRID_ENABLE,
 		HFI_PROP_HEIC_GRID_ENABLE,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{LOWLATENCY_MODE, ENC|DEC, CODECS_ALL,
 	{LOWLATENCY_MODE, ENC|DEC, CODECS_ALL,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
@@ -323,13 +329,13 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		0, 2, 1, 0,
 		0, 2, 1, 0,
 		V4L2_CID_MPEG_VIDC_LTRCOUNT,
 		V4L2_CID_MPEG_VIDC_LTRCOUNT,
 		HFI_PROP_LTR_COUNT,
 		HFI_PROP_LTR_COUNT,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{USE_LTR, ENC, H264|HEVC,
 	{USE_LTR, ENC, H264|HEVC,
 		0, ((1 << MAX_LTR_FRAME_COUNT) - 1), 1, 0,
 		0, ((1 << MAX_LTR_FRAME_COUNT) - 1), 1, 0,
 		V4L2_CID_MPEG_VIDC_USELTRFRAME,
 		V4L2_CID_MPEG_VIDC_USELTRFRAME,
 		HFI_PROP_LTR_USE,
 		HFI_PROP_LTR_USE,
-		CAP_FLAG_ROOT,
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT,
 		{LTR_COUNT},
 		{LTR_COUNT},
 		{0}},
 		{0}},
 
 
@@ -337,19 +343,19 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		0, (MAX_LTR_FRAME_COUNT - 1), 1, 0,
 		0, (MAX_LTR_FRAME_COUNT - 1), 1, 0,
 		V4L2_CID_MPEG_VIDC_MARKLTRFRAME,
 		V4L2_CID_MPEG_VIDC_MARKLTRFRAME,
 		HFI_PROP_LTR_MARK,
 		HFI_PROP_LTR_MARK,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{BASELAYER_PRIORITY, ENC, H264|HEVC,
 	{BASELAYER_PRIORITY, ENC, H264|HEVC,
 		0, MAX_BASE_LAYER_PRIORITY_ID, 1, 0,
 		0, MAX_BASE_LAYER_PRIORITY_ID, 1, 0,
 		V4L2_CID_MPEG_VIDC_BASELAYER_PRIORITY,
 		V4L2_CID_MPEG_VIDC_BASELAYER_PRIORITY,
 		HFI_PROP_BASELAYER_PRIORITYID,
 		HFI_PROP_BASELAYER_PRIORITYID,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{IR_RANDOM, ENC, CODECS_ALL,
 	{IR_RANDOM, ENC, CODECS_ALL,
 		0, MAX_INTRA_REFRESH_MBS, 1, 0,
 		0, MAX_INTRA_REFRESH_MBS, 1, 0,
 		V4L2_CID_MPEG_VIDC_INTRA_REFRESH_PERIOD,
 		V4L2_CID_MPEG_VIDC_INTRA_REFRESH_PERIOD,
 		HFI_PROP_IR_RANDOM_PERIOD,
 		HFI_PROP_IR_RANDOM_PERIOD,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{AU_DELIMITER, ENC, H264|HEVC,
 	{AU_DELIMITER, ENC, H264|HEVC,
 		V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_MPEG_MSM_VIDC_DISABLE,
@@ -357,7 +363,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_MPEG_VIDC_AU_DELIMITER,
 		V4L2_CID_MPEG_VIDC_AU_DELIMITER,
 		HFI_PROP_AUD,
 		HFI_PROP_AUD,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	// confirm codec
 	// confirm codec
 	{TIME_DELTA_BASED_RC, ENC, CODECS_ALL,
 	{TIME_DELTA_BASED_RC, ENC, CODECS_ALL,
@@ -365,7 +371,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		1, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_ENABLE,
 		V4L2_CID_MPEG_VIDC_TIME_DELTA_BASED_RC,
 		V4L2_CID_MPEG_VIDC_TIME_DELTA_BASED_RC,
 		HFI_PROP_TIME_DELTA_BASED_RATE_CONTROL,
 		HFI_PROP_TIME_DELTA_BASED_RATE_CONTROL,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	// confirm codec
 	// confirm codec
 	{CONTENT_ADAPTIVE_CODING, ENC, CODECS_ALL,
 	{CONTENT_ADAPTIVE_CODING, ENC, CODECS_ALL,
@@ -373,19 +379,19 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		1, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_ENABLE,
 		V4L2_CID_MPEG_VIDC_CONTENT_ADAPTIVE_CODING,
 		V4L2_CID_MPEG_VIDC_CONTENT_ADAPTIVE_CODING,
 		HFI_PROP_CONTENT_ADAPTIVE_CODING,
 		HFI_PROP_CONTENT_ADAPTIVE_CODING,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{BITRATE_BOOST, ENC, CODECS_ALL,
 	{BITRATE_BOOST, ENC, CODECS_ALL,
 		0, 100, 25, 25,
 		0, 100, 25, 25,
 		V4L2_CID_MPEG_VIDC_QUALITY_BITRATE_BOOST,
 		V4L2_CID_MPEG_VIDC_QUALITY_BITRATE_BOOST,
 		HFI_PROP_CONST_QUALITY_BITRATE_BOOST,
 		HFI_PROP_CONST_QUALITY_BITRATE_BOOST,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{ROTATION, ENC, CODECS_ALL,
 	{ROTATION, ENC, CODECS_ALL,
 		0, 270, 90, 0,
 		0, 270, 90, 0,
 		V4L2_CID_ROTATE,
 		V4L2_CID_ROTATE,
 		HFI_PROP_ROTATION,
 		HFI_PROP_ROTATION,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{VBV_DELAY, ENC, CODECS_ALL,
 	{VBV_DELAY, ENC, CODECS_ALL,
 		0, 1000, 500, 0,
 		0, 1000, 500, 0,
@@ -396,20 +402,20 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP,
 		V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP,
 		HFI_PROP_MIN_QP_PACKED,
 		HFI_PROP_MIN_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{MAX_FRAME_QP, ENC, HEVC,
 	{MAX_FRAME_QP, ENC, HEVC,
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP,
 		V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP,
 		HFI_PROP_MAX_QP_PACKED,
 		HFI_PROP_MAX_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{HEVC_HIER_QP, ENC, HEVC,
 	{HEVC_HIER_QP, ENC, HEVC,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_QP,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_QP,
 		HFI_PROP_QP_PACKED,
 		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	/*
 	/*
 	 * HEVC I_MIN_QP, I_MAX_QP, P_MIN_QP, P_MAX_QP, B_MIN_QP, B_MAX_QP are missing
 	 * HEVC I_MIN_QP, I_MAX_QP, P_MIN_QP, P_MAX_QP, B_MIN_QP, B_MAX_QP are missing
@@ -418,19 +424,19 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		0, 51, 1, 10,
 		0, 51, 1, 10,
 		V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP,
 		V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP,
 		HFI_PROP_QP_PACKED,
 		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{P_FRAME_QP, ENC, HEVC,
 	{P_FRAME_QP, ENC, HEVC,
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP,
 		V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP,
 		HFI_PROP_QP_PACKED,
 		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{B_FRAME_QP, ENC, HEVC,
 	{B_FRAME_QP, ENC, HEVC,
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP,
 		V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP,
 		HFI_PROP_QP_PACKED,
 		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{HIER_CODING_TYPE, ENC, HEVC,
 	{HIER_CODING_TYPE, ENC, HEVC,
 		V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B,
 		V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B,
@@ -440,49 +446,51 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P,
 		V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE,
 		HFI_PROP_LAYER_ENCODING_TYPE,
 		HFI_PROP_LAYER_ENCODING_TYPE,
-		CAP_FLAG_ROOT | CAP_FLAG_MENU},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+		{0}, {0},
+		NULL, msm_vidc_set_u32},
 
 
 	{HIER_CODING_LAYER, ENC, HEVC,
 	{HIER_CODING_LAYER, ENC, HEVC,
 		0, 5, 1, 0,
 		0, 5, 1, 0,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER,
 		HFI_PROP_LAYER_COUNT,
 		HFI_PROP_LAYER_COUNT,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{L0_QP, ENC, HEVC,
 	{L0_QP, ENC, HEVC,
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_QP,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_QP,
 		HFI_PROP_QP_PACKED,
 		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{L1_QP, ENC, HEVC,
 	{L1_QP, ENC, HEVC,
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_QP,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_QP,
 		HFI_PROP_QP_PACKED,
 		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{L2_QP, ENC, HEVC,
 	{L2_QP, ENC, HEVC,
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_QP,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_QP,
 		HFI_PROP_QP_PACKED,
 		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{L3_QP, ENC, HEVC,
 	{L3_QP, ENC, HEVC,
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_QP,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_QP,
 		HFI_PROP_QP_PACKED,
 		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{L4_QP, ENC, HEVC,
 	{L4_QP, ENC, HEVC,
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_QP,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_QP,
 		HFI_PROP_QP_PACKED,
 		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{L5_QP, ENC, HEVC,
 	{L5_QP, ENC, HEVC,
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_QP,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_QP,
 		HFI_PROP_QP_PACKED,
 		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{PROFILE, ENC|DEC, HEVC,
 	{PROFILE, ENC|DEC, HEVC,
 		V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
 		V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
@@ -493,7 +501,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
 		V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN,
 		V4L2_CID_MPEG_VIDEO_HEVC_PROFILE,
 		V4L2_CID_MPEG_VIDEO_HEVC_PROFILE,
 		HFI_PROP_PROFILE,
 		HFI_PROP_PROFILE,
-		CAP_FLAG_ROOT | CAP_FLAG_MENU,
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
 		{0},
 		{0},
 		{ENTROPY_MODE},
 		{ENTROPY_MODE},
 		NULL, msm_vidc_set_u32},
 		NULL, msm_vidc_set_u32},
@@ -517,7 +525,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2,
 		V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2,
 		V4L2_CID_MPEG_VIDEO_HEVC_LEVEL,
 		V4L2_CID_MPEG_VIDEO_HEVC_LEVEL,
 		HFI_PROP_LEVEL,
 		HFI_PROP_LEVEL,
-		CAP_FLAG_ROOT | CAP_FLAG_MENU,
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
 		{0},
 		{0},
 		{0},
 		{0},
 		NULL, msm_vidc_set_u32},
 		NULL, msm_vidc_set_u32},
@@ -530,7 +538,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_MPEG_VIDEO_HEVC_TIER_HIGH,
 		V4L2_MPEG_VIDEO_HEVC_TIER_HIGH,
 		V4L2_CID_MPEG_VIDEO_HEVC_TIER,
 		V4L2_CID_MPEG_VIDEO_HEVC_TIER,
 		HFI_PROP_TIER,
 		HFI_PROP_TIER,
-		CAP_FLAG_ROOT | CAP_FLAG_MENU,
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
 		{0},
 		{0},
 		{0},
 		{0},
 		NULL, msm_vidc_set_u32},
 		NULL, msm_vidc_set_u32},
@@ -544,85 +552,85 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE_ENABLED,
 		V4L2_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE_ENABLED,
 		V4L2_CID_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE,
 		V4L2_CID_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE,
 		HFI_PROP_DEBLOCKING_MODE,
 		HFI_PROP_DEBLOCKING_MODE,
-		CAP_FLAG_ROOT | CAP_FLAG_MENU},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU},
 
 
 	{LF_BETA, ENC, HEVC,
 	{LF_BETA, ENC, HEVC,
 		-6, 6, 1, 0,
 		-6, 6, 1, 0,
 		V4L2_CID_MPEG_VIDEO_HEVC_LF_BETA_OFFSET_DIV2,
 		V4L2_CID_MPEG_VIDEO_HEVC_LF_BETA_OFFSET_DIV2,
 		HFI_PROP_DEBLOCKING_MODE,
 		HFI_PROP_DEBLOCKING_MODE,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{LF_TC, ENC, HEVC,
 	{LF_TC, ENC, HEVC,
 		-6, 6, 1, 0,
 		-6, 6, 1, 0,
 		V4L2_CID_MPEG_VIDEO_HEVC_LF_TC_OFFSET_DIV2,
 		V4L2_CID_MPEG_VIDEO_HEVC_LF_TC_OFFSET_DIV2,
 		HFI_PROP_DEBLOCKING_MODE,
 		HFI_PROP_DEBLOCKING_MODE,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{LOSSLESS, ENC, HEVC,
 	{LOSSLESS, ENC, HEVC,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_MPEG_VIDEO_HEVC_LOSSLESS_CU,
 		V4L2_CID_MPEG_VIDEO_HEVC_LOSSLESS_CU,
 		HFI_PROP_RATE_CONTROL,
 		HFI_PROP_RATE_CONTROL,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{L0_BR, ENC, HEVC,
 	{L0_BR, ENC, HEVC,
 		1, 220000000, 1, 20000000,
 		1, 220000000, 1, 20000000,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BR,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BR,
 		HFI_PROP_BITRATE_LAYER1,
 		HFI_PROP_BITRATE_LAYER1,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{L1_BR, ENC, HEVC,
 	{L1_BR, ENC, HEVC,
 		1, 220000000, 1, 20000000,
 		1, 220000000, 1, 20000000,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_BR,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_BR,
 		HFI_PROP_BITRATE_LAYER2,
 		HFI_PROP_BITRATE_LAYER2,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{L2_BR, ENC, HEVC,
 	{L2_BR, ENC, HEVC,
 		1, 220000000, 1, 20000000,
 		1, 220000000, 1, 20000000,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_BR,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_BR,
 		HFI_PROP_BITRATE_LAYER3,
 		HFI_PROP_BITRATE_LAYER3,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{L3_BR, ENC, HEVC,
 	{L3_BR, ENC, HEVC,
 		1, 220000000, 1, 20000000,
 		1, 220000000, 1, 20000000,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_BR,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_BR,
 		HFI_PROP_BITRATE_LAYER4,
 		HFI_PROP_BITRATE_LAYER4,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{L4_BR, ENC, HEVC,
 	{L4_BR, ENC, HEVC,
 		1, 220000000, 1, 20000000,
 		1, 220000000, 1, 20000000,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR,
 		HFI_PROP_BITRATE_LAYER5,
 		HFI_PROP_BITRATE_LAYER5,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{L5_BR, ENC, HEVC,
 	{L5_BR, ENC, HEVC,
 		1, 220000000, 1, 20000000,
 		1, 220000000, 1, 20000000,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR,
 		V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR,
 		HFI_PROP_BITRATE_LAYER6,
 		HFI_PROP_BITRATE_LAYER6,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{BIT_RATE, ENC, HEVC,
 	{BIT_RATE, ENC, HEVC,
 		1, 160000000, 1, 20000000,
 		1, 160000000, 1, 20000000,
 		V4L2_CID_MPEG_VIDEO_BITRATE,
 		V4L2_CID_MPEG_VIDEO_BITRATE,
 		HFI_PROP_TOTAL_BITRATE,
 		HFI_PROP_TOTAL_BITRATE,
-		CAP_FLAG_DYNAMIC_ALLOWED,
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
 		/* TODO parents */{0},
 		/* TODO parents */{0},
 		{SLICE_MAX_BYTES},
 		{SLICE_MAX_BYTES},
-		msm_vidc_adjust_bitrate, msm_vidc_set_s32},
+		msm_vidc_adjust_bitrate, msm_vidc_set_u32},
 
 
 	{SLICE_MAX_BYTES, ENC, H264|HEVC,
 	{SLICE_MAX_BYTES, ENC, H264|HEVC,
 		1, MAX_BITRATE / DEFAULT_FPS / 8 / 10,
 		1, MAX_BITRATE / DEFAULT_FPS / 8 / 10,
 		1, MAX_BITRATE / DEFAULT_FPS / 8 / 10,
 		1, MAX_BITRATE / DEFAULT_FPS / 8 / 10,
 		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES,
 		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES,
 		HFI_PROP_MULTI_SLICE_BYTES_COUNT,
 		HFI_PROP_MULTI_SLICE_BYTES_COUNT,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{SLICE_MAX_MB, ENC, H264|HEVC,
 	{SLICE_MAX_MB, ENC, H264|HEVC,
 		1, (MAX_WIDTH * MAX_HEIGHT) / 256 / DEFAULT_FPS / 10,
 		1, (MAX_WIDTH * MAX_HEIGHT) / 256 / DEFAULT_FPS / 10,
 		1, (MAX_WIDTH * MAX_HEIGHT) / 256 / DEFAULT_FPS / 10,
 		1, (MAX_WIDTH * MAX_HEIGHT) / 256 / DEFAULT_FPS / 10,
 		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB,
 		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB,
 		HFI_PROP_MULTI_SLICE_MB_COUNT,
 		HFI_PROP_MULTI_SLICE_MB_COUNT,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{SLICE_MODE, ENC, H264|HEVC,
 	{SLICE_MODE, ENC, H264|HEVC,
 		V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE,
 		V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE,
@@ -633,16 +641,16 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE,
 		V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE,
 		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE,
 		V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE,
 		0,
 		0,
-		CAP_FLAG_ROOT | CAP_FLAG_MENU},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU},
 
 
 	/* Mpeg2 decoder specific */
 	/* Mpeg2 decoder specific */
 	{BIT_RATE, DEC, MPEG2,
 	{BIT_RATE, DEC, MPEG2,
 		1, 40000000, 1, 20000000,
 		1, 40000000, 1, 20000000,
 		V4L2_CID_MPEG_VIDEO_BITRATE,
 		V4L2_CID_MPEG_VIDEO_BITRATE,
 		HFI_PROP_TOTAL_BITRATE,
 		HFI_PROP_TOTAL_BITRATE,
-		CAP_FLAG_DYNAMIC_ALLOWED,
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED,
 		{0}, {0},
 		{0}, {0},
-		msm_vidc_adjust_bitrate, msm_vidc_set_s32},
+		msm_vidc_adjust_bitrate, msm_vidc_set_u32},
 
 
 	{LEVEL, DEC, MPEG2,
 	{LEVEL, DEC, MPEG2,
 		V4L2_MPEG_VIDEO_MPEG2_LEVEL_LOW,
 		V4L2_MPEG_VIDEO_MPEG2_LEVEL_LOW,
@@ -654,7 +662,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH,
 		V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH,
 		V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL,
 		V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL,
 		HFI_PROP_LEVEL,
 		HFI_PROP_LEVEL,
-		CAP_FLAG_ROOT | CAP_FLAG_MENU},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU},
 
 
 	{PROFILE, DEC, MPEG2,
 	{PROFILE, DEC, MPEG2,
 		V4L2_MPEG_VIDEO_MPEG2_PROFILE_SIMPLE,
 		V4L2_MPEG_VIDEO_MPEG2_PROFILE_SIMPLE,
@@ -664,7 +672,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN,
 		V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN,
 		V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE,
 		V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE,
 		HFI_PROP_PROFILE,
 		HFI_PROP_PROFILE,
-		CAP_FLAG_ROOT | CAP_FLAG_MENU},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU},
 
 
 	{FRAME_WIDTH, DEC, MPEG2, 128, 1920, 1, 1920},
 	{FRAME_WIDTH, DEC, MPEG2, 128, 1920, 1, 1920},
 	{FRAME_HEIGHT, DEC, MPEG2, 128, 1920, 1, 1080},
 	{FRAME_HEIGHT, DEC, MPEG2, 128, 1920, 1, 1080},
@@ -681,57 +689,57 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		0, 51, 1, 10,
 		0, 51, 1, 10,
 		V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP,
 		V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP,
 		HFI_PROP_QP_PACKED,
 		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{P_FRAME_QP, ENC, H264,
 	{P_FRAME_QP, ENC, H264,
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP,
 		V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP,
 		HFI_PROP_QP_PACKED,
 		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{B_FRAME_QP, ENC, H264,
 	{B_FRAME_QP, ENC, H264,
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP,
 		V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP,
 		HFI_PROP_QP_PACKED,
 		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{MIN_FRAME_QP, ENC, H264,
 	{MIN_FRAME_QP, ENC, H264,
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDEO_H264_MIN_QP,
 		V4L2_CID_MPEG_VIDEO_H264_MIN_QP,
 		HFI_PROP_MIN_QP_PACKED,
 		HFI_PROP_MIN_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{MAX_FRAME_QP, ENC, H264,
 	{MAX_FRAME_QP, ENC, H264,
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDEO_H264_MAX_QP,
 		V4L2_CID_MPEG_VIDEO_H264_MAX_QP,
 		HFI_PROP_MAX_QP_PACKED,
 		HFI_PROP_MAX_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{LF_BETA, ENC, H264,
 	{LF_BETA, ENC, H264,
 		-6, 6, 1, 0,
 		-6, 6, 1, 0,
 		V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA,
 		V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA,
 		HFI_PROP_DEBLOCKING_MODE,
 		HFI_PROP_DEBLOCKING_MODE,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{LF_ALPHA, ENC, H264,
 	{LF_ALPHA, ENC, H264,
 		-6, 6, 1, 0,
 		-6, 6, 1, 0,
 		V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA,
 		V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA,
 		HFI_PROP_DEBLOCKING_MODE,
 		HFI_PROP_DEBLOCKING_MODE,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{MB_RC, ENC, CODECS_ALL,
 	{MB_RC, ENC, CODECS_ALL,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_ENABLE,
 		V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE,
 		V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE,
 		0,
 		0,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{TRANSFORM_8X8, ENC, H264,
 	{TRANSFORM_8X8, ENC, H264,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_ENABLE,
 		V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM,
 		V4L2_CID_MPEG_VIDEO_H264_8X8_TRANSFORM,
 		HFI_PROP_8X8_TRANSFORM,
 		HFI_PROP_8X8_TRANSFORM,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{ENTROPY_MODE, ENC, H264,
 	{ENTROPY_MODE, ENC, H264,
 		V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC,
 		V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC,
@@ -741,7 +749,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC,
 		V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC,
 		V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE,
 		V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE,
 		HFI_PROP_CABAC_SESSION,
 		HFI_PROP_CABAC_SESSION,
-		CAP_FLAG_ROOT | CAP_FLAG_MENU,
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
 		{PROFILE},
 		{PROFILE},
 		{BIT_RATE},
 		{BIT_RATE},
 		msm_vidc_adjust_entropy_mode, msm_vidc_set_u32},
 		msm_vidc_adjust_entropy_mode, msm_vidc_set_u32},
@@ -757,7 +765,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
 		V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
 		V4L2_CID_MPEG_VIDEO_H264_PROFILE,
 		V4L2_CID_MPEG_VIDEO_H264_PROFILE,
 		HFI_PROP_PROFILE,
 		HFI_PROP_PROFILE,
-		CAP_FLAG_ROOT | CAP_FLAG_MENU,
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
 		{0},
 		{0},
 		{ENTROPY_MODE},
 		{ENTROPY_MODE},
 		NULL, msm_vidc_set_u32},
 		NULL, msm_vidc_set_u32},
@@ -784,7 +792,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_MPEG_VIDEO_H264_LEVEL_5_1,
 		V4L2_MPEG_VIDEO_H264_LEVEL_5_1,
 		V4L2_CID_MPEG_VIDEO_H264_LEVEL,
 		V4L2_CID_MPEG_VIDEO_H264_LEVEL,
 		HFI_PROP_LEVEL,
 		HFI_PROP_LEVEL,
-		CAP_FLAG_ROOT | CAP_FLAG_MENU,
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
 		{0},
 		{0},
 		{0},
 		{0},
 		NULL, msm_vidc_set_u32},
 		NULL, msm_vidc_set_u32},
@@ -798,14 +806,15 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED,
 		V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED,
 		V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE,
 		V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE,
 		HFI_PROP_DEBLOCKING_MODE,
 		HFI_PROP_DEBLOCKING_MODE,
-		CAP_FLAG_ROOT | CAP_FLAG_MENU},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU},
 
 
+	//TODO (AS)
 	{HIER_CODING, ENC, H264,
 	{HIER_CODING, ENC, H264,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING,
 		V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING,
 		HFI_PROP_LAYER_ENCODING_TYPE,
 		HFI_PROP_LAYER_ENCODING_TYPE,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	/* TODO(AS) - ctrl init failing. Need to fix
 	/* TODO(AS) - ctrl init failing. Need to fix
 	{HIER_CODING_TYPE, ENC, H264,
 	{HIER_CODING_TYPE, ENC, H264,
@@ -816,20 +825,20 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P,
 		V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_P,
 		V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE,
 		V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE,
 		HFI_PROP_LAYER_ENCODING_TYPE,
 		HFI_PROP_LAYER_ENCODING_TYPE,
-		CAP_FLAG_ROOT | CAP_FLAG_MENU},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU},
 	*/
 	*/
 
 
 	{HIER_CODING_LAYER, ENC, H264,
 	{HIER_CODING_LAYER, ENC, H264,
 		0, 6, 1, 0,
 		0, 6, 1, 0,
 		V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER,
 		V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER,
 		HFI_PROP_LAYER_COUNT,
 		HFI_PROP_LAYER_COUNT,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{HIER_LAYER_QP, ENC, H264,
 	{HIER_LAYER_QP, ENC, H264,
 		0, 0x0060033, 1, 20,
 		0, 0x0060033, 1, 20,
 		V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP,
 		V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER_QP,
 		HFI_PROP_QP_PACKED,
 		HFI_PROP_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	/* TODO: CHROMA_QP_INDEX_OFFSET is applicable to HEVC as well */
 	/* TODO: CHROMA_QP_INDEX_OFFSET is applicable to HEVC as well */
 	{CHROMA_QP_INDEX_OFFSET, ENC, H264,
 	{CHROMA_QP_INDEX_OFFSET, ENC, H264,
@@ -837,44 +846,44 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		1, MAX_CHROMA_QP_OFFSET,
 		1, MAX_CHROMA_QP_OFFSET,
 		V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET,
 		V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET,
 		HFI_PROP_CHROMA_QP_OFFSET,
 		HFI_PROP_CHROMA_QP_OFFSET,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{I_FRAME_MIN_QP, ENC, H264,
 	{I_FRAME_MIN_QP, ENC, H264,
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP,
 		V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP,
 		HFI_PROP_MIN_QP_PACKED,
 		HFI_PROP_MIN_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{I_FRAME_MAX_QP, ENC, H264,
 	{I_FRAME_MAX_QP, ENC, H264,
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP,
 		V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP,
 		HFI_PROP_MIN_QP_PACKED,
 		HFI_PROP_MIN_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{P_FRAME_MIN_QP, ENC, H264,
 	{P_FRAME_MIN_QP, ENC, H264,
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP,
 		V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP,
 		HFI_PROP_MIN_QP_PACKED,
 		HFI_PROP_MIN_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{P_FRAME_MAX_QP, ENC, H264,
 	{P_FRAME_MAX_QP, ENC, H264,
 		0, 51, 1, 20,
 		0, 51, 1, 20,
 		V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP,
 		V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP,
 		HFI_PROP_MIN_QP_PACKED,
 		HFI_PROP_MIN_QP_PACKED,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{DISPLAY_DELAY, DEC, CODECS_ALL,
 	{DISPLAY_DELAY, DEC, CODECS_ALL,
 		0, 1, 1, 0,
 		0, 1, 1, 0,
 		V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY,
 		V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY,
 		HFI_PROP_DECODE_ORDER_OUTPUT,
 		HFI_PROP_DECODE_ORDER_OUTPUT,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{DISPLAY_DELAY_ENABLE, DEC, CODECS_ALL,
 	{DISPLAY_DELAY_ENABLE, DEC, CODECS_ALL,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
 		V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY_ENABLE,
 		V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY_ENABLE,
 		HFI_PROP_DECODE_ORDER_OUTPUT,
 		HFI_PROP_DECODE_ORDER_OUTPUT,
-		CAP_FLAG_ROOT},
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	/* VP9 specific */
 	/* VP9 specific */
 	{I_FRAME_QP, ENC, VP9, 0, 127, 1, 20},
 	{I_FRAME_QP, ENC, VP9, 0, 127, 1, 20},
@@ -891,7 +900,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		V4L2_MPEG_VIDEO_VP9_PROFILE_0,
 		V4L2_MPEG_VIDEO_VP9_PROFILE_0,
 		V4L2_CID_MPEG_VIDEO_VP9_PROFILE,
 		V4L2_CID_MPEG_VIDEO_VP9_PROFILE,
 		HFI_PROP_PROFILE,
 		HFI_PROP_PROFILE,
-		CAP_FLAG_ROOT | CAP_FLAG_MENU,
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
 		{0},
 		{0},
 		{ENTROPY_MODE},
 		{ENTROPY_MODE},
 		NULL, msm_vidc_set_u32},
 		NULL, msm_vidc_set_u32},
@@ -900,11 +909,13 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 	{CONCEAL_COLOR_8BIT, DEC, CODECS_ALL, 0x0, 0xff3fcff, 1,
 	{CONCEAL_COLOR_8BIT, DEC, CODECS_ALL, 0x0, 0xff3fcff, 1,
 		DEFAULT_VIDEO_CONCEAL_COLOR_BLACK,
 		DEFAULT_VIDEO_CONCEAL_COLOR_BLACK,
 		V4L2_CID_MPEG_VIDEO_MUTE_YUV,
 		V4L2_CID_MPEG_VIDEO_MUTE_YUV,
-		HFI_PROP_CONCEAL_COLOR_8BIT},
+		HFI_PROP_CONCEAL_COLOR_8BIT,
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 	{CONCEAL_COLOR_10BIT, DEC, CODECS_ALL, 0x0, 0x3fffffff, 1,
 	{CONCEAL_COLOR_10BIT, DEC, CODECS_ALL, 0x0, 0x3fffffff, 1,
 		DEFAULT_VIDEO_CONCEAL_COLOR_BLACK,
 		DEFAULT_VIDEO_CONCEAL_COLOR_BLACK,
 		V4L2_CID_MPEG_VIDEO_MUTE_YUV,
 		V4L2_CID_MPEG_VIDEO_MUTE_YUV,
-		HFI_PROP_CONCEAL_COLOR_10BIT},
+		HFI_PROP_CONCEAL_COLOR_10BIT,
+		CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT},
 
 
 	{STAGE, DEC|ENC, CODECS_ALL, 1, 2, 1, 2},
 	{STAGE, DEC|ENC, CODECS_ALL, 1, 2, 1, 2},
 	{PIPE, DEC|ENC, CODECS_ALL, 1, 4, 1, 4},
 	{PIPE, DEC|ENC, CODECS_ALL, 1, 4, 1, 4},

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

@@ -315,6 +315,8 @@ enum hfi_quality_mode {
     HFI_MODE_MAX_QUALITY = 0x1,
     HFI_MODE_MAX_QUALITY = 0x1,
     HFI_MODE_POWER_SAVE  = 0x2,
     HFI_MODE_POWER_SAVE  = 0x2,
 };
 };
+
+// TODO (AS): Does not map to any V4l2 control
 #define HFI_PROP_QUALITY_MODE                                   0x03000148
 #define HFI_PROP_QUALITY_MODE                                   0x03000148
 
 
 enum hfi_seq_header_mode {
 enum hfi_seq_header_mode {

+ 2 - 1
driver/vidc/inc/msm_vidc_driver.h

@@ -55,7 +55,8 @@ static inline is_internal_buffer(enum msm_vidc_buffer_type buffer_type)
 		buffer_type == MSM_VIDC_BUF_NON_COMV ||
 		buffer_type == MSM_VIDC_BUF_NON_COMV ||
 		buffer_type == MSM_VIDC_BUF_LINE ||
 		buffer_type == MSM_VIDC_BUF_LINE ||
 		buffer_type == MSM_VIDC_BUF_DPB ||
 		buffer_type == MSM_VIDC_BUF_DPB ||
-		buffer_type == MSM_VIDC_BUF_PERSIST;
+		buffer_type == MSM_VIDC_BUF_PERSIST ||
+		buffer_type == MSM_VIDC_BUF_VPSS;
 }
 }
 
 
 static inline bool is_secondary_output_mode(struct msm_vidc_inst *inst)
 static inline bool is_secondary_output_mode(struct msm_vidc_inst *inst)

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

@@ -335,6 +335,8 @@ enum msm_vidc_inst_capability_flags {
 	CAP_FLAG_ROOT                    = BIT(0),
 	CAP_FLAG_ROOT                    = BIT(0),
 	CAP_FLAG_DYNAMIC_ALLOWED         = BIT(1),
 	CAP_FLAG_DYNAMIC_ALLOWED         = BIT(1),
 	CAP_FLAG_MENU                    = BIT(2),
 	CAP_FLAG_MENU                    = BIT(2),
+	CAP_FLAG_INPUT_PORT              = BIT(3),
+	CAP_FLAG_OUTPUT_PORT             = BIT(4),
 };
 };
 
 
 struct msm_vidc_inst_cap {
 struct msm_vidc_inst_cap {

+ 26 - 16
driver/vidc/src/msm_venc.c

@@ -129,6 +129,9 @@ static int msm_venc_set_resolution(struct msm_vidc_inst *inst,
 
 
 	resolution = inst->fmts[port].fmt.pix_mp.width << 16 |
 	resolution = inst->fmts[port].fmt.pix_mp.width << 16 |
 		inst->fmts[port].fmt.pix_mp.height;
 		inst->fmts[port].fmt.pix_mp.height;
+	s_vpr_h(inst->sid, "%s: width: %d height: %d\n", __func__,
+			inst->fmts[port].fmt.pix_mp.width,
+			inst->fmts[port].fmt.pix_mp.height);
 	rc = venus_hfi_session_property(inst,
 	rc = venus_hfi_session_property(inst,
 			HFI_PROP_BITSTREAM_RESOLUTION,
 			HFI_PROP_BITSTREAM_RESOLUTION,
 			HFI_HOST_FLAGS_NONE,
 			HFI_HOST_FLAGS_NONE,
@@ -155,11 +158,14 @@ static int msm_venc_set_crop_offsets(struct msm_vidc_inst *inst,
 	/* TODO: recheck later */
 	/* TODO: recheck later */
 	crop = inst->fmts[INPUT_PORT].fmt.pix_mp.width << 16 |
 	crop = inst->fmts[INPUT_PORT].fmt.pix_mp.width << 16 |
 		inst->fmts[INPUT_PORT].fmt.pix_mp.height;
 		inst->fmts[INPUT_PORT].fmt.pix_mp.height;
+	s_vpr_h(inst->sid, "%s: width: %d height: %d\n", __func__,
+			inst->fmts[INPUT_PORT].fmt.pix_mp.width,
+			inst->fmts[INPUT_PORT].fmt.pix_mp.height);
 	rc = venus_hfi_session_property(inst,
 	rc = venus_hfi_session_property(inst,
 			HFI_PROP_CROP_OFFSETS,
 			HFI_PROP_CROP_OFFSETS,
 			HFI_HOST_FLAGS_NONE,
 			HFI_HOST_FLAGS_NONE,
 			get_hfi_port(inst, port),
 			get_hfi_port(inst, port),
-			HFI_PAYLOAD_32_PACKED,
+			HFI_PAYLOAD_64_PACKED,
 			&crop,
 			&crop,
 			sizeof(u32));
 			sizeof(u32));
 	if (rc)
 	if (rc)
@@ -301,17 +307,21 @@ static int msm_venc_get_input_internal_buffers(struct msm_vidc_inst *inst)
 	core = inst->core;
 	core = inst->core;
 
 
 	inst->buffers.arp.size = call_session_op(core, buffer_size,
 	inst->buffers.arp.size = call_session_op(core, buffer_size,
-			inst, MSM_VIDC_BUF_ARP);
+			inst, MSM_VIDC_BUF_ARP) + 100000000;
 	inst->buffers.bin.size = call_session_op(core, buffer_size,
 	inst->buffers.bin.size = call_session_op(core, buffer_size,
-			inst, MSM_VIDC_BUF_BIN);
-	/* inst->buffers.comv.size = call_session_op(core, buffer_size,
-			inst, MSM_VIDC_BUF_COMV);
+			inst, MSM_VIDC_BUF_BIN) + 100000000;
+	inst->buffers.comv.size = call_session_op(core, buffer_size,
+			inst, MSM_VIDC_BUF_COMV) + 100000000;
 	inst->buffers.non_comv.size = call_session_op(core, buffer_size,
 	inst->buffers.non_comv.size = call_session_op(core, buffer_size,
-			inst, MSM_VIDC_BUF_NON_COMV); */
+			inst, MSM_VIDC_BUF_NON_COMV) + 100000000;
 	inst->buffers.line.size = call_session_op(core, buffer_size,
 	inst->buffers.line.size = call_session_op(core, buffer_size,
-			inst, MSM_VIDC_BUF_LINE);
+			inst, MSM_VIDC_BUF_LINE) + 100000000;
 	inst->buffers.dpb.size = call_session_op(core, buffer_size,
 	inst->buffers.dpb.size = call_session_op(core, buffer_size,
-			inst, MSM_VIDC_BUF_DPB);
+			inst, MSM_VIDC_BUF_DPB) + 100000000;
+	//inst->buffers.vpss.size = call_session_op(core, buffer_size,
+			//inst, MSM_VIDC_BUF_VPSS) + 100000000;
+			//vpss is req - 100 mb
+
 	/* inst->buffers.persist.size = call_session_op(core, buffer_size,
 	/* inst->buffers.persist.size = call_session_op(core, buffer_size,
 			inst, MSM_VIDC_BUF_PERSIST); */
 			inst, MSM_VIDC_BUF_PERSIST); */
 
 
@@ -319,10 +329,10 @@ static int msm_venc_get_input_internal_buffers(struct msm_vidc_inst *inst)
 			inst, MSM_VIDC_BUF_ARP);
 			inst, MSM_VIDC_BUF_ARP);
 	inst->buffers.bin.min_count = call_session_op(core, min_count,
 	inst->buffers.bin.min_count = call_session_op(core, min_count,
 			inst, MSM_VIDC_BUF_BIN);
 			inst, MSM_VIDC_BUF_BIN);
-	/* inst->buffers.comv.min_count = call_session_op(core, min_count,
+	inst->buffers.comv.min_count = call_session_op(core, min_count,
 			inst, MSM_VIDC_BUF_COMV);
 			inst, MSM_VIDC_BUF_COMV);
 	inst->buffers.non_comv.min_count = call_session_op(core, min_count,
 	inst->buffers.non_comv.min_count = call_session_op(core, min_count,
-			inst, MSM_VIDC_BUF_NON_COMV); */
+			inst, MSM_VIDC_BUF_NON_COMV);
 	inst->buffers.line.min_count = call_session_op(core, min_count,
 	inst->buffers.line.min_count = call_session_op(core, min_count,
 			inst, MSM_VIDC_BUF_LINE);
 			inst, MSM_VIDC_BUF_LINE);
 	inst->buffers.dpb.min_count = call_session_op(core, min_count,
 	inst->buffers.dpb.min_count = call_session_op(core, min_count,
@@ -337,12 +347,12 @@ static int msm_venc_get_input_internal_buffers(struct msm_vidc_inst *inst)
 	s_vpr_h(inst->sid, "bin  buffer: %d      %d\n",
 	s_vpr_h(inst->sid, "bin  buffer: %d      %d\n",
 		inst->buffers.bin.min_count,
 		inst->buffers.bin.min_count,
 		inst->buffers.bin.size);
 		inst->buffers.bin.size);
-	/* s_vpr_h(inst->sid, "comv  buffer: %d      %d\n",
+	s_vpr_h(inst->sid, "comv  buffer: %d      %d\n",
 		inst->buffers.comv.min_count,
 		inst->buffers.comv.min_count,
 		inst->buffers.comv.size);
 		inst->buffers.comv.size);
 	s_vpr_h(inst->sid, "non_comv  buffer: %d      %d\n",
 	s_vpr_h(inst->sid, "non_comv  buffer: %d      %d\n",
 		inst->buffers.non_comv.min_count,
 		inst->buffers.non_comv.min_count,
-		inst->buffers.non_comv.size); */
+		inst->buffers.non_comv.size);
 	s_vpr_h(inst->sid, "line buffer: %d      %d\n",
 	s_vpr_h(inst->sid, "line buffer: %d      %d\n",
 		inst->buffers.line.min_count,
 		inst->buffers.line.min_count,
 		inst->buffers.line.size);
 		inst->buffers.line.size);
@@ -372,12 +382,12 @@ static int msm_venc_create_input_internal_buffers(struct msm_vidc_inst *inst)
 	rc = msm_vidc_create_internal_buffers(inst, MSM_VIDC_BUF_BIN);
 	rc = msm_vidc_create_internal_buffers(inst, MSM_VIDC_BUF_BIN);
 	if (rc)
 	if (rc)
 		return rc;
 		return rc;
-	/* rc = msm_vidc_create_internal_buffers(inst, MSM_VIDC_BUF_COMV);
+	rc = msm_vidc_create_internal_buffers(inst, MSM_VIDC_BUF_COMV);
 	if (rc)
 	if (rc)
 		return rc;
 		return rc;
 	rc = msm_vidc_create_internal_buffers(inst, MSM_VIDC_BUF_NON_COMV);
 	rc = msm_vidc_create_internal_buffers(inst, MSM_VIDC_BUF_NON_COMV);
 	if (rc)
 	if (rc)
-		return rc; */
+		return rc;
 	rc = msm_vidc_create_internal_buffers(inst, MSM_VIDC_BUF_LINE);
 	rc = msm_vidc_create_internal_buffers(inst, MSM_VIDC_BUF_LINE);
 	if (rc)
 	if (rc)
 		return rc;
 		return rc;
@@ -407,12 +417,12 @@ static int msm_venc_queue_input_internal_buffers(struct msm_vidc_inst *inst)
 	rc = msm_vidc_queue_internal_buffers(inst, MSM_VIDC_BUF_BIN);
 	rc = msm_vidc_queue_internal_buffers(inst, MSM_VIDC_BUF_BIN);
 	if (rc)
 	if (rc)
 		return rc;
 		return rc;
-	/* rc = msm_vidc_queue_internal_buffers(inst, MSM_VIDC_BUF_COMV);
+	rc = msm_vidc_queue_internal_buffers(inst, MSM_VIDC_BUF_COMV);
 	if (rc)
 	if (rc)
 		return rc;
 		return rc;
 	rc = msm_vidc_queue_internal_buffers(inst, MSM_VIDC_BUF_NON_COMV);
 	rc = msm_vidc_queue_internal_buffers(inst, MSM_VIDC_BUF_NON_COMV);
 	if (rc)
 	if (rc)
-		return rc; */
+		return rc;
 	rc = msm_vidc_queue_internal_buffers(inst, MSM_VIDC_BUF_LINE);
 	rc = msm_vidc_queue_internal_buffers(inst, MSM_VIDC_BUF_LINE);
 	if (rc)
 	if (rc)
 		return rc;
 		return rc;

+ 99 - 14
driver/vidc/src/msm_vidc_control.c

@@ -31,7 +31,7 @@ static const char *const mpeg_video_rate_control[] = {
 	"MBR",
 	"MBR",
 	"MBR VFR",
 	"MBR VFR",
 	"CQ",
 	"CQ",
-	NULL
+	NULL,
 };
 };
 
 
 static const char *const mpeg_video_stream_format[] = {
 static const char *const mpeg_video_stream_format[] = {
@@ -57,6 +57,26 @@ static const char *const roi_map_type[] = {
 	NULL,
 	NULL,
 };
 };
 
 
+static u32 msm_vidc_get_port_info(struct msm_vidc_inst *inst,
+	enum msm_vidc_inst_capability_type cap_id)
+{
+	struct msm_vidc_inst_capability *capability = inst->capabilities;
+
+	if (capability->cap[cap_id].flags & CAP_FLAG_INPUT_PORT &&
+		capability->cap[cap_id].flags & CAP_FLAG_OUTPUT_PORT) {
+		s_vpr_e(inst->sid,
+			"%s: both ports enabled. Default port set: BITSTREAM\n",
+			__func__);
+		return HFI_PORT_BITSTREAM;
+	}
+	if (capability->cap[cap_id].flags & CAP_FLAG_INPUT_PORT)
+		return get_hfi_port(inst, INPUT_PORT);
+	else if (capability->cap[cap_id].flags & CAP_FLAG_OUTPUT_PORT)
+		return get_hfi_port(inst, OUTPUT_PORT);
+	else
+		return HFI_PORT_NONE;
+}
+
 static const char * const * msm_vidc_get_qmenu_type(
 static const char * const * msm_vidc_get_qmenu_type(
 		struct msm_vidc_inst *inst, u32 control_id)
 		struct msm_vidc_inst *inst, u32 control_id)
 {
 {
@@ -682,11 +702,11 @@ int msm_vidc_adjust_properties(struct msm_vidc_inst *inst)
 	struct msm_vidc_inst_cap_entry *curr_node = NULL, *tmp_node = NULL;
 	struct msm_vidc_inst_cap_entry *curr_node = NULL, *tmp_node = NULL;
 	struct msm_vidc_inst_capability *capability;
 	struct msm_vidc_inst_capability *capability;
 
 
+	d_vpr_h("%s()\n", __func__);
 	if (!inst || !inst->capabilities) {
 	if (!inst || !inst->capabilities) {
 		d_vpr_e("%s: invalid params\n", __func__);
 		d_vpr_e("%s: invalid params\n", __func__);
 		return -EINVAL;
 		return -EINVAL;
 	}
 	}
-
 	capability = inst->capabilities;
 	capability = inst->capabilities;
 
 
 	for (i = 0; i < INST_CAP_MAX; i++) {
 	for (i = 0; i < INST_CAP_MAX; i++) {
@@ -727,21 +747,28 @@ int msm_vidc_set_u32(void *instance,
 {
 {
 	int rc = 0;
 	int rc = 0;
 	struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
 	struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
-	u32 hfi_value;
+	u32 hfi_value, hfi_payload;
 
 
 	if (!inst || !inst->capabilities) {
 	if (!inst || !inst->capabilities) {
 		d_vpr_e("%s: invalid params\n", __func__);
 		d_vpr_e("%s: invalid params\n", __func__);
 		return -EINVAL;
 		return -EINVAL;
 	}
 	}
 
 
-	rc = msm_vidc_v4l2_menu_to_hfi(inst, cap_id, &hfi_value);
-	if (rc)
-		return -EINVAL;
+	if (inst->capabilities->cap[cap_id].flags & CAP_FLAG_MENU) {
+		rc = msm_vidc_v4l2_menu_to_hfi(inst, cap_id, &hfi_value);
+		if (rc)
+			return -EINVAL;
+		hfi_payload = HFI_PAYLOAD_U32_ENUM;
+	} else {
+		hfi_value = inst->capabilities->cap[cap_id].value;
+		hfi_payload = HFI_PAYLOAD_U32;
+	}
 
 
 	rc = venus_hfi_session_property(inst,
 	rc = venus_hfi_session_property(inst,
 		inst->capabilities->cap[cap_id].hfi_id,
 		inst->capabilities->cap[cap_id].hfi_id,
-		HFI_HOST_FLAGS_NONE, HFI_PORT_NONE,
-		HFI_PAYLOAD_U32_ENUM,
+		HFI_HOST_FLAGS_NONE,
+		msm_vidc_get_port_info(inst, cap_id),
+		hfi_payload,
 		&hfi_value,
 		&hfi_value,
 		sizeof(u32));
 		sizeof(u32));
 	if (rc)
 	if (rc)
@@ -830,6 +857,7 @@ int msm_vidc_set_fw_list(struct msm_vidc_inst *inst)
 	struct msm_vidc_inst_capability *capability;
 	struct msm_vidc_inst_capability *capability;
 	struct msm_vidc_inst_cap_entry *curr_node = NULL, *tmp_node = NULL;
 	struct msm_vidc_inst_cap_entry *curr_node = NULL, *tmp_node = NULL;
 
 
+	d_vpr_h("%s()\n", __func__);
 	if (!inst || !inst->capabilities) {
 	if (!inst || !inst->capabilities) {
 		d_vpr_e("%s: invalid params\n", __func__);
 		d_vpr_e("%s: invalid params\n", __func__);
 		return -EINVAL;
 		return -EINVAL;
@@ -862,6 +890,15 @@ int msm_vidc_v4l2_menu_to_hfi(struct msm_vidc_inst *inst,
 	struct msm_vidc_inst_capability *capability = inst->capabilities;
 	struct msm_vidc_inst_capability *capability = inst->capabilities;
 
 
 	switch (capability->cap[cap_id].v4l2_id) {
 	switch (capability->cap[cap_id].v4l2_id) {
+	case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
+	case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
+	case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:
+	case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:
+	case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
+	case V4L2_CID_MPEG_VIDEO_HEVC_TIER:
+	case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_TYPES:
+		*value = capability->cap[cap_id].value;
+		return 0;
 	case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
 	case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
 		switch (capability->cap[cap_id].value) {
 		switch (capability->cap[cap_id].value) {
 		case V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC:
 		case V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC:
@@ -872,16 +909,64 @@ int msm_vidc_v4l2_menu_to_hfi(struct msm_vidc_inst *inst,
 			break;
 			break;
 		default:
 		default:
 			*value = 1;
 			*value = 1;
-			s_vpr_e(inst->sid,
-				"%s: invalid ctrl %d value %d, default value %u\n",
-				__func__, capability->cap[cap_id].v4l2_id,
-				capability->cap[cap_id].value, *value);
+			goto set_default;
 		}
 		}
-		break;
+		return 0;
+	case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
+		switch (capability->cap[cap_id].value) {
+		case V4L2_MPEG_VIDEO_BITRATE_MODE_VBR:
+			*value = HFI_RC_VBR_CFR;
+			break;
+		case V4L2_MPEG_VIDEO_BITRATE_MODE_CBR:
+			*value = HFI_RC_CBR_CFR;
+			break;
+		default:
+			*value = HFI_RC_VBR_CFR;
+			goto set_default;
+		}
+		return 0;
+	case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE:
+		switch (capability->cap[cap_id].value) {
+		case V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B:
+			*value = HFI_HIER_B;
+			break;
+		case V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P:
+			//TODO (AS): check if this is right mapping
+			*value = HFI_HIER_P_SLIDING_WINDOW;
+			break;
+		default:
+			*value = HFI_HIER_P_SLIDING_WINDOW;
+			goto set_default;
+		}
+		return 0;
+	case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
+		switch (capability->cap[cap_id].value) {
+		case V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE:
+			*value = BIT(HFI_SEQ_HEADER_SEPERATE_FRAME);
+			break;
+		case V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME:
+			*value = BIT(HFI_SEQ_HEADER_JOINED_WITH_1ST_FRAME);
+			break;
+		/*
+		 * TODO (AS): other HFI values are missing corresponding
+		 * V4l2 values. Add them once available.
+		 */
+		default:
+			*value = HFI_SEQ_HEADER_SEPERATE_FRAME;
+			goto set_default;
+		}
+		return 0;
 	default:
 	default:
 		s_vpr_e(inst->sid,
 		s_vpr_e(inst->sid,
-			"%s: invalid ctrl with cap_id %d\n", __func__, cap_id);
+			"%s: mapping not specified for ctrl_id: %#x\n",
+			__func__, capability->cap[cap_id].v4l2_id);
 		return -EINVAL;
 		return -EINVAL;
 	}
 	}
+
+set_default:
+	s_vpr_e(inst->sid,
+		"%s: invalid value %d for ctrl id: %#x. Set default: %u\n",
+		__func__, capability->cap[cap_id].value,
+		capability->cap[cap_id].v4l2_id, *value);
 	return 0;
 	return 0;
 }
 }

+ 27 - 3
driver/vidc/src/msm_vidc_vb2.c

@@ -6,11 +6,11 @@
 #include "msm_vidc_vb2.h"
 #include "msm_vidc_vb2.h"
 #include "msm_vidc_core.h"
 #include "msm_vidc_core.h"
 #include "msm_vidc_inst.h"
 #include "msm_vidc_inst.h"
-#include "msm_vidc_internal.h"
 #include "msm_vidc_driver.h"
 #include "msm_vidc_driver.h"
 #include "msm_vdec.h"
 #include "msm_vdec.h"
 #include "msm_venc.h"
 #include "msm_venc.h"
 #include "msm_vidc_debug.h"
 #include "msm_vidc_debug.h"
+#include "msm_vidc_control.h"
 
 
 void *msm_vb2_get_userptr(struct device *dev, unsigned long vaddr,
 void *msm_vb2_get_userptr(struct device *dev, unsigned long vaddr,
 			unsigned long size, enum dma_data_direction dma_dir)
 			unsigned long size, enum dma_data_direction dma_dir)
@@ -185,6 +185,19 @@ int msm_vidc_start_streaming(struct vb2_queue *q, unsigned int count)
 	}
 	}
 
 
 	/*
 	/*
+	if ((inst->state == MSM_VIDC_OPEN && q->type == OUTPUT_MPLANE) ||
+		inst->state == MSM_VIDC_START_INPUT) {
+		s_vpr_h(inst->sid, "$s: msm_vidc_adjust_properties\n");
+		rc = msm_vidc_adjust_properties(inst);
+		if (rc)
+			return -EINVAL;
+
+		s_vpr_h(inst->sid, "$s: msm_vidc_set_fw_list\n");
+		rc = msm_vidc_set_fw_list(inst);
+		if (rc)
+			return -EINVAL;
+	}
+
 	if (inst->state == MSM_VIDC_START_INPUT ||
 	if (inst->state == MSM_VIDC_START_INPUT ||
 		inst->state == MSM_VIDC_START_OUTPUT) {
 		inst->state == MSM_VIDC_START_OUTPUT) {
 		rc = msm_vidc_adjust_properties(inst);
 		rc = msm_vidc_adjust_properties(inst);
@@ -192,8 +205,8 @@ int msm_vidc_start_streaming(struct vb2_queue *q, unsigned int count)
 			return -EINVAL;
 			return -EINVAL;
 	}
 	}
 
 
-	if ((inst->state == MSM_VIDC_START_INPUT) ||
-		(inst->state == MSM_VIDC_START &&
+	if ((inst->state == MSM_VIDC_START_OUTPUT) ||
+		(inst->state == MSM_VIDC_OPEN &&
 		q->type == INPUT_MPLANE)) {
 		q->type == INPUT_MPLANE)) {
 		rc = msm_vidc_set_fw_list(inst);
 		rc = msm_vidc_set_fw_list(inst);
 		if (rc)
 		if (rc)
@@ -201,6 +214,17 @@ int msm_vidc_start_streaming(struct vb2_queue *q, unsigned int count)
 	}
 	}
 	*/
 	*/
 
 
+	if (inst->state == MSM_VIDC_START_INPUT ||
+		inst->state == MSM_VIDC_START_OUTPUT) {
+		rc = msm_vidc_adjust_properties(inst);
+		if (rc)
+			return -EINVAL;
+
+		rc = msm_vidc_set_fw_list(inst);
+		if (rc)
+			return -EINVAL;
+	}
+
 	if (q->type == INPUT_MPLANE) {
 	if (q->type == INPUT_MPLANE) {
 		if (is_decode_session(inst))
 		if (is_decode_session(inst))
 			rc = msm_vdec_start_input(inst);
 			rc = msm_vdec_start_input(inst);