From 17addfbc6d516224f823dc01dccf312366f14d8b Mon Sep 17 00:00:00 2001 From: Akshata Sahukar Date: Mon, 22 Feb 2021 15:08:06 -0800 Subject: [PATCH] video: driver: add support to few properties Add support to below properties - HFI_PROP_MULTI_SLICE_BYTES_COUNT - HFI_PROP_MULTI_SLICE_MB_COUNT - HFI_PROP_CHROMA_QP_OFFSET - HFI_PROP_REQUEST_SYNC_FRAME Change-Id: I4cc62870756d058e7a7b15290f5d6797b3be243c Signed-off-by: Akshata Sahukar --- driver/platform/waipio/src/msm_vidc_waipio.c | 38 +++++---- driver/vidc/inc/hfi_property.h | 4 + driver/vidc/inc/msm_vidc_control.h | 6 ++ driver/vidc/inc/msm_vidc_internal.h | 2 +- driver/vidc/src/msm_vidc_control.c | 86 ++++++++++++++++++++ 5 files changed, 118 insertions(+), 18 deletions(-) diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index f7abd095e1..2d9775d55b 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/driver/platform/waipio/src/msm_vidc_waipio.c @@ -280,7 +280,9 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { 0, 0, 0, 0, V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME, HFI_PROP_REQUEST_SYNC_FRAME, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED}, + CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {0}, {0}, + NULL, msm_vidc_set_req_sync_frame}, /* Enc: Keeping CABAC and CAVLC as same bitrate. * Dec: there's no use of Bitrate cap @@ -920,20 +922,6 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { -6, 6, 1, 0, V4L2_CID_MPEG_VIDEO_HEVC_LF_BETA_OFFSET_DIV2}, - {SLICE_MAX_BYTES, ENC, H264|HEVC, - 1, MAX_BITRATE / DEFAULT_FPS / 8 / 10, - 1, MAX_BITRATE / DEFAULT_FPS / 8 / 10, - V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES, - HFI_PROP_MULTI_SLICE_BYTES_COUNT, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, - - {SLICE_MAX_MB, ENC, H264|HEVC, - 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, - HFI_PROP_MULTI_SLICE_MB_COUNT, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, - {SLICE_MODE, ENC, H264|HEVC, V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE, V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES, @@ -943,7 +931,21 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE, V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE, 0, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU}, + CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, + {0}, {0}, + NULL, msm_vidc_set_slice_count}, + + {SLICE_MAX_BYTES, ENC, H264|HEVC, + 1, INT_MAX, 1, INT_MAX, + V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_BYTES, + HFI_PROP_MULTI_SLICE_BYTES_COUNT, + CAP_FLAG_OUTPUT_PORT}, + + {SLICE_MAX_MB, ENC, H264|HEVC, + 1, INT_MAX, 1, INT_MAX, + V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MAX_MB, + HFI_PROP_MULTI_SLICE_MB_COUNT, + CAP_FLAG_OUTPUT_PORT}, // TODO: MB level RC - mapping {MB_RC, ENC, CODECS_ALL, @@ -967,7 +969,9 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { 1, MAX_CHROMA_QP_OFFSET, V4L2_CID_MPEG_VIDEO_H264_CHROMA_QP_INDEX_OFFSET, HFI_PROP_CHROMA_QP_OFFSET, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, + CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT, + {0}, {0}, + NULL, msm_vidc_set_chroma_qp_index_offset}, {DISPLAY_DELAY_ENABLE, DEC, CODECS_ALL, V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE, diff --git a/driver/vidc/inc/hfi_property.h b/driver/vidc/inc/hfi_property.h index f9aef26d60..a22f1594bd 100644 --- a/driver/vidc/inc/hfi_property.h +++ b/driver/vidc/inc/hfi_property.h @@ -283,6 +283,10 @@ enum hfi_layer_encoding_type { #define HFI_PROP_LAYER_COUNT 0x03000139 +enum hfi_chromaqp_offset_mode { + HFI_ADAPTIVE_CHROMAQP_OFFSET = 0x0, + HFI_FIXED_CHROMAQP_OFFSET = 0x1, +}; #define HFI_BITMASK_CHROMA_CB_OFFSET 0x0000ffff #define HFI_BITMASK_CHROMA_CR_OFFSET 0xffff0000 #define HFI_PROP_CHROMA_QP_OFFSET 0x0300013a diff --git a/driver/vidc/inc/msm_vidc_control.h b/driver/vidc/inc/msm_vidc_control.h index 874e061a59..ff525e0aa8 100644 --- a/driver/vidc/inc/msm_vidc_control.h +++ b/driver/vidc/inc/msm_vidc_control.h @@ -43,6 +43,12 @@ int msm_vidc_set_max_qp(void *instance, enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_frame_qp(void *instance, enum msm_vidc_inst_capability_type cap_id); +int msm_vidc_set_req_sync_frame(void *instance, + enum msm_vidc_inst_capability_type cap_id); +int msm_vidc_set_chroma_qp_index_offset(void *instance, + enum msm_vidc_inst_capability_type cap_id); +int msm_vidc_set_slice_count(void* instance, + enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_u32(void *instance, enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_u32_enum(void *instance, diff --git a/driver/vidc/inc/msm_vidc_internal.h b/driver/vidc/inc/msm_vidc_internal.h index 14948dcbb0..77f0bd2314 100644 --- a/driver/vidc/inc/msm_vidc_internal.h +++ b/driver/vidc/inc/msm_vidc_internal.h @@ -332,9 +332,9 @@ enum msm_vidc_inst_capability_type { LF_MODE, LF_ALPHA, LF_BETA, + SLICE_MODE, SLICE_MAX_BYTES, SLICE_MAX_MB, - SLICE_MODE, MB_RC, TRANSFORM_8X8, CHROMA_QP_INDEX_OFFSET, diff --git a/driver/vidc/src/msm_vidc_control.c b/driver/vidc/src/msm_vidc_control.c index 28c2782bde..60d990a06e 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/driver/vidc/src/msm_vidc_control.c @@ -1464,6 +1464,92 @@ int msm_vidc_set_frame_qp(void *instance, return rc; } +int msm_vidc_set_req_sync_frame(void *instance, + enum msm_vidc_inst_capability_type cap_id) +{ + int rc = 0; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance; + s32 prepend_spspps; + u32 hfi_value = 0; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + prepend_spspps = inst->capabilities->cap[PREPEND_SPSPPS_TO_IDR].value; + if (prepend_spspps) + hfi_value = HFI_SYNC_FRAME_REQUEST_WITH_PREFIX_SEQ_HDR; + else + hfi_value = HFI_SYNC_FRAME_REQUEST_WITHOUT_SEQ_HDR; + + rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM, + &hfi_value, sizeof(u32), __func__); + + return rc; +} + +int msm_vidc_set_chroma_qp_index_offset(void *instance, + enum msm_vidc_inst_capability_type cap_id) +{ + int rc = 0; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance; + u32 hfi_value = 0, chroma_qp_offset_mode = 0, chroma_qp = 0; + u32 offset = 12; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + if (inst->capabilities->cap[cap_id].flags & CAP_FLAG_CLIENT_SET) + chroma_qp_offset_mode = HFI_FIXED_CHROMAQP_OFFSET; + else + chroma_qp_offset_mode = HFI_ADAPTIVE_CHROMAQP_OFFSET; + + chroma_qp = inst->capabilities->cap[cap_id].value + offset; + hfi_value = chroma_qp_offset_mode | chroma_qp << 8 | chroma_qp << 16 ; + + rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_32_PACKED, + &hfi_value, sizeof(u32), __func__); + + return rc; +} + +int msm_vidc_set_slice_count(void* instance, + enum msm_vidc_inst_capability_type cap_id) +{ + int rc = 0; + struct msm_vidc_inst* inst = (struct msm_vidc_inst*)instance; + s32 slice_mode = -1; + u32 hfi_value = 0, set_cap_id = 0; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + slice_mode = inst->capabilities->cap[SLICE_MODE].value; + + if (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) { + i_vpr_l(inst, "%s: slice mode is: %u, ignore setting to fw\n", + __func__, slice_mode); + return 0; + } + if (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_MB) { + hfi_value = inst->capabilities->cap[SLICE_MAX_MB].value; + set_cap_id = SLICE_MAX_MB; + } else if (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES) { + hfi_value = inst->capabilities->cap[SLICE_MAX_BYTES].value; + set_cap_id = SLICE_MAX_BYTES; + } + + rc = msm_vidc_packetize_control(inst, set_cap_id, HFI_PAYLOAD_U32, + &hfi_value, sizeof(u32), __func__); + + return rc; +} + /* TODO int msm_vidc_set_flip(void *instance, enum msm_vidc_inst_capability_type cap_id)