Browse Source

video-driver: add to support DolbyVision metadata

1. add DolbyVision metadata cap and V4L2 id;
2. Increase decoder persist buffer size;
3. Increase decoder output meta buffer size;
4. Increase encoder input meta buffer size;
5. Parse buffer overflow flag and set buffer flag
   accordingly;

Change-Id: I8fa5e89068dd479033d28f627e585edc3a1c58bb
Signed-off-by: Zhongbo Shi <[email protected]>
Zhongbo Shi 3 năm trước cách đây
mục cha
commit
f781c619a9

+ 16 - 0
driver/platform/kalama/src/msm_vidc_kalama.c

@@ -1618,6 +1618,22 @@ static struct msm_platform_inst_capability instance_cap_data_kalama[] = {
 		HFI_PROP_SEI_HDR10PLUS_USERDATA,
 		CAP_FLAG_BITMASK},
 
+	{META_DOLBY_RPU, ENC, HEVC,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_TX_INPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_CID_MPEG_VIDC_METADATA_DOLBY_RPU,
+		HFI_PROP_DOLBY_RPU_METADATA,
+		CAP_FLAG_BITMASK},
+
+	{META_DOLBY_RPU, DEC, H264|HEVC,
+		V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_RX_OUTPUT,
+		0, V4L2_MPEG_VIDC_META_DISABLE,
+		V4L2_CID_MPEG_VIDC_METADATA_DOLBY_RPU,
+		HFI_PROP_DOLBY_RPU_METADATA,
+		CAP_FLAG_BITMASK},
+
 	{META_EVA_STATS, ENC, CODECS_ALL,
 		V4L2_MPEG_VIDC_META_DISABLE,
 		V4L2_MPEG_VIDC_META_ENABLE | V4L2_MPEG_VIDC_META_TX_INPUT,

+ 8 - 4
driver/variant/iris3/inc/hfi_buffer_iris3.h

@@ -514,10 +514,13 @@ typedef HFI_U32 HFI_BOOL;
 #define SIZE_SEI_USERDATA (4096)
 #define H264_NUM_FRM_INFO (66)
 #define H264_DISPLAY_BUF_SIZE (3328)
-#define HFI_BUFFER_PERSIST_H264D(_size) \
+#define SIZE_DOLBY_RPU_METADATA (41 * 1024)
+#define HFI_BUFFER_PERSIST_H264D(_size, rpu_enabled) \
 	_size = HFI_ALIGN((SIZE_SLIST_BUF_H264 * NUM_SLIST_BUF_H264 + \
 	H264_DISPLAY_BUF_SIZE * H264_NUM_FRM_INFO + \
-	NUM_HW_PIC_BUF * SIZE_SEI_USERDATA), VENUS_DMA_ALIGNMENT)
+	NUM_HW_PIC_BUF * SIZE_SEI_USERDATA + \
+	rpu_enabled * NUM_HW_PIC_BUF * SIZE_DOLBY_RPU_METADATA), \
+	VENUS_DMA_ALIGNMENT)
 
 #define LCU_MAX_SIZE_PELS 64
 #define LCU_MIN_SIZE_PELS 16
@@ -717,10 +720,11 @@ typedef HFI_U32 HFI_BOOL;
 #define H265_NUM_TILE (H265_NUM_TILE_ROW * H265_NUM_TILE_COL + 1)
 #define H265_NUM_FRM_INFO (48)
 #define H265_DISPLAY_BUF_SIZE (3072)
-#define HFI_BUFFER_PERSIST_H265D(_size) \
+#define HFI_BUFFER_PERSIST_H265D(_size, rpu_enabled) \
 	_size = HFI_ALIGN((SIZE_SLIST_BUF_H265 * NUM_SLIST_BUF_H265 + \
 	H265_NUM_FRM_INFO * H265_DISPLAY_BUF_SIZE + \
-	H265_NUM_TILE * sizeof(HFI_U32) + NUM_HW_PIC_BUF * SIZE_SEI_USERDATA),\
+	H265_NUM_TILE * sizeof(HFI_U32) + NUM_HW_PIC_BUF * SIZE_SEI_USERDATA + \
+	rpu_enabled * NUM_HW_PIC_BUF * SIZE_DOLBY_RPU_METADATA),\
 	VENUS_DMA_ALIGNMENT)
 
 #define SIZE_VPXD_LB_FE_LEFT_CTRL(frame_width, frame_height)   \

+ 6 - 2
driver/variant/iris3/src/msm_vidc_buffer_iris3.c

