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:
@@ -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;
|
||||
|
مرجع در شماره جدید
Block a user