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 <quic_zhongbos@quicinc.com>
This commit is contained in:
Zhongbo Shi
2022-05-10 10:51:42 +08:00
کامیت شده توسط Shi Zhongbo
والد 9ee0638b20
کامیت f781c619a9
9فایلهای تغییر یافته به همراه54 افزوده شده و 7 حذف شده

مشاهده پرونده

@@ -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,

مشاهده پرونده

@@ -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) \

مشاهده پرونده

@@ -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) {

مشاهده پرونده

@@ -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

مشاهده پرونده

@@ -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,

مشاهده پرونده

@@ -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;
}

مشاهده پرونده

@@ -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" },

مشاهده پرونده

@@ -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;