@@ -220,16 +220,20 @@ static u32 msm_vidc_decoder_partial_data_size_iris3(struct msm_vidc_inst *inst)
 static u32 msm_vidc_decoder_persist_size_iris3(struct msm_vidc_inst *inst)
 {
 	u32 size = 0;
+	u32 rpu_enabled = 0;
 
 	if (!inst) {
 		d_vpr_e("%s: invalid params\n", __func__);
 		return size;
 	}
 
+	if (inst->capabilities->cap[META_DOLBY_RPU].value)
+		rpu_enabled = 1;
+
 	if (inst->codec == MSM_VIDC_H264) {
-		HFI_BUFFER_PERSIST_H264D(size);
+		HFI_BUFFER_PERSIST_H264D(size, rpu_enabled);
 	} else if (inst->codec == MSM_VIDC_HEVC || inst->codec == MSM_VIDC_HEIC) {
-		HFI_BUFFER_PERSIST_H265D(size);
+		HFI_BUFFER_PERSIST_H265D(size, rpu_enabled);
 	} else if (inst->codec == MSM_VIDC_VP9) {
 		HFI_BUFFER_PERSIST_VP9D(size);
 	} else if (inst->codec == MSM_VIDC_AV1) {

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

@@ -563,6 +563,8 @@ enum hfi_saliency_type {
 
 #define HFI_PROP_TRANSCODING_STAT_INFO                          0x03000191
 
+#define HFI_PROP_DOLBY_RPU_METADATA                             0x03000192
+
 #define HFI_PROP_END                                            0x03FFFFFF
 
 #define HFI_SESSION_ERROR_BEGIN                                 0x04000000

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

@@ -384,6 +384,7 @@ enum msm_vidc_inst_capability_type {
 	META_ROI_INFO,
 	META_SALIENCY_INFO,
 	META_TRANSCODING_STAT_INFO,
+	META_DOLBY_RPU,
 	META_CAP_MAX,
 	/* end of metadata caps */
 	FRAME_WIDTH,

+ 11 - 1
driver/vidc/src/msm_vidc_buffer.c

@@ -287,7 +287,12 @@ u32 msm_vidc_decoder_input_meta_size(struct msm_vidc_inst *inst)
 
 u32 msm_vidc_decoder_output_meta_size(struct msm_vidc_inst *inst)
 {
-	return MSM_VIDC_METADATA_SIZE;
+	u32 size = MSM_VIDC_METADATA_SIZE;
+
+	if (inst->capabilities->cap[META_DOLBY_RPU].value)
+		size += MSM_VIDC_METADATA_DOLBY_RPU_SIZE;
+
+	return ALIGN(size, SZ_4K);
 }
 
 u32 msm_vidc_encoder_input_size(struct msm_vidc_inst *inst)
@@ -450,6 +455,11 @@ u32 msm_vidc_encoder_input_meta_size(struct msm_vidc_inst *inst)
 		size += ROI_METADATA_SIZE(width, height, lcu_size);
 		size = ALIGN(size, SZ_4K);
 	}
+
+	if (inst->capabilities->cap[META_DOLBY_RPU].value) {
+		size += MSM_VIDC_METADATA_DOLBY_RPU_SIZE;
+		size = ALIGN(size, SZ_4K);
+	}
 	return size;
 }
 

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

@@ -83,6 +83,7 @@ static const struct msm_vidc_cap_name cap_name_arr[] = {
 	{META_ROI_INFO,                  "META_ROI_INFO"              },
 	{META_SALIENCY_INFO,             "META_SALIENCY_INFO"         },
 	{META_TRANSCODING_STAT_INFO,     "META_TRANSCODING_STAT_INFO" },
+	{META_DOLBY_RPU,                 "META_DOLBY_RPU"             },
 	{META_CAP_MAX,                   "META_CAP_MAX"               },
 	{FRAME_WIDTH,                    "FRAME_WIDTH"                },
 	{LOSSLESS_FRAME_WIDTH,           "LOSSLESS_FRAME_WIDTH"       },

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

@@ -338,6 +338,10 @@ static int handle_session_info(struct msm_vidc_inst *inst,
 		info = "data corrupt";
 		inst->hfi_frame_info.data_corrupt = 1;
 		break;
+	case HFI_INFO_BUFFER_OVERFLOW:
+		info = "buffer overflow";
+		inst->hfi_frame_info.overflow = 1;
+		break;
 	default:
 		info = "unknown";
 		break;

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

@@ -262,6 +262,9 @@ enum v4l2_h264_encode_delivery_mode {
 #define V4L2_CID_MPEG_VIDC_RESERVE_DURATION                                  \
 	(V4L2_CID_MPEG_VIDC_BASE + 0x3F)
 
+#define V4L2_CID_MPEG_VIDC_METADATA_DOLBY_RPU                                 \
+	(V4L2_CID_MPEG_VIDC_BASE + 0x40)
+
 /* add new controls above this line */
 /* Deprecate below controls once availble in gki and gsi bionic header */
 #ifndef V4L2_CID_MPEG_VIDEO_BASELAYER_PRIORITY_ID
@@ -404,6 +407,7 @@ enum v4l2_mpeg_vidc_metadata {
 	METADATA_SALIENCY_INFO                = 0x0300018A,
 	METADATA_FENCE                        = 0x0300018B,
 	METADATA_TRANSCODING_STAT_INFO        = 0x03000191,
+	METADATA_DV_RPU                       = 0x03000192,
 };
 enum meta_interlace_info {
 	META_INTERLACE_INFO_NONE                            = 0x00000000,
@@ -460,5 +464,6 @@ struct v4l2_event_vidc_metadata {
 #define MSM_VIDC_METADATA_SIZE           (4 * 4096) /* 16 KB */
 #define ENCODE_INPUT_METADATA_SIZE       (512 * 4096) /* 2 MB */
 #define DECODE_INPUT_METADATA_SIZE       MSM_VIDC_METADATA_SIZE
+#define MSM_VIDC_METADATA_DOLBY_RPU_SIZE  (41 * 1024) /* 41 KB */
 
 #endif