Bläddra i källkod

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 <[email protected]>
Mahesh Kumar Sharma 3 år sedan
förälder
incheckning
d1351838e3

+ 3 - 12
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,

+ 3 - 0
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);

+ 1 - 10
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,

+ 5 - 0
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_

+ 51 - 1
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;

+ 2 - 1
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

+ 6 - 6
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;
 		}
 	}