From d85f112d92eeabc000e0066bc2d06b0cc7eef819 Mon Sep 17 00:00:00 2001 From: Akshata Sahukar Date: Mon, 14 Mar 2022 14:41:57 -0700 Subject: [PATCH] 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 --- driver/platform/kalama/src/msm_vidc_kalama.c | 112 +++++++++--------- driver/platform/waipio/src/msm_vidc_waipio.c | 94 +++++++-------- driver/vidc/inc/msm_vidc_driver.h | 107 +++++++++++++---- driver/vidc/inc/msm_vidc_internal.h | 2 +- driver/vidc/src/msm_vdec.c | 28 +++-- driver/vidc/src/msm_venc.c | 54 +++++++-- driver/vidc/src/msm_vidc_control.c | 58 ++++++--- driver/vidc/src/msm_vidc_driver.c | 10 +- driver/vidc/src/venus_hfi.c | 2 +- driver/vidc/src/venus_hfi_response.c | 2 +- .../uapi/vidc/media/v4l2_vidc_extensions.h | 12 +- 11 files changed, 308 insertions(+), 173 deletions(-) diff --git a/driver/platform/kalama/src/msm_vidc_kalama.c b/driver/platform/kalama/src/msm_vidc_kalama.c index 12aed91f41..e471c242b0 100644 --- a/driver/platform/kalama/src/msm_vidc_kalama.c +++ b/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}, }; diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index 9ad8d93c66..a7cea9b34e 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/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}, }; diff --git a/driver/vidc/inc/msm_vidc_driver.h b/driver/vidc/inc/msm_vidc_driver.h index 0df8f601b0..427b200c59 100644 --- a/driver/vidc/inc/msm_vidc_driver.h +++ b/driver/vidc/inc/msm_vidc_driver.h @@ -8,6 +8,7 @@ #include #include +#include #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; } diff --git a/driver/vidc/inc/msm_vidc_internal.h b/driver/vidc/inc/msm_vidc_internal.h index 51f8235125..01dcc050be 100644 --- a/driver/vidc/inc/msm_vidc_internal.h +++ b/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, diff --git a/driver/vidc/src/msm_vdec.c b/driver/vidc/src/msm_vdec.c index d53e7049b3..ae291bb7be 100644 --- a/driver/vidc/src/msm_vdec.c +++ b/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 diff --git a/driver/vidc/src/msm_venc.c b/driver/vidc/src/msm_venc.c index d304316c99..6619efb6bd 100644 --- a/driver/vidc/src/msm_venc.c +++ b/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, diff --git a/driver/vidc/src/msm_vidc_control.c b/driver/vidc/src/msm_vidc_control.c index 58a7916e04..65a344a14e 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/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, diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index 6ff133c74f..8e58102328 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/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); diff --git a/driver/vidc/src/venus_hfi.c b/driver/vidc/src/venus_hfi.c index ebd82c96db..79ad1c9b01 100644 --- a/driver/vidc/src/venus_hfi.c +++ b/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, diff --git a/driver/vidc/src/venus_hfi_response.c b/driver/vidc/src/venus_hfi_response.c index 12bf81e170..70ea9bc326 100644 --- a/driver/vidc/src/venus_hfi_response.c +++ b/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); diff --git a/include/uapi/vidc/media/v4l2_vidc_extensions.h b/include/uapi/vidc/media/v4l2_vidc_extensions.h index 555a72f88b..0f3615d573 100644 --- a/include/uapi/vidc/media/v4l2_vidc_extensions.h +++ b/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 \