From d1351838e313a266130e7e738a3c6e8e7ef8ab0e Mon Sep 17 00:00:00 2001 From: Mahesh Kumar Sharma Date: Fri, 7 Jan 2022 13:24:44 -0800 Subject: [PATCH] video: driver: CBR and Blur handling enhancements This change is made to support 100ms VBV delay for aggressive rate control in iris3 hw. Video buffer verifer helps to ensure that encoded stream doesn't overflow or underflow the decoder's buffer. iris3 hw is capable to decode data in 100ms VBV buffer window. Adaptive Blur (Internal encoder feature): This is other enhancement which supports adaptive blur feature on iris3 for CBR_VFR (Constant bit rate_Variable frame rate)/CBR_CFR (Constant bit rate_Constant frame rate) rc types apart from already supported VBR_CFR. Unlike iris2, there is no need to enable CAC. Below are the listed scenarios when it is enabled/disabled on iris3- - Supported only for 8 bits encoding (H.264 & H.265). - By default enabled for VBR_CFR/CBR_VFR/CBR_CFR RC without CAC enabled. - No dependency on CAC to be enabled. - Adaptive Blur is disabled if minquality_VBR is enabled - Adaptive Blur is supported for 3 RC types: VBR_CFR, CBR_VFR & CBR_CFR - If any one of the features (scalar/external blur) enabled, encoder disables adaptive-blur. - Static property available to disable adaptive blur feature Below are the listed scenarios when it is enabled/disabled on iris2- - Supported only for 8 bits encoding (H.264 & H.265). - By default enabled for VBR_CFR RC type with CAC enabled. - Dependency on CAC to be enabled. - Adaptive Blur is disabled if CAC is disabled - Adaptive Blur is disabled if minquality_VBR is enabled - Adaptive Blur is not supported for any other RC types except: VBR_CFR - If any one of the features (scalar/external blur) enabled, encoder disables adaptive-blur. - Static property available to disable adaptive blur feature For backward compatibilty: - Removed CAC as parent from msm_vidc_kalama.c. - Removed cac query from msm_vidc_adjust_blur_type in msm_vidc_control.c. - Moved legacy code to newly created function msm_vidc_adjust_blur_type_iris2(). - Added msm_vidc_adjust_blur_type_iris2 in BLUR_TYPES in msm_vidc_waipio.c Change-Id: I49dec7e2574496d1b32babde55c0187866ca21d2 Signed-off-by: Mahesh Kumar Sharma --- driver/platform/kalama/src/msm_vidc_kalama.c | 15 ++---- driver/platform/waipio/inc/msm_vidc_waipio.h | 3 ++ driver/platform/waipio/src/msm_vidc_waipio.c | 11 +---- driver/variant/iris2/inc/msm_vidc_iris2.h | 5 ++ driver/variant/iris2/src/msm_vidc_iris2.c | 52 +++++++++++++++++++- driver/vidc/inc/msm_vidc_control.h | 3 +- driver/vidc/src/msm_vidc_control.c | 12 ++--- 7 files changed, 71 insertions(+), 30 deletions(-) diff --git a/driver/platform/kalama/src/msm_vidc_kalama.c b/driver/platform/kalama/src/msm_vidc_kalama.c index d04f32ccdc..51e5e386cd 100644 --- a/driver/platform/kalama/src/msm_vidc_kalama.c +++ b/driver/platform/kalama/src/msm_vidc_kalama.c @@ -478,21 +478,12 @@ static struct msm_platform_inst_capability instance_data_kalama[] = { {0}, msm_vidc_adjust_b_frame, msm_vidc_set_u32}, - {BLUR_TYPES, ENC, CODECS_ALL, - VIDC_BLUR_NONE, VIDC_BLUR_ADAPTIVE, 1, VIDC_BLUR_ADAPTIVE, - V4L2_CID_MPEG_VIDC_VIDEO_BLUR_TYPES, - HFI_PROP_BLUR_TYPES, - CAP_FLAG_OUTPUT_PORT, - {PIX_FMTS, BITRATE_MODE, CONTENT_ADAPTIVE_CODING}, - {BLUR_RESOLUTION}, - msm_vidc_adjust_blur_type, msm_vidc_set_u32_enum}, - {BLUR_TYPES, ENC, H264|HEVC, VIDC_BLUR_NONE, VIDC_BLUR_ADAPTIVE, 1, VIDC_BLUR_ADAPTIVE, V4L2_CID_MPEG_VIDC_VIDEO_BLUR_TYPES, HFI_PROP_BLUR_TYPES, CAP_FLAG_OUTPUT_PORT, - {PIX_FMTS, BITRATE_MODE, CONTENT_ADAPTIVE_CODING, MIN_QUALITY}, + {PIX_FMTS, BITRATE_MODE, MIN_QUALITY}, {BLUR_RESOLUTION}, msm_vidc_adjust_blur_type, msm_vidc_set_u32_enum}, @@ -608,7 +599,7 @@ static struct msm_platform_inst_capability instance_data_kalama[] = { HFI_PROP_CONTENT_ADAPTIVE_CODING, CAP_FLAG_OUTPUT_PORT, {BITRATE_MODE, MIN_QUALITY}, - {BLUR_TYPES}, + {0}, msm_vidc_adjust_cac, msm_vidc_set_vbr_related_properties}, @@ -644,7 +635,7 @@ static struct msm_platform_inst_capability instance_data_kalama[] = { msm_vidc_set_vbr_related_properties}, {VBV_DELAY, ENC, H264|HEVC, - 200, 300, 100, 300, + 100, 300, 100, 300, V4L2_CID_MPEG_VIDEO_VBV_DELAY, HFI_PROP_VBV_DELAY, CAP_FLAG_OUTPUT_PORT, diff --git a/driver/platform/waipio/inc/msm_vidc_waipio.h b/driver/platform/waipio/inc/msm_vidc_waipio.h index e934c144cb..bfea9a97e3 100644 --- a/driver/platform/waipio/inc/msm_vidc_waipio.h +++ b/driver/platform/waipio/inc/msm_vidc_waipio.h @@ -7,6 +7,9 @@ #define _MSM_VIDC_WAIPIO_H_ #include "msm_vidc_core.h" +#if defined(CONFIG_MSM_VIDC_IRIS2) +#include "msm_vidc_iris2.h" +#endif #if defined(CONFIG_MSM_VIDC_WAIPIO) int msm_vidc_init_platform_waipio(struct msm_vidc_core *core, struct device *dev); diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index 84ce225aaa..0c19f9fb3b 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/driver/platform/waipio/src/msm_vidc_waipio.c @@ -467,15 +467,6 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { {ALL_INTRA}, msm_vidc_adjust_b_frame, msm_vidc_set_u32}, - {BLUR_TYPES, ENC, CODECS_ALL, - VIDC_BLUR_NONE, VIDC_BLUR_ADAPTIVE, 1, VIDC_BLUR_ADAPTIVE, - V4L2_CID_MPEG_VIDC_VIDEO_BLUR_TYPES, - HFI_PROP_BLUR_TYPES, - CAP_FLAG_OUTPUT_PORT, - {PIX_FMTS, BITRATE_MODE, CONTENT_ADAPTIVE_CODING}, - {BLUR_RESOLUTION}, - msm_vidc_adjust_blur_type, msm_vidc_set_u32_enum}, - {BLUR_TYPES, ENC, H264|HEVC, VIDC_BLUR_NONE, VIDC_BLUR_ADAPTIVE, 1, VIDC_BLUR_ADAPTIVE, V4L2_CID_MPEG_VIDC_VIDEO_BLUR_TYPES, @@ -483,7 +474,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { CAP_FLAG_OUTPUT_PORT, {PIX_FMTS, BITRATE_MODE, CONTENT_ADAPTIVE_CODING, MIN_QUALITY}, {BLUR_RESOLUTION}, - msm_vidc_adjust_blur_type, msm_vidc_set_u32_enum}, + msm_vidc_adjust_blur_type_iris2, msm_vidc_set_u32_enum}, {BLUR_RESOLUTION, ENC, CODECS_ALL, 0, S32_MAX, 1, 0, diff --git a/driver/variant/iris2/inc/msm_vidc_iris2.h b/driver/variant/iris2/inc/msm_vidc_iris2.h index 1d0ee44d91..dd6034cba7 100644 --- a/driver/variant/iris2/inc/msm_vidc_iris2.h +++ b/driver/variant/iris2/inc/msm_vidc_iris2.h @@ -11,6 +11,7 @@ #if defined(CONFIG_MSM_VIDC_IRIS2) int msm_vidc_init_iris2(struct msm_vidc_core *core); int msm_vidc_deinit_iris2(struct msm_vidc_core *core); +int msm_vidc_adjust_blur_type_iris2(void *instance, struct v4l2_ctrl *ctrl); #else static inline int msm_vidc_init_iris2(struct msm_vidc_core *core) { @@ -20,6 +21,10 @@ static inline int msm_vidc_deinit_iris2(struct msm_vidc_core *core) { return -EINVAL; } +static inline int msm_vidc_adjust_blur_type_iris2(void *instance, struct v4l2_ctrl *ctrl) +{ + return -EINVAL; +} #endif #endif // _MSM_VIDC_IRIS2_H_ diff --git a/driver/variant/iris2/src/msm_vidc_iris2.c b/driver/variant/iris2/src/msm_vidc_iris2.c index 29a59e368b..07690dbe24 100644 --- a/driver/variant/iris2/src/msm_vidc_iris2.c +++ b/driver/variant/iris2/src/msm_vidc_iris2.c @@ -2,7 +2,6 @@ /* * Copyright (c) 2020-2021,, The Linux Foundation. All rights reserved. */ - #include "msm_vidc_iris2.h" #include "msm_vidc_buffer_iris2.h" #include "msm_vidc_power_iris2.h" @@ -15,6 +14,7 @@ #include "msm_vidc_internal.h" #include "msm_vidc_buffer.h" #include "msm_vidc_debug.h" +#include "msm_vidc_control.h" #define VIDEO_ARCH_LX 1 @@ -1079,6 +1079,56 @@ exit: return 0; } +int msm_vidc_adjust_blur_type_iris2(void *instance, struct v4l2_ctrl *ctrl) +{ + struct msm_vidc_inst_capability *capability; + s32 adjusted_value; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance; + s32 rc_type = -1, cac = -1; + s32 pix_fmts = -1, min_quality = -1; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + capability = inst->capabilities; + + adjusted_value = ctrl ? ctrl->val : + capability->cap[BLUR_TYPES].value; + + if (adjusted_value == VIDC_BLUR_NONE) + return 0; + + if (msm_vidc_get_parent_value(inst, BLUR_TYPES, BITRATE_MODE, + &rc_type, __func__) || + msm_vidc_get_parent_value(inst, BLUR_TYPES, + CONTENT_ADAPTIVE_CODING, &cac, __func__) || + msm_vidc_get_parent_value(inst, BLUR_TYPES, PIX_FMTS, + &pix_fmts, __func__) || + msm_vidc_get_parent_value(inst, BLUR_TYPES, MIN_QUALITY, + &min_quality, __func__)) + return -EINVAL; + + if (adjusted_value == VIDC_BLUR_EXTERNAL) { + if (is_scaling_enabled(inst) || min_quality) { + adjusted_value = VIDC_BLUR_NONE; + } + } else if (adjusted_value == VIDC_BLUR_ADAPTIVE) { + if (is_scaling_enabled(inst) || min_quality || + (rc_type != HFI_RC_VBR_CFR) || + !cac || + is_10bit_colorformat(pix_fmts)) { + adjusted_value = VIDC_BLUR_NONE; + } + } + + msm_vidc_update_cap_value(inst, BLUR_TYPES, + adjusted_value, __func__); + + return 0; +} + int msm_vidc_decide_quality_mode_iris2(struct msm_vidc_inst* inst) { struct msm_vidc_inst_capability* capability = NULL; diff --git a/driver/vidc/inc/msm_vidc_control.h b/driver/vidc/inc/msm_vidc_control.h index d85577fd10..60dc8b7a79 100644 --- a/driver/vidc/inc/msm_vidc_control.h +++ b/driver/vidc/inc/msm_vidc_control.h @@ -116,5 +116,6 @@ int msm_vidc_v4l2_to_hfi_enum(struct msm_vidc_inst *inst, enum msm_vidc_inst_capability_type cap_id, u32 *value); int msm_vidc_update_cap_value(struct msm_vidc_inst *inst, u32 cap, s32 adjusted_val, const char *func); - +int msm_vidc_get_parent_value(struct msm_vidc_inst* inst, u32 cap, u32 parent, + s32 *value, const char *func); #endif diff --git a/driver/vidc/src/msm_vidc_control.c b/driver/vidc/src/msm_vidc_control.c index 2547ab1946..eb426efe27 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/driver/vidc/src/msm_vidc_control.c @@ -365,7 +365,7 @@ int msm_vidc_update_cap_value(struct msm_vidc_inst *inst, u32 cap, return 0; } -static int msm_vidc_get_parent_value(struct msm_vidc_inst* inst, +int msm_vidc_get_parent_value(struct msm_vidc_inst* inst, u32 cap, u32 parent, s32 *value, const char *func) { int rc = 0; @@ -2031,7 +2031,7 @@ int msm_vidc_adjust_blur_type(void *instance, struct v4l2_ctrl *ctrl) struct msm_vidc_inst_capability *capability; s32 adjusted_value; struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance; - s32 rc_type = -1, cac = -1; + s32 rc_type = -1; s32 pix_fmts = -1, min_quality = -1; if (!inst || !inst->capabilities) { @@ -2048,8 +2048,6 @@ int msm_vidc_adjust_blur_type(void *instance, struct v4l2_ctrl *ctrl) if (msm_vidc_get_parent_value(inst, BLUR_TYPES, BITRATE_MODE, &rc_type, __func__) || - msm_vidc_get_parent_value(inst, BLUR_TYPES, - CONTENT_ADAPTIVE_CODING, &cac, __func__) || msm_vidc_get_parent_value(inst, BLUR_TYPES, PIX_FMTS, &pix_fmts, __func__) || msm_vidc_get_parent_value(inst, BLUR_TYPES, MIN_QUALITY, @@ -2062,8 +2060,10 @@ int msm_vidc_adjust_blur_type(void *instance, struct v4l2_ctrl *ctrl) } } else if (adjusted_value == VIDC_BLUR_ADAPTIVE) { if (is_scaling_enabled(inst) || min_quality || - (rc_type != HFI_RC_VBR_CFR) || - !cac || is_10bit_colorformat(pix_fmts)) { + (rc_type != HFI_RC_VBR_CFR && + rc_type != HFI_RC_CBR_CFR && + rc_type != HFI_RC_CBR_VFR) || + is_10bit_colorformat(pix_fmts)) { adjusted_value = VIDC_BLUR_NONE; } }